| author | haftmann | 
| Sat, 03 Sep 2011 17:56:33 +0200 | |
| changeset 44687 | 20deab90494e | 
| parent 44563 | 01b2732cf4ad | 
| child 45970 | b6d0cff57d96 | 
| permissions | -rw-r--r-- | 
| 31807 | 1 | |
| 2 | (* Author: Florian Haftmann, TU Muenchen *) | |
| 3 | ||
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 4 | header {* A dedicated set type which is executable on its finite part *}
 | 
| 31807 | 5 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 6 | theory Cset | 
| 37024 
e938a0b5286e
renamed List_Set to the now more appropriate More_Set
 haftmann parents: 
37023diff
changeset | 7 | imports More_Set More_List | 
| 31807 | 8 | begin | 
| 9 | ||
| 10 | subsection {* Lifting *}
 | |
| 11 | ||
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 12 | typedef (open) 'a set = "UNIV :: 'a set set" | 
| 44555 | 13 | morphisms set_of Set by rule+ | 
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 14 | hide_type (open) set | 
| 31807 | 15 | |
| 44555 | 16 | lemma set_of_Set [simp]: | 
| 17 | "set_of (Set A) = A" | |
| 18 | by (rule Set_inverse) rule | |
| 19 | ||
| 20 | lemma Set_set_of [simp]: | |
| 21 | "Set (set_of A) = A" | |
| 22 | by (fact set_of_inverse) | |
| 23 | ||
| 24 | definition member :: "'a Cset.set \<Rightarrow> 'a \<Rightarrow> bool" where | |
| 25 | "member A x \<longleftrightarrow> x \<in> set_of A" | |
| 26 | ||
| 27 | lemma member_set_of: | |
| 28 | "set_of = member" | |
| 29 | by (rule ext)+ (simp add: member_def mem_def) | |
| 30 | ||
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 31 | lemma member_Set [simp]: | 
| 44555 | 32 | "member (Set A) x \<longleftrightarrow> x \<in> A" | 
| 33 | by (simp add: member_def) | |
| 37468 | 34 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 35 | lemma Set_inject [simp]: | 
| 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 36 | "Set A = Set B \<longleftrightarrow> A = B" | 
| 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 37 | by (simp add: Set_inject) | 
| 37468 | 38 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 39 | lemma set_eq_iff: | 
| 39380 
5a2662c1e44a
established emerging canonical names *_eqI and *_eq_iff
 haftmann parents: 
39302diff
changeset | 40 | "A = B \<longleftrightarrow> member A = member B" | 
| 44555 | 41 | by (auto simp add: fun_eq_iff set_of_inject [symmetric] member_def mem_def) | 
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 42 | hide_fact (open) set_eq_iff | 
| 39380 
5a2662c1e44a
established emerging canonical names *_eqI and *_eq_iff
 haftmann parents: 
39302diff
changeset | 43 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 44 | lemma set_eqI: | 
| 37473 | 45 | "member A = member B \<Longrightarrow> A = B" | 
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 46 | by (simp add: Cset.set_eq_iff) | 
| 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 47 | hide_fact (open) set_eqI | 
| 37473 | 48 | |
| 34048 | 49 | subsection {* Lattice instantiation *}
 | 
| 50 | ||
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 51 | instantiation Cset.set :: (type) boolean_algebra | 
| 34048 | 52 | begin | 
| 53 | ||
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 54 | definition less_eq_set :: "'a Cset.set \<Rightarrow> 'a Cset.set \<Rightarrow> bool" where | 
| 44555 | 55 | [simp]: "A \<le> B \<longleftrightarrow> set_of A \<subseteq> set_of B" | 
| 34048 | 56 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 57 | definition less_set :: "'a Cset.set \<Rightarrow> 'a Cset.set \<Rightarrow> bool" where | 
| 44555 | 58 | [simp]: "A < B \<longleftrightarrow> set_of A \<subset> set_of B" | 
| 34048 | 59 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 60 | definition inf_set :: "'a Cset.set \<Rightarrow> 'a Cset.set \<Rightarrow> 'a Cset.set" where | 
| 44555 | 61 | [simp]: "inf A B = Set (set_of A \<inter> set_of B)" | 
| 34048 | 62 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 63 | definition sup_set :: "'a Cset.set \<Rightarrow> 'a Cset.set \<Rightarrow> 'a Cset.set" where | 
| 44555 | 64 | [simp]: "sup A B = Set (set_of A \<union> set_of B)" | 
| 34048 | 65 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 66 | definition bot_set :: "'a Cset.set" where | 
| 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 67 |   [simp]: "bot = Set {}"
 | 
