(* Title: HOL/HOLCF/IOA/Abstraction.thy Author: Olaf Müller *)
section‹Abstraction Theory -- tailored for I/O automata›
theory Abstraction imports LiveIOA begin
default_sort type
definition cex_abs :: "('s1 ==> 's2) ==> ('a, 's1) execution ==> ('a, 's2) execution" where"cex_abs f ex = (f (fst ex), Map (λ(a, t). (a, f t)) ⋅ (snd ex))"
text‹equals cex_abs on Sequences -- after ex2seq application› definition cex_absSeq :: "('s1 ==> 's2) ==> ('a option, 's1) transition Seq ==> ('a option, 's2)transition Seq" where"cex_absSeq f = (λs. Map (λ(s, a, t). (f s, a, f t)) ⋅ s)"
definition is_abstraction :: "('s1 ==> 's2) ==> ('a, 's1) ioa ==> ('a, 's2) ioa ==> bool" where"is_abstraction f C A ⟷ ((∀s ∈ starts_of C. f s ∈ starts_of A) ∧ (∀s t a. reachable C s ∧ s ←-a←-C→ t ⟶ f s ←-a←-A→ f t))"
definition weakeningIOA :: "('a, 's2) ioa ==> ('a, 's1) ioa ==> ('s1 ==> 's2) ==> bool" where"weakeningIOA A C h ⟷ (∀ex. ex ∈ executions C ⟶ cex_abs h ex ∈ executions A)"
definition temp_strengthening :: "('a, 's2) ioa_temp ==> ('a, 's1) ioa_temp ==> ('s1 ==> 's2) ==> bool" where"temp_strengthening Q P h ⟷ (∀ex. (cex_abs h ex ⊨!!! Q) ⟶ (ex ⊨!!! P))"
definition state_strengthening :: "('a, 's2) step_pred ==> ('a, 's1) step_pred ==>('s1 ==> 's2) ==> bool" where"state_strengthening Q P h ⟷ (∀s t a. Q (h s, a, h t) ⟶ P (s, a, t))"
(* thm about ex2seq which is not provable by induction as ex2seq is not continuous *) axiomatizationwhere
ex2seq_abs_cex: "ex2seq (cex_abs h ex) = cex_absSeq h (ex2seq ex)"
(* analog to the proved thm strength_Box - proof skipped as trivial *) axiomatizationwhere
weak_Box: "temp_weakening P Q h ==> temp_weakening (◻P) (◻Q) h"
(* analog to the proved thm strength_Next - proof skipped as trivial *) axiomatizationwhere
weak_Next: "temp_weakening P Q h ==> temp_weakening (◯P) (◯Q) h"
subsection‹‹cex_abs›\ lemma cex_abs_UU [simp]: "cex_abs f (s, UU) = (f s, UU)" by (simp add: cex_abs_def)
lemma cex_abs_nil [simp]: "cex_abs f (s,nil) = (f s, nil)" by (simp add: cex_abs_def)
lemma cex_abs_cons [simp]: "cex_abs f (s, (a, t) ↝ ex) = (f s, (a, f t) ↝ (snd (cex_abs f (t, ex))))" by (simp add: cex_abs_def)
subsection‹Lemmas›
lemma temp_weakening_def2: "temp_weakening Q P h ⟷ (∀ex. (ex ⊨!!! P) ⟶ (cex_abs h ex ⊨!!! Q))" apply (simp add: temp_weakening_def temp_strengthening_def NOT_def temp_sat_def satisfies_def) apply auto done
lemma state_weakening_def2: "state_weakening Q P h ⟷ (∀s t a. P (s, a, t) ⟶ Q (h s, a, h t))" apply (simp add: state_weakening_def state_strengthening_def NOT_def) apply auto done
subsection‹Abstraction Rules for Properties›
lemma exec_frag_abstraction [rule_format]: "is_abstraction h C A ==> ∀s. reachable C s ∧ is_exec_frag C (s, xs) ⟶ is_exec_frag A (cex_abs h (s, xs))" apply (simp add: cex_abs_def) apply (pair_induct xs simp: is_exec_frag_def) txt‹main case› apply (auto dest: reachable.reachable_n simp add: is_abstraction_def) done
lemma abs_is_weakening: "is_abstraction h C A ==> weakeningIOA A C h" apply (simp add: weakeningIOA_def) apply auto apply (simp add: executions_def) txt‹start state› apply (rule conjI) apply (simp add: is_abstraction_def cex_abs_def) txt‹is-execution-fragment› apply (erule exec_frag_abstraction) apply (simp add: reachable.reachable_0) done
lemma AbsRuleT1: "is_abstraction h C A ==> validIOA A Q ==> temp_strengthening Q P h ==> validIOA C P" apply (drule abs_is_weakening) apply (simp add: weakeningIOA_def validIOA_def temp_strengthening_def) apply (auto simp add: split_paired_all) done
lemma AbsRuleT2: "is_live_abstraction h (C, L) (A, M) ==> validLIOA (A, M) Q ==> temp_strengthening Q P h ==> validLIOA (C, L) P" apply (unfold is_live_abstraction_def) apply auto apply (drule abs_is_weakening) apply (simp add: weakeningIOA_def temp_weakening_def2 validLIOA_def validIOA_def temp_strengthening_def) apply (auto simp add: split_paired_all) done
lemma AbsRuleTImprove: "is_live_abstraction h (C, L) (A, M) ==> validLIOA (A,M) (H1 🪙⟶ Q) ==> temp_strengthening Q P h ==> temp_weakening H1 H2 h ==> validLIOA (C, L) H2 ==> validLIOA (C, L) P" apply (unfold is_live_abstraction_def) apply auto apply (drule abs_is_weakening) apply (simp add: weakeningIOA_def temp_weakening_def2 validLIOA_def validIOA_def temp_strengthening_def) apply (auto simp add: split_paired_all) done
subsection‹Correctness of safe abstraction›
lemma abstraction_is_ref_map: "is_abstraction h C A ==> is_ref_map h C A" apply (auto simp: is_abstraction_def is_ref_map_def) apply (rule_tac x = "(a,h t) ↝nil"in exI) apply (simp add: move_def) done
lemma abs_safety: "inp C = inp A ==> out C = out A ==> is_abstraction h C A ==> C =<| A" apply (simp add: ioa_implements_def) apply (rule trace_inclusion) apply (simp (no_asm) add: externals_def) apply (auto)[1] apply (erule abstraction_is_ref_map) done
subsection‹Correctness of life abstraction›
text‹ Reduces to ‹Filter (Map fst x) = Filter (Map fst (Map (λ(a, t). (a, x)) x)›,
that isto special Map Lemma. › lemma traces_coincide_abs: "ext C = ext A ==> mk_trace C ⋅ xs = mk_trace A ⋅ (snd (cex_abs f (s, xs)))" apply (unfold cex_abs_def mk_trace_def filter_act_def) apply simp apply (pair_induct xs) done
text‹ Does not work with ‹abstraction_is_ref_map› a ‹is_live_abstraction›includes‹temp_strengthening› which is necessarily based
on ‹cex_abs›and not on ‹corresp_ex›. Thus, the proofis redone in a more specific
way for‹cex_abs›. › lemma abs_liveness: "inp C = inp A ==> out C = out A ==> is_live_abstraction h (C, M) (A, L) ==> live_implements (C, M) (A, L)" apply (simp add: is_live_abstraction_def live_implements_def livetraces_def liveexecutions_def) apply auto apply (rule_tac x = "cex_abs h ex"in exI) apply auto text‹Traces coincide› apply (pair ex) apply (rule traces_coincide_abs) apply (simp (no_asm) add: externals_def) apply (auto)[1]
lemma AbsRuleA1: "inp C = inp A ==> out C = out A ==> inp Q = inp P ==> out Q = out P ==> is_abstraction h1 C A ==> A =<| Q ==> is_abstraction h2 Q P ==> C =<| P" apply (drule abs_safety) apply assumption+ apply (drule abs_safety) apply assumption+ apply (erule implements_trans) apply (erule implements_trans) apply assumption done
lemma AbsRuleA2: "inp C = inp A ==> out C = out A ==> inp Q = inp P ==> out Q = out P ==> is_live_abstraction h1 (C, LC) (A, LA) ==> live_implements (A, LA) (Q, LQ) ==> is_live_abstraction h2 (Q, LQ) (P, LP) ==> live_implements (C, LC) (P, LP)" apply (drule abs_liveness) apply assumption+ apply (drule abs_liveness) apply assumption+ apply (erule live_implements_trans) apply (erule live_implements_trans) apply assumption done
declare split_paired_All [simp del]
subsection‹Localizing Temporal Strengthenings and Weakenings›
lemma strength_AND: "temp_strengthening P1 Q1 h ==> temp_strengthening P2 Q2 h ==> temp_strengthening (P1 🪙∧ P2) (Q1 🪙∧ Q2) h" by (auto simp: temp_strengthening_def)
lemma strength_OR: "temp_strengthening P1 Q1 h ==> temp_strengthening P2 Q2 h ==> temp_strengthening (P1 🪙∨ P2) (Q1 🪙∨ Q2) h" by (auto simp: temp_strengthening_def)
lemma strength_NOT: "temp_weakening P Q h ==> temp_strengthening (🪙¬ P) (🪙¬ Q) h" by (auto simp: temp_weakening_def2 temp_strengthening_def)
lemma strength_IMPLIES: "temp_weakening P1 Q1 h ==> temp_strengthening P2 Q2 h ==> temp_strengthening (P1 🪙⟶ P2) (Q1 🪙⟶ Q2) h" by (simp add: temp_weakening_def2 temp_strengthening_def)
lemma weak_AND: "temp_weakening P1 Q1 h ==> temp_weakening P2 Q2 h ==> temp_weakening (P1 🪙∧ P2) (Q1 🪙∧ Q2) h" by (simp add: temp_weakening_def2)
lemma weak_OR: "temp_weakening P1 Q1 h ==> temp_weakening P2 Q2 h ==> temp_weakening (P1 🪙∨ P2) (Q1 🪙∨ Q2) h" by (simp add: temp_weakening_def2)
lemma weak_NOT: "temp_strengthening P Q h ==> temp_weakening (🪙¬ P) (🪙¬ Q) h" by (auto simp add: temp_weakening_def2 temp_strengthening_def)
lemma weak_IMPLIES: "temp_strengthening P1 Q1 h ==> temp_weakening P2 Q2 h ==> temp_weakening (P1 🪙⟶ P2) (Q1 🪙⟶ Q2) h" by (simp add: temp_weakening_def2 temp_strengthening_def)
subsubsection ‹Box›
(* FIXME: should be same as nil_is_Conc2 when all nils are turned to right side! *) lemma UU_is_Conc: "(UU = x @@ y) = (((x::'a Seq)= UU) | (x = nil ∧ y = UU))" by (Seq_case_simp x)
(* important property of ex2seq: can be shiftet, as defined "pointwise" *) lemma ex2seq_tsuffix: "tsuffix s (ex2seq ex) ==>∃ex'. s = (ex2seq ex')" apply (unfold tsuffix_def suffix_def) apply auto apply (drule ex2seqConc) apply auto done
(*important property of cex_absSeq: As it is a 1to1 correspondence, properties carry over *) lemma cex_absSeq_tsuffix: "tsuffix s t ==> tsuffix (cex_absSeq h s) (cex_absSeq h t)" apply (unfold tsuffix_def suffix_def cex_absSeq_def) apply auto apply (simp add: Mapnil) apply (simp add: MapUU) apply (rule_tac x = "Map (% (s,a,t) . (h s,a, h t))⋅s1"in exI) apply (simp add: Map2Finite MapConc) done
(*important property of cex_absSeq: As it is a 1to1 correspondence, properties carry over*) lemma cex_absSeq_TL: "cex_absSeq h (TL ⋅ s) = TL ⋅ (cex_absSeq h s)" by (simp add: MapTL cex_absSeq_def)
(* important property of ex2seq: can be shiftet, as defined "pointwise" *) lemma TLex2seq: "snd ex ≠ UU ==> snd ex ≠ nil ==>∃ex'. TL⋅(ex2seq ex) = ex2seq ex'" apply (pair ex) apply (Seq_case_simp x2) apply (pair a) apply auto done
lemma ex2seqnilTL: "TL ⋅ (ex2seq ex) ≠ nil ⟷ snd ex ≠ nil ∧ snd ex ≠ UU" apply (pair ex) apply (Seq_case_simp x2) apply (pair a) apply (Seq_case_simp s) apply (pair a) done
ML ‹ fun abstraction_tac ctxt = SELECT_GOAL (auto_tac (ctxt addSIs @{thms weak_strength_lemmas} addsimps [@{thm state_strengthening_def}, @{thm state_weakening_def}])) ›
method_setup abstraction = ‹Scan.succeed (SIMPLE_METHOD' o abstraction_tac)›
end
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.63Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-04-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.