1 (* Author: Florian Haftmann, TU Muenchen *) |
1 (* Author: Florian Haftmann, TU Muenchen *) |
2 |
2 |
3 header {* Lists with elements distinct as canonical example for datatype invariants *} |
3 header {* Lists with elements distinct as canonical example for datatype invariants *} |
4 |
4 |
5 theory Dlist |
5 theory Dlist |
6 imports Main More_List Fset |
6 imports Main Fset |
7 begin |
7 begin |
8 |
8 |
9 section {* The type of distinct lists *} |
9 section {* The type of distinct lists *} |
10 |
10 |
11 typedef (open) 'a dlist = "{xs::'a list. distinct xs}" |
11 typedef (open) 'a dlist = "{xs::'a list. distinct xs}" |
179 declare Infimum_inf [code del] |
179 declare Infimum_inf [code del] |
180 declare Supremum_sup [code del] |
180 declare Supremum_sup [code del] |
181 |
181 |
182 lemma Set_Dlist [simp]: |
182 lemma Set_Dlist [simp]: |
183 "Set (Dlist xs) = Fset (set xs)" |
183 "Set (Dlist xs) = Fset (set xs)" |
184 by (simp add: Set_def Fset.Set_def) |
184 by (rule fset_eqI) (simp add: Set_def) |
185 |
185 |
186 lemma Coset_Dlist [simp]: |
186 lemma Coset_Dlist [simp]: |
187 "Coset (Dlist xs) = Fset (- set xs)" |
187 "Coset (Dlist xs) = Fset (- set xs)" |
188 by (simp add: Coset_def Fset.Coset_def) |
188 by (rule fset_eqI) (simp add: Coset_def) |
189 |
189 |
190 lemma member_Set [simp]: |
190 lemma member_Set [simp]: |
191 "Fset.member (Set dxs) = List.member (list_of_dlist dxs)" |
191 "Fset.member (Set dxs) = List.member (list_of_dlist dxs)" |
192 by (simp add: Set_def member_set) |
192 by (simp add: Set_def member_set) |
193 |
193 |
195 "Fset.member (Coset dxs) = Not \<circ> List.member (list_of_dlist dxs)" |
195 "Fset.member (Coset dxs) = Not \<circ> List.member (list_of_dlist dxs)" |
196 by (simp add: Coset_def member_set not_set_compl) |
196 by (simp add: Coset_def member_set not_set_compl) |
197 |
197 |
198 lemma Set_dlist_of_list [code]: |
198 lemma Set_dlist_of_list [code]: |
199 "Fset.Set xs = Set (dlist_of_list xs)" |
199 "Fset.Set xs = Set (dlist_of_list xs)" |
200 by simp |
200 by (rule fset_eqI) simp |
201 |
201 |
202 lemma Coset_dlist_of_list [code]: |
202 lemma Coset_dlist_of_list [code]: |
203 "Fset.Coset xs = Coset (dlist_of_list xs)" |
203 "Fset.Coset xs = Coset (dlist_of_list xs)" |
204 by simp |
204 by (rule fset_eqI) simp |
205 |
205 |
206 lemma is_empty_Set [code]: |
206 lemma is_empty_Set [code]: |
207 "Fset.is_empty (Set dxs) \<longleftrightarrow> null dxs" |
207 "Fset.is_empty (Set dxs) \<longleftrightarrow> null dxs" |
208 by (simp add: null_def null_empty member_set) |
208 by (simp add: null_def null_empty member_set) |
209 |
209 |
231 by (simp_all add: member_def) |
231 by (simp_all add: member_def) |
232 |
232 |
233 lemma compl_code [code]: |
233 lemma compl_code [code]: |
234 "- Set dxs = Coset dxs" |
234 "- Set dxs = Coset dxs" |
235 "- Coset dxs = Set dxs" |
235 "- Coset dxs = Set dxs" |
236 by (simp_all add: not_set_compl member_set) |
236 by (rule fset_eqI, simp add: member_set not_set_compl)+ |
237 |
237 |
238 lemma map_code [code]: |
238 lemma map_code [code]: |
239 "Fset.map f (Set dxs) = Set (map f dxs)" |
239 "Fset.map f (Set dxs) = Set (map f dxs)" |
240 by (simp add: member_set) |
240 by (rule fset_eqI) (simp add: member_set) |
241 |
241 |
242 lemma filter_code [code]: |
242 lemma filter_code [code]: |
243 "Fset.filter f (Set dxs) = Set (filter f dxs)" |
243 "Fset.filter f (Set dxs) = Set (filter f dxs)" |
244 by (simp add: member_set) |
244 by (rule fset_eqI) (simp add: member_set) |
245 |
245 |
246 lemma forall_Set [code]: |
246 lemma forall_Set [code]: |
247 "Fset.forall P (Set xs) \<longleftrightarrow> list_all P (list_of_dlist xs)" |
247 "Fset.forall P (Set xs) \<longleftrightarrow> list_all P (list_of_dlist xs)" |
248 by (simp add: member_set list_all_iff) |
248 by (simp add: member_set list_all_iff) |
249 |
249 |