| 34048 | 68 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 69 | definition top_set :: "'a Cset.set" where | 
| 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 70 | [simp]: "top = Set UNIV" | 
| 34048 | 71 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 72 | definition uminus_set :: "'a Cset.set \<Rightarrow> 'a Cset.set" where | 
| 44555 | 73 | [simp]: "- A = Set (- (set_of A))" | 
| 34048 | 74 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 75 | definition minus_set :: "'a Cset.set \<Rightarrow> 'a Cset.set \<Rightarrow> 'a Cset.set" where | 
| 44555 | 76 | [simp]: "A - B = Set (set_of A - set_of B)" | 
| 34048 | 77 | |
| 78 | instance proof | |
| 44555 | 79 | qed (auto intro!: Cset.set_eqI simp add: member_def mem_def) | 
| 34048 | 80 | |
| 81 | end | |
| 82 | ||
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 83 | instantiation Cset.set :: (type) complete_lattice | 
| 34048 | 84 | begin | 
| 85 | ||
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 86 | definition Inf_set :: "'a Cset.set set \<Rightarrow> 'a Cset.set" where | 
| 44555 | 87 | [simp]: "Inf_set As = Set (Inf (image set_of As))" | 
| 34048 | 88 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 89 | definition Sup_set :: "'a Cset.set set \<Rightarrow> 'a Cset.set" where | 
| 44555 | 90 | [simp]: "Sup_set As = Set (Sup (image set_of As))" | 
| 34048 | 91 | |
| 92 | instance proof | |
| 44555 | 93 | qed (auto simp add: le_fun_def) | 
| 34048 | 94 | |
| 95 | end | |
| 96 | ||
| 44555 | 97 | instance Cset.set :: (type) complete_boolean_algebra proof | 
| 98 | qed (unfold INF_def SUP_def, auto) | |
| 99 | ||
| 37023 | 100 | |
| 31807 | 101 | subsection {* Basic operations *}
 | 
| 102 | ||
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 103 | abbreviation empty :: "'a Cset.set" where "empty \<equiv> bot" | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 104 | hide_const (open) empty | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 105 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 106 | abbreviation UNIV :: "'a Cset.set" where "UNIV \<equiv> top" | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 107 | hide_const (open) UNIV | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 108 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 109 | definition is_empty :: "'a Cset.set \<Rightarrow> bool" where | 
| 44555 | 110 | [simp]: "is_empty A \<longleftrightarrow> More_Set.is_empty (set_of A)" | 
| 31807 | 111 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 112 | definition insert :: "'a \<Rightarrow> 'a Cset.set \<Rightarrow> 'a Cset.set" where | 
| 44555 | 113 | [simp]: "insert x A = Set (Set.insert x (set_of A))" | 
| 31807 | 114 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 115 | definition remove :: "'a \<Rightarrow> 'a Cset.set \<Rightarrow> 'a Cset.set" where | 
| 44555 | 116 | [simp]: "remove x A = Set (More_Set.remove x (set_of A))" | 
| 31807 | 117 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 118 | definition map :: "('a \<Rightarrow> 'b) \<Rightarrow> 'a Cset.set \<Rightarrow> 'b Cset.set" where
 | 
