src/HOL/Library/Dlist.thy
changeset 37473 013f78aed840
parent 37106 d56e0b30ce5a
child 37595 9591362629e3
equal deleted inserted replaced
37472:de4a8298c6f3 37473:013f78aed840
     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