definition"constrains" :: "[i, i] ==> i" (infixl‹co›60) where "A co B ≡ {F ∈ program. (∀act ∈ Acts(F). act``A⊆B) ∧ st_set(A)}"
― ‹the condition term‹st_set(A)› makes the definition slightly
stronger than the HOL one›
definition unless :: "[i, i] ==> i" (infixl‹unless›60) where "A unless B ≡ (A - B) co (A ∪ B)"
definition
stable :: "i==>i"where "stable(A) ≡ A co A"
definition
strongest_rhs :: "[i, i] ==> i"where "strongest_rhs(F, A) ≡∩({B ∈ Pow(state). F ∈ A co B})"
lemma Acts_type: "Acts(F)⊆Pow(state*state)" by (simp add: RawActs_type Acts_def)
lemma AllowedActs_type: "AllowedActs(F) ⊆ Pow(state*state)" by (simp add: RawAllowedActs_type AllowedActs_def)
text‹Needed in Behaviors› lemma ActsD: "[act ∈ Acts(F); <s,s'> ∈ act]==> s ∈ state ∧ s' ∈ state" by (blast dest: Acts_type [THEN subsetD])
lemma AllowedActsD: "[act ∈ AllowedActs(F); <s,s'> ∈ act]==> s ∈ state ∧ s' ∈ state" by (blast dest: AllowedActs_type [THEN subsetD])
subsection‹Simplification rules involving term‹state›, term‹Init›, term‹Acts›, and term‹AllowedActs››
text‹But are they really needed?›
lemma state_subset_is_Init_iff [iff]: "state ⊆ Init(F) ⟷ Init(F)=state" by (cut_tac F = F in Init_type, auto)
lemma Pow_state_times_state_is_subset_Acts_iff [iff]: "Pow(state*state) ⊆ Acts(F) ⟷ Acts(F)=Pow(state*state)" by (cut_tac F = F in Acts_type, auto)
lemma Pow_state_times_state_is_subset_AllowedActs_iff [iff]: "Pow(state*state) ⊆ AllowedActs(F) ⟷ AllowedActs(F)=Pow(state*state)" by (cut_tac F = F in AllowedActs_type, auto)
subsubsection‹Eliminating ‹∩ state› from expressions›
lemma Init_Int_state [simp]: "Init(F) ∩ state = Init(F)" by (cut_tac F = F in Init_type, blast)
lemma state_Int_Init [simp]: "state ∩ Init(F) = Init(F)" by (cut_tac F = F in Init_type, blast)
lemma Acts_Int_Pow_state_times_state [simp]: "Acts(F) ∩ Pow(state*state) = Acts(F)" by (cut_tac F = F in Acts_type, blast)
lemma state_times_state_Int_Acts [simp]: "Pow(state*state) ∩ Acts(F) = Acts(F)" by (cut_tac F = F in Acts_type, blast)
lemma AllowedActs_Int_Pow_state_times_state [simp]: "AllowedActs(F) ∩ Pow(state*state) = AllowedActs(F)" by (cut_tac F = F in AllowedActs_type, blast)
lemma state_times_state_Int_AllowedActs [simp]: "Pow(state*state) ∩ AllowedActs(F) = AllowedActs(F)" by (cut_tac F = F in AllowedActs_type, blast)
lemma def_prg_Init: "F ≡ mk_program (init,acts,allowed) ==> Init(F) = init ∩ state" by auto
lemma def_prg_Acts: "F ≡ mk_program (init,acts,allowed) ==> Acts(F) = cons(id(state), acts ∩ Pow(state*state))" by auto
lemma def_prg_AllowedActs: "F ≡ mk_program (init,acts,allowed) ==> AllowedActs(F) = cons(id(state), allowed ∩ Pow(state*state))" by auto
lemma def_prg_simps: "[F ≡ mk_program (init,acts,allowed)] ==> Init(F) = init ∩ state ∧ Acts(F) = cons(id(state), acts ∩ Pow(state*state)) ∧ AllowedActs(F) = cons(id(state), allowed ∩ Pow(state*state))" by auto
text‹An action is expanded only if a pair of states is being tested against it› lemma def_act_simp: "[act ≡ {<s,s'> ∈ A*B. P(s, s')}] ==> (<s,s'> ∈ act) ⟷ (<s,s'> ∈ A*B ∧ P(s, s'))" by auto
text‹A set is expanded only if an element is being tested against it› lemma def_set_simp: "A ≡ B ==> (x ∈ A) ⟷ (x ∈ B)" by auto
subsection‹The Constrains Operator›
lemma constrains_type: "A co B ⊆ program" by (force simp add: constrains_def)
lemma constrainsI: "[(∧act s s'. [act: Acts(F); <s,s'> ∈ act; s ∈ A]==> s' ∈ A'); F ∈ program; st_set(A)]==> F ∈ A co A'" by (force simp add: constrains_def)
lemma constrainsD: "F ∈ A co B ==>∀act ∈ Acts(F). act``A⊆B" by (force simp add: constrains_def)
lemma constrainsD2: "F ∈ A co B ==> F ∈ program ∧ st_set(A)" by (force simp add: constrains_def)
lemma constrains_empty [iff]: "F ∈ 0 co B ⟷ F ∈ program" by (force simp add: constrains_def st_set_def)
lemma constrains_empty2 [iff]: "(F ∈ A co 0) ⟷ (A=0 ∧ F ∈ program)" by (force simp add: constrains_def st_set_def)
lemma constrains_state [iff]: "(F ∈ state co B) ⟷ (state⊆B ∧ F ∈ program)" apply (cut_tac F = F in Acts_type) apply (force simp add: constrains_def st_set_def) done
lemma constrains_state2 [iff]: "F ∈ A co state ⟷ (F ∈ program ∧ st_set(A))" apply (cut_tac F = F in Acts_type) apply (force simp add: constrains_def st_set_def) done
text‹monotonic in 2nd argument› lemma constrains_weaken_R: "[F ∈ A co A'; A'⊆B']==> F ∈ A co B'" apply (unfold constrains_def, blast) done
text‹anti-monotonic in 1st argument› lemma constrains_weaken_L: "[F ∈ A co A'; B⊆A]==> F ∈ B co A'" apply (unfold constrains_def st_set_def, blast) done
lemma constrains_weaken: "[F ∈ A co A'; B⊆A; A'⊆B']==> F ∈ B co B'" apply (drule constrains_weaken_R) apply (drule_tac [2] constrains_weaken_L, blast+) done
subsection‹Constrains and Union›
lemma constrains_Un: "[F ∈ A co A'; F ∈ B co B']==> F ∈ (A ∪ B) co (A' ∪ B')" by (auto simp add: constrains_def st_set_def, force)
lemma constrains_UN: "[∧i. i ∈ I ==> F ∈ A(i) co A'(i); F ∈ program] ==> F ∈ (∪i ∈ I. A(i)) co (∪i ∈ I. A'(i))" by (force simp add: constrains_def st_set_def)
lemma constrains_Un_distrib: "(A ∪ B) co C = (A co C) ∩ (B co C)" by (force simp add: constrains_def st_set_def)
lemma constrains_UN_distrib: "i ∈ I ==> (∪i ∈ I. A(i)) co B = (∩i ∈ I. A(i) co B)" by (force simp add: constrains_def st_set_def)
subsection‹Constrains and Intersection›
lemma constrains_Int_distrib: "C co (A ∩ B) = (C co A) ∩ (C co B)" by (force simp add: constrains_def st_set_def)
lemma constrains_INT_distrib: "x ∈ I ==> A co (∩i ∈ I. B(i)) = (∩i ∈ I. A co B(i))" by (force simp add: constrains_def st_set_def)
lemma constrains_Int: "[F ∈ A co A'; F ∈ B co B']==> F ∈ (A ∩ B) co (A' ∩ B')" by (force simp add: constrains_def st_set_def)
lemma constrains_INT [rule_format]: "[∀i ∈ I. F ∈ A(i) co A'(i); F ∈ program] ==> F ∈ (∩i ∈ I. A(i)) co (∩i ∈ I. A'(i))" apply (case_tac "I=0") apply (simp add: Inter_def) apply (erule not_emptyE) apply (auto simp add: constrains_def st_set_def, blast) apply (drule bspec, assumption, force) done
(* The rule below simulates the HOL's one for (\<Inter>z. A i) co (\<Inter>z. B i) *) lemma constrains_All: "[∀z. F:{s ∈ state. P(s, z)} co {s ∈ state. Q(s, z)}; F ∈ program]==> F:{s ∈ state. ∀z. P(s, z)} co {s ∈ state. ∀z. Q(s, z)}" by (unfold constrains_def, blast)
lemma constrains_imp_subset: "[F ∈ A co A']==> A ⊆ A'" by (unfold constrains_def st_set_def, force)
text‹The reasoning is by subsets since "co" refers to single actions
only. So this rule isn't that useful.›
lemma constrains_trans: "[F ∈ A co B; F ∈ B co C]==> F ∈ A co C" by (unfold constrains_def st_set_def, auto, blast)
lemma constrains_cancel: "[F ∈ A co (A' ∪ B); F ∈ B co B']==> F ∈ A co (A' ∪ B')" apply (drule_tac A = B in constrains_imp_subset) apply (blast intro: constrains_weaken_R) done
subsection‹The Unless Operator›
lemma unless_type: "A unless B ⊆ program" by (force simp add: unless_def constrains_def)
lemma unlessI: "[F ∈ (A-B) co (A ∪ B)]==> F ∈ A unless B" unfolding unless_def apply (blast dest: constrainsD2) done
lemma unlessD: "F :A unless B ==> F ∈ (A-B) co (A ∪ B)" by (unfold unless_def, auto)
subsection‹The Operator term‹initially››
lemma initially_type: "initially(A) ⊆ program" by (unfold initially_def, blast)
lemma initiallyI: "[F ∈ program; Init(F)⊆A]==> F ∈ initially(A)" by (unfold initially_def, blast)
lemma stable_unless: "stable(A)= A unless 0" by (auto simp add: unless_def stable_def)
subsection‹Union and Intersection with term‹stable››
lemma stable_Un: "[F ∈ stable(A); F ∈ stable(A')]==> F ∈ stable(A ∪ A')" unfolding stable_def apply (blast intro: constrains_Un) done
lemma stable_UN: "[∧i. i∈I ==> F ∈ stable(A(i)); F ∈ program] ==> F ∈ stable (∪i ∈ I. A(i))" unfolding stable_def apply (blast intro: constrains_UN) done
lemma stable_Int: "[F ∈ stable(A); F ∈ stable(A')]==> F ∈ stable (A ∩ A')" unfolding stable_def apply (blast intro: constrains_Int) done
lemma stable_INT: "[∧i. i ∈ I ==> F ∈ stable(A(i)); F ∈ program] ==> F ∈ stable (∩i ∈ I. A(i))" unfolding stable_def apply (blast intro: constrains_INT) done
lemma stable_All: "[∀z. F ∈ stable({s ∈ state. P(s, z)}); F ∈ program] ==> F ∈ stable({s ∈ state. ∀z. P(s, z)})" unfolding stable_def apply (rule constrains_All, auto) done
lemma stable_constrains_Un: "[F ∈ stable(C); F ∈ A co (C ∪ A')]==> F ∈ (C ∪ A) co (C ∪ A')" apply (unfold stable_def constrains_def st_set_def, auto) apply (blast dest!: bspec) done
lemma stable_constrains_Int: "[F ∈ stable(C); F ∈ (C ∩ A) co A']==> F ∈ (C ∩ A) co (C ∩ A')" by (unfold stable_def constrains_def st_set_def, blast)
(* \<lbrakk>F \<in> stable(C); F \<in> (C \<inter> A) co A\<rbrakk> \<Longrightarrow> F \<in> stable(C \<inter> A) *) lemmas stable_constrains_stable = stable_constrains_Int [THEN stableI]
lemma invariantI: "[Init(F)⊆A; F ∈ stable(A)]==> F ∈ invariant(A)" unfolding invariant_def initially_def apply (frule stable_type [THEN subsetD], auto) done
lemma invariantD: "F ∈ invariant(A) ==> Init(F)⊆A ∧ F ∈ stable(A)" by (unfold invariant_def initially_def, auto)
lemma invariantD2: "F ∈ invariant(A) ==> F ∈ program ∧ st_set(A)" unfolding invariant_def apply (blast dest: stableD2) done
text‹Could also say term‹invariant(A) ∩ invariant(B) ⊆ invariant (A ∩ B)›› lemma invariant_Int: "[F ∈ invariant(A); F ∈ invariant(B)]==> F ∈ invariant(A ∩ B)" unfolding invariant_def initially_def apply (simp add: stable_Int, blast) done
subsection‹The Elimination Theorem›
(** The "free" m has become universally quantified! Shouldthepremisebe\<And>minsteadof\<forall>m?Wouldmakeitharder
to use in forward proof. **)
text‹The general case is easier to prove than the special case!› lemma"elimination": "[∀m ∈ M. F ∈ {s ∈ A. x(s) = m} co B(m); F ∈ program] ==> F ∈ {s ∈ A. x(s) ∈ M} co (∪m ∈ M. B(m))" by (auto simp add: constrains_def st_set_def, blast)
text‹As above, but for the special case of A=state› lemma elimination2: "[∀m ∈ M. F ∈ {s ∈ state. x(s) = m} co B(m); F ∈ program] ==> F:{s ∈ state. x(s) ∈ M} co (∪m ∈ M. B(m))" by (rule UNITY.elimination, auto)
subsection‹The Operator term‹strongest_rhs››
lemma constrains_strongest_rhs: "[F ∈ program; st_set(A)]==> F ∈ A co (strongest_rhs(F,A))" by (auto simp add: constrains_def strongest_rhs_def st_set_def
dest: Acts_type [THEN subsetD])
lemma strongest_rhs_is_strongest: "[F ∈ A co B; st_set(B)]==> strongest_rhs(F,A) ⊆ B" by (auto simp add: constrains_def strongest_rhs_def st_set_def)
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.