| author | huffman | 
| Wed, 17 Nov 2010 11:07:02 -0800 | |
| changeset 40619 | 84edf7177d73 | 
| parent 32960 | 69916a850301 | 
| child 45602 | 2a858377c3d2 | 
| permissions | -rw-r--r-- | 
| 11479 | 1 | (* Title: ZF/UNITY/FP.thy | 
| 2 | Author: Sidi O Ehmety, Computer Laboratory | |
| 3 | Copyright 2001 University of Cambridge | |
| 4 | ||
| 5 | From Misra, "A Logic for Concurrent Programming", 1994 | |
| 6 | ||
| 7 | Theory ported from HOL. | |
| 8 | *) | |
| 9 | ||
| 14092 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 10 | header{*Fixed Point of a Program*}
 | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 11 | |
| 16417 | 12 | theory FP imports UNITY begin | 
| 11479 | 13 | |
| 24893 | 14 | definition | 
| 15 | FP_Orig :: "i=>i" where | |
| 14092 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 16 |     "FP_Orig(F) == Union({A \<in> Pow(state). \<forall>B. F \<in> stable(A Int B)})"
 | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 17 | |
| 24893 | 18 | definition | 
| 19 | FP :: "i=>i" where | |
| 14092 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 20 |     "FP(F) == {s\<in>state. F \<in> stable({s})}"
 | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 21 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 22 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 23 | lemma FP_Orig_type: "FP_Orig(F) \<subseteq> state" | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 24 | by (unfold FP_Orig_def, blast) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 25 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 26 | lemma st_set_FP_Orig [iff]: "st_set(FP_Orig(F))" | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 27 | apply (unfold st_set_def) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 28 | apply (rule FP_Orig_type) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 29 | done | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 30 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 31 | lemma FP_type: "FP(F) \<subseteq> state" | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 32 | by (unfold FP_def, blast) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 33 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 34 | lemma st_set_FP [iff]: "st_set(FP(F))" | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 35 | apply (unfold st_set_def) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 36 | apply (rule FP_type) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 37 | done | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 38 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 39 | lemma stable_FP_Orig_Int: "F \<in> program ==> F \<in> stable(FP_Orig(F) Int B)" | 
| 15481 | 40 | apply (simp only: FP_Orig_def stable_def Int_Union2) | 
| 14092 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 41 | apply (blast intro: constrains_UN) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 42 | done | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 43 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 44 | lemma FP_Orig_weakest2: | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 45 | "[| \<forall>B. F \<in> stable (A Int B); st_set(A) |] ==> A \<subseteq> FP_Orig(F)" | 
| 15481 | 46 | by (unfold FP_Orig_def stable_def st_set_def, blast) | 
| 14092 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 47 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 48 | lemmas FP_Orig_weakest = allI [THEN FP_Orig_weakest2, standard] | 
| 11479 | 49 | |
| 14092 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 50 | lemma stable_FP_Int: "F \<in> program ==> F \<in> stable (FP(F) Int B)" | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 51 | apply (subgoal_tac "FP (F) Int B = (\<Union>x\<in>B. FP (F) Int {x}) ")
 | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 52 | prefer 2 apply blast | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 53 | apply (simp (no_asm_simp) add: Int_cons_right) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 54 | apply (unfold FP_def stable_def) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 55 | apply (rule constrains_UN) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 56 | apply (auto simp add: cons_absorb) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 57 | done | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 58 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 59 | lemma FP_subset_FP_Orig: "F \<in> program ==> FP(F) \<subseteq> FP_Orig(F)" | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 60 | by (rule stable_FP_Int [THEN FP_Orig_weakest], auto) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 61 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 62 | lemma FP_Orig_subset_FP: "F \<in> program ==> FP_Orig(F) \<subseteq> FP(F)" | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 63 | apply (unfold FP_Orig_def FP_def, clarify) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 64 | apply (drule_tac x = "{x}" in spec)
 | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 65 | apply (simp add: Int_cons_right) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 66 | apply (frule stableD2) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 67 | apply (auto simp add: cons_absorb st_set_def) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 68 | done | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 69 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 70 | lemma FP_equivalence: "F \<in> program ==> FP(F) = FP_Orig(F)" | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 71 | by (blast intro!: FP_Orig_subset_FP FP_subset_FP_Orig) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 72 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 73 | lemma FP_weakest [rule_format]: | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 74 | "[| \<forall>B. F \<in> stable(A Int B); F \<in> program; st_set(A) |] ==> A \<subseteq> FP(F)" | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 75 | by (simp add: FP_equivalence FP_Orig_weakest) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 76 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 77 | |
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 78 | lemma Diff_FP: | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 79 | "[| F \<in> program; st_set(A) |] | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 80 |       ==> A-FP(F) = (\<Union>act \<in> Acts(F). A - {s \<in> state. act``{s} \<subseteq> {s}})"
 | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 81 | by (unfold FP_def stable_def constrains_def st_set_def, blast) | 
| 
68da54626309
Conversion of ZF/UNITY/{FP,Union} to Isar script.
 paulson parents: 
12195diff
changeset | 82 | |
| 11479 | 83 | end |