| 44555 | 119 | [simp]: "map f A = Set (image f (set_of A))" | 
| 31807 | 120 | |
| 41505 
6d19301074cf
"enriched_type" replaces less specific "type_lifting"
 haftmann parents: 
41372diff
changeset | 121 | enriched_type map: map | 
| 41372 | 122 | by (simp_all add: fun_eq_iff image_compose) | 
| 40604 | 123 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 124 | definition filter :: "('a \<Rightarrow> bool) \<Rightarrow> 'a Cset.set \<Rightarrow> 'a Cset.set" where
 | 
| 44555 | 125 | [simp]: "filter P A = Set (More_Set.project P (set_of A))" | 
| 31807 | 126 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 127 | definition forall :: "('a \<Rightarrow> bool) \<Rightarrow> 'a Cset.set \<Rightarrow> bool" where
 | 
| 44555 | 128 | [simp]: "forall P A \<longleftrightarrow> Ball (set_of A) P" | 
| 31807 | 129 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 130 | definition exists :: "('a \<Rightarrow> bool) \<Rightarrow> 'a Cset.set \<Rightarrow> bool" where
 | 
| 44555 | 131 | [simp]: "exists P A \<longleftrightarrow> Bex (set_of A) P" | 
| 31807 | 132 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 133 | definition card :: "'a Cset.set \<Rightarrow> nat" where | 
| 44555 | 134 | [simp]: "card A = Finite_Set.card (set_of A)" | 
| 43241 | 135 | |
| 34048 | 136 | context complete_lattice | 
| 137 | begin | |
| 31807 | 138 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 139 | definition Infimum :: "'a Cset.set \<Rightarrow> 'a" where | 
| 44555 | 140 | [simp]: "Infimum A = Inf (set_of A)" | 
| 31807 | 141 | |
| 40672 
abd4e7358847
replaced misleading Fset/fset name -- these do not stand for finite sets
 haftmann parents: 
40604diff
changeset | 142 | definition Supremum :: "'a Cset.set \<Rightarrow> 'a" where | 
| 44555 | 143 | [simp]: "Supremum A = Sup (set_of A)" | 
| 34048 | 144 | |
| 145 | end | |
| 31807 | 146 | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 147 | subsection {* More operations *}
 | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 148 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 149 | text {* conversion from @{typ "'a list"} *}
 | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 150 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 151 | definition set :: "'a list \<Rightarrow> 'a Cset.set" where | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 152 | "set xs = Set (List.set xs)" | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 153 | hide_const (open) set | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 154 | |
| 44558 | 155 | definition coset :: "'a list \<Rightarrow> 'a Cset.set" where | 
| 156 | "coset xs = Set (- List.set xs)" | |
| 157 | hide_const (open) coset | |
| 158 | ||
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 159 | text {* conversion from @{typ "'a Predicate.pred"} *}
 | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 160 | |
| 44555 | 161 | definition pred_of_cset :: "'a Cset.set \<Rightarrow> 'a Predicate.pred" where | 
| 162 | [code del]: "pred_of_cset = Predicate.Pred \<circ> Cset.member" | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 163 | |
| 44555 | 164 | definition of_pred :: "'a Predicate.pred \<Rightarrow> 'a Cset.set" where | 
| 165 | "of_pred = Cset.Set \<circ> Collect \<circ> Predicate.eval" | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 166 | |
| 44555 | 167 | definition of_seq :: "'a Predicate.seq \<Rightarrow> 'a Cset.set" where | 
| 168 | "of_seq = of_pred \<circ> Predicate.pred_of_seq" | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 169 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 170 | text {* monad operations *}
 | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 171 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 172 | definition single :: "'a \<Rightarrow> 'a Cset.set" where | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 173 |   "single a = Set {a}"
 | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 174 | |
| 44555 | 175 | definition bind :: "'a Cset.set \<Rightarrow> ('a \<Rightarrow> 'b Cset.set) \<Rightarrow> 'b Cset.set" (infixl "\<guillemotright>=" 70) where
 | 
