(* Title: ZF/UNITY/UNITY.thy Author: Sidi O Ehmety, Computer Laboratory Copyright 2001 University of Cambridge *)
section‹The Basic UNITY Theory›
theory UNITY imports State begin
text‹The basic UNITY theory (revised version, based upon the "co" operator) From Misra, "A Logic for Concurrent Programming", 1994. This ZF theory was ported from its HOL equivalent.›
definition
program :: i where "program ≡ {: Pow(state) * Pow(Pow(state*state)) * Pow(Pow(state*state)). id(state) ∈ acts ∧ id(state) ∈ allowed}"
definition
mk_program :: "[i,i,i]==>i"where 🍋‹The definition yields a program thanks to the coercions init ∩ state, acts ∩ Pow(state*state), etc.› "mk_program(init, acts, allowed) ≡ ∩ state, cons(id(state), acts ∩ Pow(state*state)), cons(id(state), allowed ∩ Pow(state*state))>"
definition
SKIP :: i (‹⊥›) where "SKIP ≡ mk_program(state, 0, Pow(state*state))"
(* Coercion from anything to program *) definition
programify :: "i==>i"where "programify(F) ≡ if F ∈ program then F else SKIP"
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 🍋‹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 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 ≡ {∈ A*B. P(s, s')}] ==> (∈ act) ⟷ (∈ 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); ∈ 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)
lemma stable_unless: "stable(A)= A unless 0" by (auto simp add: unless_def stable_def)
subsection‹Union and Intersection with 🍋‹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 🍋‹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! Should the premise be ∧m instead of ∀m ? Would make it harder 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 🍋‹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)
ML ‹ fun simp_of_act def = def RS @{thm def_act_simp}; fun simp_of_set def = def RS @{thm def_set_simp}; ›
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-04-26)
¤
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.