src/HOL/Quotient_Examples/List_Cset.thy
author krauss
Wed, 13 Jul 2011 15:50:45 +0200
changeset 44664 9959c8732edf
child 44797 3264fbfd87d6
permissions -rw-r--r--
experimental variants of Library/Cset.thy and Library/Dlist_Cset.thy defined via quotient package
     1 (*  Title:      HOL/Quotient_Examples/List_Cset.thy
     2     Author:     Florian Haftmann, Alexander Krauss, TU Muenchen
     3 *)
     4 
     5 header {* Implementation of type Cset.set based on lists. Code equations obtained via quotient lifting. *}
     6 
     7 theory List_Cset
     8 imports Cset
     9 begin
    10 
    11 lemma [quot_respect]: "((op = ===> set_eq ===> set_eq) ===> op = ===> set_eq ===> set_eq)
    12   foldr foldr"
    13 by (simp add: fun_rel_eq)
    14 
    15 lemma [quot_preserve]: "((id ---> abs_set ---> rep_set) ---> id ---> rep_set ---> abs_set) foldr = foldr"
    16 apply (rule ext)+
    17 by (induct_tac xa) (auto simp: Quotient_abs_rep[OF Quotient_set])
    18 
    19 
    20 subsection {* Relationship to lists *}
    21 
    22 (*FIXME: maybe define on sets first and then lift -> more canonical*)
    23 definition coset :: "'a list \<Rightarrow> 'a Cset.set" where
    24   "coset xs = Cset.uminus (Cset.set xs)"
    25 
    26 code_datatype Cset.set List_Cset.coset
    27 
    28 lemma member_code [code]:
    29   "member x (Cset.set xs) \<longleftrightarrow> List.member xs x"
    30   "member x (coset xs) \<longleftrightarrow> \<not> List.member xs x"
    31 unfolding coset_def
    32 apply (lifting in_set_member)
    33 by descending (simp add: in_set_member)
    34 
    35 definition (in term_syntax)
    36   setify :: "'a\<Colon>typerep list \<times> (unit \<Rightarrow> Code_Evaluation.term)
    37     \<Rightarrow> 'a Cset.set \<times> (unit \<Rightarrow> Code_Evaluation.term)" where
    38   [code_unfold]: "setify xs = Code_Evaluation.valtermify Cset.set {\<cdot>} xs"
    39 
    40 notation fcomp (infixl "\<circ>>" 60)
    41 notation scomp (infixl "\<circ>\<rightarrow>" 60)
    42 
    43 instantiation Cset.set :: (random) random
    44 begin
    45 
    46 definition
    47   "Quickcheck.random i = Quickcheck.random i \<circ>\<rightarrow> (\<lambda>xs. Pair (setify xs))"
    48 
    49 instance ..
    50 
    51 end
    52 
    53 no_notation fcomp (infixl "\<circ>>" 60)
    54 no_notation scomp (infixl "\<circ>\<rightarrow>" 60)
    55 
    56 subsection {* Basic operations *}
    57 
    58 lemma is_empty_set [code]:
    59   "Cset.is_empty (Cset.set xs) \<longleftrightarrow> List.null xs"
    60   by (lifting is_empty_set)
    61 hide_fact (open) is_empty_set
    62 
    63 lemma empty_set [code]:
    64   "Cset.empty = Cset.set []"
    65   by (lifting set.simps(1)[symmetric])
    66 hide_fact (open) empty_set
    67 
    68 lemma UNIV_set [code]:
    69   "Cset.UNIV = coset []"
    70   unfolding coset_def by descending simp
    71 hide_fact (open) UNIV_set
    72 
    73 lemma remove_set [code]:
    74   "Cset.remove x (Cset.set xs) = Cset.set (removeAll x xs)"
    75   "Cset.remove x (coset xs) = coset (List.insert x xs)"
    76 unfolding coset_def
    77 apply descending
    78 apply (simp add: More_Set.remove_def)
    79 apply descending
    80 by (simp add: remove_set_compl)
    81 
    82 lemma insert_set [code]:
    83   "Cset.insert x (Cset.set xs) = Cset.set (List.insert x xs)"
    84   "Cset.insert x (coset xs) = coset (removeAll x xs)"
    85 unfolding coset_def
    86 apply (lifting set_insert[symmetric])
    87 by descending simp
    88 
    89 lemma map_set [code]:
    90   "Cset.map f (Cset.set xs) = Cset.set (remdups (List.map f xs))"
    91 by descending simp
    92   
    93 lemma filter_set [code]:
    94   "Cset.filter P (Cset.set xs) = Cset.set (List.filter P xs)"
    95 by descending (simp add: project_set)
    96 
    97 lemma forall_set [code]:
    98   "Cset.forall (Cset.set xs) P \<longleftrightarrow> list_all P xs"
    99 (* FIXME: why does (lifting Ball_set_list_all) fail? *)
   100 by descending (fact Ball_set_list_all)
   101 
   102 lemma exists_set [code]:
   103   "Cset.exists (Cset.set xs) P \<longleftrightarrow> list_ex P xs"
   104 by descending (fact Bex_set_list_ex)
   105 
   106 lemma card_set [code]:
   107   "Cset.card (Cset.set xs) = length (remdups xs)"
   108 by (lifting length_remdups_card_conv[symmetric])
   109 
   110 lemma compl_set [simp, code]:
   111   "Cset.uminus (Cset.set xs) = coset xs"
   112 unfolding coset_def by descending simp
   113 
   114 lemma compl_coset [simp, code]:
   115   "Cset.uminus (coset xs) = Cset.set xs"
   116 unfolding coset_def by descending simp
   117 
   118 context complete_lattice
   119 begin
   120 
   121 (* FIXME: automated lifting fails, since @{term inf} and @{term top}
   122   are variables (???) *)
   123 lemma Infimum_inf [code]:
   124   "Infimum (Cset.set As) = foldr inf As top"
   125   "Infimum (coset []) = bot"
   126 unfolding Infimum_def member_code List.member_def
   127 apply (simp add: mem_def Inf_set_foldr)
   128 apply (simp add: Inf_UNIV[unfolded UNIV_def Collect_def])
   129 done
   130 
   131 lemma Supremum_sup [code]:
   132   "Supremum (Cset.set As) = foldr sup As bot"
   133   "Supremum (coset []) = top"
   134 unfolding Supremum_def member_code List.member_def
   135 apply (simp add: mem_def Sup_set_foldr)
   136 apply (simp add: Sup_UNIV[unfolded UNIV_def Collect_def])
   137 done
   138 
   139 end
   140 
   141 
   142 
   143 subsection {* Derived operations *}
   144 
   145 lemma subset_eq_forall [code]:
   146   "Cset.subset A B \<longleftrightarrow> Cset.forall A (\<lambda>x. member x B)"
   147 by descending blast
   148 
   149 lemma subset_subset_eq [code]:
   150   "Cset.psubset A B \<longleftrightarrow> Cset.subset A B \<and> \<not> Cset.subset B A"
   151 by descending blast
   152 
   153 instantiation Cset.set :: (type) equal
   154 begin
   155 
   156 definition [code]:
   157   "HOL.equal A B \<longleftrightarrow> Cset.subset A B \<and> Cset.subset B A"
   158 
   159 instance
   160 apply intro_classes
   161 unfolding equal_set_def
   162 by descending auto
   163 
   164 end
   165 
   166 lemma [code nbe]:
   167   "HOL.equal (A :: 'a Cset.set) A \<longleftrightarrow> True"
   168   by (fact equal_refl)
   169 
   170 
   171 subsection {* Functorial operations *}
   172 
   173 lemma inter_project [code]:
   174   "Cset.inter A (Cset.set xs) = Cset.set (List.filter (\<lambda>x. Cset.member x A) xs)"
   175   "Cset.inter A (coset xs) = foldr Cset.remove xs A"
   176 apply descending
   177 apply auto
   178 unfolding coset_def
   179 apply descending
   180 apply simp
   181 by (metis diff_eq minus_set_foldr)
   182 
   183 lemma subtract_remove [code]:
   184   "Cset.minus A (Cset.set xs) = foldr Cset.remove xs A"
   185   "Cset.minus A (coset xs) = Cset.set (List.filter (\<lambda>x. member x A) xs)"
   186 unfolding coset_def
   187 apply (lifting minus_set_foldr)
   188 by descending auto
   189 
   190 lemma union_insert [code]:
   191   "Cset.union (Cset.set xs) A = foldr Cset.insert xs A"
   192   "Cset.union (coset xs) A = coset (List.filter (\<lambda>x. \<not> member x A) xs)"
   193 unfolding coset_def
   194 apply (lifting union_set_foldr)
   195 by descending auto
   196 
   197 end