| 176 | "A \<guillemotright>= f = (SUP x : set_of A. f x)" | |
| 177 | ||
| 31807 | 178 | |
| 31846 | 179 | subsection {* Simplified simprules *}
 | 
| 180 | ||
| 44555 | 181 | lemma empty_simp [simp]: "member Cset.empty = bot" | 
| 182 | by (simp add: fun_eq_iff bot_apply) | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 183 | |
| 44555 | 184 | lemma UNIV_simp [simp]: "member Cset.UNIV = top" | 
| 185 | by (simp add: fun_eq_iff top_apply) | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 186 | |
| 31846 | 187 | lemma is_empty_simp [simp]: | 
| 44555 | 188 |   "is_empty A \<longleftrightarrow> set_of A = {}"
 | 
| 37024 
e938a0b5286e
renamed List_Set to the now more appropriate More_Set
 haftmann parents: 
37023diff
changeset | 189 | by (simp add: More_Set.is_empty_def) | 
| 31846 | 190 | declare is_empty_def [simp del] | 
| 191 | ||
| 192 | lemma remove_simp [simp]: | |
| 44555 | 193 |   "remove x A = Set (set_of A - {x})"
 | 
| 37024 
e938a0b5286e
renamed List_Set to the now more appropriate More_Set
 haftmann parents: 
37023diff
changeset | 194 | by (simp add: More_Set.remove_def) | 
| 31846 | 195 | declare remove_def [simp del] | 
| 196 | ||
| 31847 | 197 | lemma filter_simp [simp]: | 
| 44555 | 198 |   "filter P A = Set {x \<in> set_of A. P x}"
 | 
| 37024 
e938a0b5286e
renamed List_Set to the now more appropriate More_Set
 haftmann parents: 
37023diff
changeset | 199 | by (simp add: More_Set.project_def) | 
| 31847 | 200 | declare filter_def [simp del] | 
| 31846 | 201 | |
| 44555 | 202 | lemma set_of_set [simp]: | 
| 203 | "set_of (Cset.set xs) = set xs" | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 204 | by (simp add: set_def) | 
| 44555 | 205 | hide_fact (open) set_def | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 206 | |
| 44558 | 207 | lemma member_set [simp]: | 
| 208 | "member (Cset.set xs) = (\<lambda>x. x \<in> set xs)" | |
| 209 | by (simp add: fun_eq_iff member_def) | |
| 210 | hide_fact (open) member_set | |
| 211 | ||
| 212 | lemma set_of_coset [simp]: | |
| 213 | "set_of (Cset.coset xs) = - set xs" | |
| 214 | by (simp add: coset_def) | |
| 215 | hide_fact (open) coset_def | |
| 216 | ||
| 217 | lemma member_coset [simp]: | |
| 218 | "member (Cset.coset xs) = (\<lambda>x. x \<in> - set xs)" | |
| 219 | by (simp add: fun_eq_iff member_def) | |
| 220 | hide_fact (open) member_coset | |
| 221 | ||
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 222 | lemma set_simps [simp]: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 223 | "Cset.set [] = Cset.empty" | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 224 | "Cset.set (x # xs) = insert x (Cset.set xs)" | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 225 | by(simp_all add: Cset.set_def) | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 226 | |
| 44555 | 227 | lemma member_SUP [simp]: | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 228 | "member (SUPR A f) = SUPR A (member \<circ> f)" | 
| 44555 | 229 | by (auto simp add: fun_eq_iff SUP_apply member_def, unfold SUP_def, auto) | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 230 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 231 | lemma member_bind [simp]: | 
| 44555 | 232 | "member (P \<guillemotright>= f) = SUPR (set_of P) (member \<circ> f)" | 
| 233 | by (simp add: bind_def Cset.set_eq_iff) | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 234 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 235 | lemma member_single [simp]: | 
| 44555 | 236 |   "member (single a) = (\<lambda>x. x \<in> {a})"
 | 
