src/HOL/Quotient_Examples/List_Cset.thy
author Cezary Kaliszyk <kaliszyk@in.tum.de>
Fri, 19 Aug 2011 17:05:10 +0900
changeset 45164 83c4f8ba0aa3
parent 44797 3264fbfd87d6
permissions -rw-r--r--
Quotient_Examples: Cset, List_Cset: Lift Inf and Sup directly.
     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 lemma Inf_inf [code]:
   119   "Cset.Inf (Cset.set (xs\<Colon>'a\<Colon>complete_lattice list)) = foldr inf xs top"
   120   "Cset.Inf (coset ([]\<Colon>'a\<Colon>complete_lattice list)) = bot"
   121   unfolding List_Cset.UNIV_set[symmetric]
   122   by (lifting Inf_set_foldr Inf_UNIV)
   123 
   124 lemma Sup_sup [code]:
   125   "Cset.Sup (Cset.set (xs\<Colon>'a\<Colon>complete_lattice list)) = foldr sup xs bot"
   126   "Cset.Sup (coset ([]\<Colon>'a\<Colon>complete_lattice list)) = top"
   127   unfolding List_Cset.UNIV_set[symmetric]
   128   by (lifting Sup_set_foldr Sup_UNIV)
   129 
   130 subsection {* Derived operations *}
   131 
   132 lemma subset_eq_forall [code]:
   133   "Cset.subset A B \<longleftrightarrow> Cset.forall A (\<lambda>x. member x B)"
   134 by descending blast
   135 
   136 lemma subset_subset_eq [code]:
   137   "Cset.psubset A B \<longleftrightarrow> Cset.subset A B \<and> \<not> Cset.subset B A"
   138 by descending blast
   139 
   140 instantiation Cset.set :: (type) equal
   141 begin
   142 
   143 definition [code]:
   144   "HOL.equal A B \<longleftrightarrow> Cset.subset A B \<and> Cset.subset B A"
   145 
   146 instance
   147 apply intro_classes
   148 unfolding equal_set_def
   149 by descending auto
   150 
   151 end
   152 
   153 lemma [code nbe]:
   154   "HOL.equal (A :: 'a Cset.set) A \<longleftrightarrow> True"
   155   by (fact equal_refl)
   156 
   157 
   158 subsection {* Functorial operations *}
   159 
   160 lemma inter_project [code]:
   161   "Cset.inter A (Cset.set xs) = Cset.set (List.filter (\<lambda>x. Cset.member x A) xs)"
   162   "Cset.inter A (coset xs) = foldr Cset.remove xs A"
   163 apply descending
   164 apply auto
   165 unfolding coset_def
   166 apply descending
   167 apply simp
   168 by (metis diff_eq minus_set_foldr)
   169 
   170 lemma subtract_remove [code]:
   171   "Cset.minus A (Cset.set xs) = foldr Cset.remove xs A"
   172   "Cset.minus A (coset xs) = Cset.set (List.filter (\<lambda>x. member x A) xs)"
   173 unfolding coset_def
   174 apply (lifting minus_set_foldr)
   175 by descending auto
   176 
   177 lemma union_insert [code]:
   178   "Cset.union (Cset.set xs) A = foldr Cset.insert xs A"
   179   "Cset.union (coset xs) A = coset (List.filter (\<lambda>x. \<not> member x A) xs)"
   180 unfolding coset_def
   181 apply (lifting union_set_foldr)
   182 by descending auto
   183 
   184 lemma UNION_code [code]:
   185   "Cset.UNION (Cset.set []) f = Cset.set []"
   186   "Cset.UNION (Cset.set (x#xs)) f =
   187      Cset.union (f x) (Cset.UNION (Cset.set xs) f)"
   188   by (descending, simp)+
   189 
   190 
   191 end