| 237 | by (simp add: single_def fun_eq_iff) | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 238 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 239 | lemma single_sup_simps [simp]: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 240 | shows single_sup: "sup (single a) A = insert a A" | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 241 | and sup_single: "sup A (single a) = insert a A" | 
| 44555 | 242 | by (auto simp add: Cset.set_eq_iff single_def) | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 243 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 244 | lemma single_bind [simp]: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 245 | "single a \<guillemotright>= B = B a" | 
| 44555 | 246 | by (simp add: Cset.set_eq_iff SUP_insert single_def) | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 247 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 248 | lemma bind_bind: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 249 | "(A \<guillemotright>= B) \<guillemotright>= C = A \<guillemotright>= (\<lambda>x. B x \<guillemotright>= C)" | 
| 44555 | 250 | by (simp add: bind_def, simp only: SUP_def image_image, simp) | 
| 251 | ||
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 252 | lemma bind_single [simp]: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 253 | "A \<guillemotright>= single = A" | 
| 44555 | 254 | by (simp add: Cset.set_eq_iff SUP_apply fun_eq_iff single_def member_def) | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 255 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 256 | lemma bind_const: "A \<guillemotright>= (\<lambda>_. B) = (if Cset.is_empty A then Cset.empty else B)" | 
| 44555 | 257 | by (auto simp add: Cset.set_eq_iff fun_eq_iff) | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 258 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 259 | lemma empty_bind [simp]: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 260 | "Cset.empty \<guillemotright>= f = Cset.empty" | 
| 44555 | 261 | by (simp add: Cset.set_eq_iff fun_eq_iff bot_apply) | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 262 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 263 | lemma member_of_pred [simp]: | 
| 44555 | 264 |   "member (of_pred P) = (\<lambda>x. x \<in> {x. Predicate.eval P x})"
 | 
| 265 | by (simp add: of_pred_def fun_eq_iff) | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 266 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 267 | lemma member_of_seq [simp]: | 
| 44555 | 268 |   "member (of_seq xq) = (\<lambda>x. x \<in> {x. Predicate.member xq x})"
 | 
| 269 | by (simp add: of_seq_def eval_member) | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 270 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 271 | lemma eval_pred_of_cset [simp]: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 272 | "Predicate.eval (pred_of_cset A) = Cset.member A" | 
| 44555 | 273 | by (simp add: pred_of_cset_def) | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 274 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 275 | subsection {* Default implementations *}
 | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 276 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 277 | lemma set_code [code]: | 
| 44555 | 278 | "Cset.set = (\<lambda>xs. fold insert xs Cset.empty)" | 
| 279 | proof (rule ext, rule Cset.set_eqI) | |
| 280 | fix xs :: "'a list" | |
| 281 | show "member (Cset.set xs) = member (fold insert xs Cset.empty)" | |
| 282 | by (simp add: fold_commute_apply [symmetric, where ?h = Set and ?g = Set.insert] | |
| 283 | fun_eq_iff Cset.set_def union_set [symmetric]) | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 284 | qed | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 285 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 286 | lemma single_code [code]: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 287 | "single a = insert a Cset.empty" | 
| 44555 | 288 | by (simp add: Cset.single_def) | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 289 | |
| 44558 | 290 | lemma compl_set [simp]: | 
| 291 | "- Cset.set xs = Cset.coset xs" | |
| 292 | by (simp add: Cset.set_def Cset.coset_def) | |
| 293 | ||
| 294 | lemma compl_coset [simp]: | |
| 295 | "- Cset.coset xs = Cset.set xs" | |
| 296 | by (simp add: Cset.set_def Cset.coset_def) | |
| 297 | ||
| 298 | lemma inter_project: | |
| 299 | "inf A (Cset.set xs) = Cset.set (List.filter (Cset.member A) xs)" | |
| 300 | "inf A (Cset.coset xs) = foldr Cset.remove xs A" | |
| 301 | proof - | |
| 302 | show "inf A (Cset.set xs) = Cset.set (List.filter (member A) xs)" | |
| 303 | by (simp add: inter project_def Cset.set_def member_def) | |
| 44563 | 304 | have *: "\<And>x::'a. Cset.remove = (\<lambda>x. Set \<circ> More_Set.remove x \<circ> set_of)" | 
| 305 | by (simp add: fun_eq_iff More_Set.remove_def) | |
| 306 | have "set_of \<circ> fold (\<lambda>x. Set \<circ> More_Set.remove x \<circ> set_of) xs = | |
| 307 | fold More_Set.remove xs \<circ> set_of" | |
| 308 | by (rule fold_commute) (simp add: fun_eq_iff) | |
| 309 | then have "fold More_Set.remove xs (set_of A) = | |
| 310 | set_of (fold (\<lambda>x. Set \<circ> More_Set.remove x \<circ> set_of) xs A)" | |
| 44558 | 311 | by (simp add: fun_eq_iff) | 
| 312 | then have "inf A (Cset.coset xs) = fold Cset.remove xs A" | |
| 44563 | 313 | by (simp add: Diff_eq [symmetric] minus_set *) | 
| 44558 | 314 | moreover have "\<And>x y :: 'a. Cset.remove y \<circ> Cset.remove x = Cset.remove x \<circ> Cset.remove y" | 
| 44563 | 315 | by (auto simp add: More_Set.remove_def *) | 
| 44558 | 316 | ultimately show "inf A (Cset.coset xs) = foldr Cset.remove xs A" | 
| 317 | by (simp add: foldr_fold) | |
| 318 | qed | |
| 319 | ||
| 44563 | 320 | lemma union_insert: | 
| 321 | "sup (Cset.set xs) A = foldr Cset.insert xs A" | |
| 322 | "sup (Cset.coset xs) A = Cset.coset (List.filter (Not \<circ> member A) xs)" | |
| 323 | proof - | |
| 324 | have *: "\<And>x::'a. Cset.insert = (\<lambda>x. Set \<circ> Set.insert x \<circ> set_of)" | |
| 325 | by (simp add: fun_eq_iff) | |
| 326 | have "set_of \<circ> fold (\<lambda>x. Set \<circ> Set.insert x \<circ> set_of) xs = | |
| 327 | fold Set.insert xs \<circ> set_of" | |
| 328 | by (rule fold_commute) (simp add: fun_eq_iff) | |
| 329 | then have "fold Set.insert xs (set_of A) = | |
| 330 | set_of (fold (\<lambda>x. Set \<circ> Set.insert x \<circ> set_of) xs A)" | |
| 331 | by (simp add: fun_eq_iff) | |
| 332 | then have "sup (Cset.set xs) A = fold Cset.insert xs A" | |
| 333 | by (simp add: union_set *) | |
| 334 | moreover have "\<And>x y :: 'a. Cset.insert y \<circ> Cset.insert x = Cset.insert x \<circ> Cset.insert y" | |
| 335 | by (auto simp add: *) | |
| 336 | ultimately show "sup (Cset.set xs) A = foldr Cset.insert xs A" | |
| 337 | by (simp add: foldr_fold) | |
| 338 | show "sup (Cset.coset xs) A = Cset.coset (List.filter (Not \<circ> member A) xs)" | |
| 339 | by (auto simp add: Cset.coset_def Cset.member_def) | |
| 340 | qed | |
| 341 | ||
| 44558 | 342 | lemma subtract_remove: | 
| 343 | "A - Cset.set xs = foldr Cset.remove xs A" | |
| 344 | "A - Cset.coset xs = Cset.set (List.filter (member A) xs)" | |
| 345 | by (simp_all only: diff_eq compl_set compl_coset inter_project) | |
| 346 | ||
| 347 | context complete_lattice | |
| 348 | begin | |
| 349 | ||
| 350 | lemma Infimum_inf: | |
| 351 | "Infimum (Cset.set As) = foldr inf As top" | |
| 352 | "Infimum (Cset.coset []) = bot" | |
| 353 | by (simp_all add: Inf_set_foldr) | |
| 354 | ||
| 355 | lemma Supremum_sup: | |
| 356 | "Supremum (Cset.set As) = foldr sup As bot" | |
| 357 | "Supremum (Cset.coset []) = top" | |
| 358 | by (simp_all add: Sup_set_foldr) | |
| 359 | ||
| 360 | end | |
| 361 | ||
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 362 | lemma of_pred_code [code]: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 363 | "of_pred (Predicate.Seq f) = (case f () of | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 364 | Predicate.Empty \<Rightarrow> Cset.empty | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 365 | | Predicate.Insert x P \<Rightarrow> Cset.insert x (of_pred P) | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 366 | | Predicate.Join P xq \<Rightarrow> sup (of_pred P) (of_seq xq))" | 
| 44555 | 367 | apply (auto split: seq.split simp add: Predicate.Seq_def of_pred_def Cset.set_eq_iff sup_apply eval_member [symmetric] member_def [symmetric] Collect_def mem_def member_set_of) | 
| 368 | apply (unfold Set.insert_def Collect_def sup_apply member_set_of) | |
| 369 | apply simp_all | |
| 370 | done | |
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 371 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 372 | lemma of_seq_code [code]: | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 373 | "of_seq Predicate.Empty = Cset.empty" | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 374 | "of_seq (Predicate.Insert x P) = Cset.insert x (of_pred P)" | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 375 | "of_seq (Predicate.Join P xq) = sup (of_pred P) (of_seq xq)" | 
| 44555 | 376 | apply (auto simp add: of_seq_def of_pred_def Cset.set_eq_iff mem_def Collect_def) | 
| 377 | apply (unfold Set.insert_def Collect_def sup_apply member_set_of) | |
| 378 | apply simp_all | |
| 379 | done | |
| 31846 | 380 | |
| 44558 | 381 | lemma bind_set: | 
| 382 | "Cset.bind (Cset.set xs) f = fold (sup \<circ> f) xs (Cset.set [])" | |
| 383 | by (simp add: Cset.bind_def SUPR_set_fold) | |
| 384 | hide_fact (open) bind_set | |
| 385 | ||
| 386 | lemma pred_of_cset_set: | |
| 387 | "pred_of_cset (Cset.set xs) = foldr sup (List.map Predicate.single xs) bot" | |
| 388 | proof - | |
| 389 | have "pred_of_cset (Cset.set xs) = Predicate.Pred (\<lambda>x. x \<in> set xs)" | |
| 390 | by (simp add: Cset.pred_of_cset_def member_set) | |
| 391 | moreover have "foldr sup (List.map Predicate.single xs) bot = \<dots>" | |
| 392 | by (induct xs) (auto simp add: bot_pred_def intro: pred_eqI, simp add: mem_def) | |
| 393 | ultimately show ?thesis by simp | |
| 394 | qed | |
| 395 | hide_fact (open) pred_of_cset_set | |
| 396 | ||
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 397 | no_notation bind (infixl "\<guillemotright>=" 70) | 
| 31849 | 398 | |
| 43241 | 399 | hide_const (open) is_empty insert remove map filter forall exists card | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 400 | Inter Union bind single of_pred of_seq | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 401 | |
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 402 | hide_fact (open) set_def pred_of_cset_def of_pred_def of_seq_def single_def | 
| 44555 | 403 | bind_def empty_simp UNIV_simp set_simps member_bind | 
| 43971 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 404 | member_single single_sup_simps single_sup sup_single single_bind | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 405 | bind_bind bind_single bind_const empty_bind member_of_pred member_of_seq | 
| 
892030194015
added operations to Cset with code equations in backing implementations
 Andreas Lochbihler parents: 
43241diff
changeset | 406 | eval_pred_of_cset set_code single_code of_pred_code of_seq_code | 
| 31849 | 407 | |
| 31807 | 408 | end |