| author | wenzelm | 
| Wed, 07 Aug 2013 14:47:50 +0200 | |
| changeset 52891 | b8dede3a4f1d | 
| parent 51540 | eea5c4ca4a0e | 
| child 53745 | 788730ab7da4 | 
| permissions | -rw-r--r-- | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 1 | (* Title: HOL/Library/RBT_Set.thy | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 2 | Author: Ondrej Kuncar | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 3 | *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 4 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 5 | header {* Implementation of sets using RBT trees *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 6 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 7 | theory RBT_Set | 
| 51115 
7dbd6832a689
consolidation of library theories on product orders
 haftmann parents: 
50996diff
changeset | 8 | imports RBT Product_Lexorder | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 9 | begin | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 10 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 11 | (* | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 12 | Users should be aware that by including this file all code equations | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 13 | outside of List.thy using 'a list as an implenentation of sets cannot be | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 14 | used for code generation. If such equations are not needed, they can be | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 15 | deleted from the code generator. Otherwise, a user has to provide their | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 16 | own equations using RBT trees. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 17 | *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 18 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 19 | section {* Definition of code datatype constructors *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 20 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 21 | definition Set :: "('a\<Colon>linorder, unit) rbt \<Rightarrow> 'a set" 
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 22 |   where "Set t = {x . lookup t x = Some ()}"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 23 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 24 | definition Coset :: "('a\<Colon>linorder, unit) rbt \<Rightarrow> 'a set" 
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 25 | where [simp]: "Coset t = - Set t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 26 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 27 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 28 | section {* Deletion of already existing code equations *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 29 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 30 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 31 | "Set.empty = Set.empty" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 32 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 33 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 34 | "Set.is_empty = Set.is_empty" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 35 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 36 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 37 | "uminus_set_inst.uminus_set = uminus_set_inst.uminus_set" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 38 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 39 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 40 | "Set.member = Set.member" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 41 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 42 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 43 | "Set.insert = Set.insert" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 44 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 45 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 46 | "Set.remove = Set.remove" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 47 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 48 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 49 | "UNIV = UNIV" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 50 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 51 | lemma [code, code del]: | 
| 49757 
73ab6d4a9236
rename Set.project to Set.filter - more appropriate name
 kuncar parents: 
48623diff
changeset | 52 | "Set.filter = Set.filter" .. | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 53 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 54 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 55 | "image = image" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 56 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 57 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 58 | "Set.subset_eq = Set.subset_eq" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 59 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 60 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 61 | "Ball = Ball" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 62 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 63 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 64 | "Bex = Bex" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 65 | |
| 49948 
744934b818c7
moved quite generic material from theory Enum to more appropriate places
 haftmann parents: 
49928diff
changeset | 66 | lemma [code, code del]: | 
| 
744934b818c7
moved quite generic material from theory Enum to more appropriate places
 haftmann parents: 
49928diff
changeset | 67 | "can_select = can_select" .. | 
| 
744934b818c7
moved quite generic material from theory Enum to more appropriate places
 haftmann parents: 
49928diff
changeset | 68 | |
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 69 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 70 | "Set.union = Set.union" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 71 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 72 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 73 | "minus_set_inst.minus_set = minus_set_inst.minus_set" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 74 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 75 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 76 | "Set.inter = Set.inter" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 77 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 78 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 79 | "card = card" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 80 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 81 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 82 | "the_elem = the_elem" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 83 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 84 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 85 | "Pow = Pow" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 86 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 87 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 88 | "setsum = setsum" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 89 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 90 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 91 | "Product_Type.product = Product_Type.product" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 92 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 93 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 94 | "Id_on = Id_on" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 95 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 96 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 97 | "Image = Image" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 98 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 99 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 100 | "trancl = trancl" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 101 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 102 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 103 | "relcomp = relcomp" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 104 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 105 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 106 | "wf = wf" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 107 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 108 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 109 | "Min = Min" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 110 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 111 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 112 | "Inf_fin = Inf_fin" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 113 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 114 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 115 | "INFI = INFI" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 116 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 117 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 118 | "Max = Max" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 119 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 120 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 121 | "Sup_fin = Sup_fin" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 122 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 123 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 124 | "SUPR = SUPR" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 125 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 126 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 127 | "(Inf :: 'a set set \<Rightarrow> 'a set) = Inf" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 128 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 129 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 130 | "(Sup :: 'a set set \<Rightarrow> 'a set) = Sup" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 131 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 132 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 133 | "sorted_list_of_set = sorted_list_of_set" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 134 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 135 | lemma [code, code del]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 136 | "List.map_project = List.map_project" .. | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 137 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 138 | section {* Lemmas *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 139 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 140 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 141 | subsection {* Auxiliary lemmas *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 142 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 143 | lemma [simp]: "x \<noteq> Some () \<longleftrightarrow> x = None" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 144 | by (auto simp: not_Some_eq[THEN iffD1]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 145 | |
| 49928 | 146 | lemma Set_set_keys: "Set x = dom (lookup x)" | 
| 147 | by (auto simp: Set_def) | |
| 148 | ||
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 149 | lemma finite_Set [simp, intro!]: "finite (Set x)" | 
| 49928 | 150 | by (simp add: Set_set_keys) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 151 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 152 | lemma set_keys: "Set t = set(keys t)" | 
| 49928 | 153 | by (simp add: Set_set_keys lookup_keys) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 154 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 155 | subsection {* fold and filter *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 156 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 157 | lemma finite_fold_rbt_fold_eq: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 158 | assumes "comp_fun_commute f" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 159 | shows "Finite_Set.fold f A (set(entries t)) = fold (curry f) t A" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 160 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 161 | have *: "remdups (entries t) = entries t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 162 | using distinct_entries distinct_map by (auto intro: distinct_remdups_id) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 163 | show ?thesis using assms by (auto simp: fold_def_alt comp_fun_commute.fold_set_fold_remdups *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 164 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 165 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 166 | definition fold_keys :: "('a :: linorder \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a, _) rbt \<Rightarrow> 'b \<Rightarrow> 'b" 
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 167 | where [code_unfold]:"fold_keys f t A = fold (\<lambda>k _ t. f k t) t A" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 168 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 169 | lemma fold_keys_def_alt: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 170 | "fold_keys f t s = List.fold f (keys t) s" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 171 | by (auto simp: fold_map o_def split_def fold_def_alt keys_def_alt fold_keys_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 172 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 173 | lemma finite_fold_fold_keys: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 174 | assumes "comp_fun_commute f" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 175 | shows "Finite_Set.fold f A (Set t) = fold_keys f t A" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 176 | using assms | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 177 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 178 | interpret comp_fun_commute f by fact | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 179 | have "set (keys t) = fst ` (set (entries t))" by (auto simp: fst_eq_Domain keys_entries) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 180 | moreover have "inj_on fst (set (entries t))" using distinct_entries distinct_map by auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 181 | ultimately show ?thesis | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 182 | by (auto simp add: set_keys fold_keys_def curry_def fold_image finite_fold_rbt_fold_eq | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 183 | comp_comp_fun_commute) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 184 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 185 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 186 | definition rbt_filter :: "('a :: linorder \<Rightarrow> bool) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> 'a set" where
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 187 |   "rbt_filter P t = fold (\<lambda>k _ A'. if P k then Set.insert k A' else A') t {}"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 188 | |
| 49758 
718f10c8bbfc
use Set.filter instead of Finite_Set.filter, which is removed then
 kuncar parents: 
49757diff
changeset | 189 | lemma Set_filter_rbt_filter: | 
| 
718f10c8bbfc
use Set.filter instead of Finite_Set.filter, which is removed then
 kuncar parents: 
49757diff
changeset | 190 | "Set.filter P (Set t) = rbt_filter P t" | 
| 
718f10c8bbfc
use Set.filter instead of Finite_Set.filter, which is removed then
 kuncar parents: 
49757diff
changeset | 191 | by (simp add: fold_keys_def Set_filter_fold rbt_filter_def | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 192 | finite_fold_fold_keys[OF comp_fun_commute_filter_fold]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 193 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 194 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 195 | subsection {* foldi and Ball *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 196 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 197 | lemma Ball_False: "RBT_Impl.fold (\<lambda>k v s. s \<and> P k) t False = False" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 198 | by (induction t) auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 199 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 200 | lemma rbt_foldi_fold_conj: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 201 | "RBT_Impl.foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> P k) t val = RBT_Impl.fold (\<lambda>k v s. s \<and> P k) t val" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 202 | proof (induction t arbitrary: val) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 203 | case (Branch c t1) then show ?case | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 204 | by (cases "RBT_Impl.fold (\<lambda>k v s. s \<and> P k) t1 True") (simp_all add: Ball_False) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 205 | qed simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 206 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 207 | lemma foldi_fold_conj: "foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> P k) t val = fold_keys (\<lambda>k s. s \<and> P k) t val" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 208 | unfolding fold_keys_def by transfer (rule rbt_foldi_fold_conj) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 209 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 210 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 211 | subsection {* foldi and Bex *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 212 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 213 | lemma Bex_True: "RBT_Impl.fold (\<lambda>k v s. s \<or> P k) t True = True" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 214 | by (induction t) auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 215 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 216 | lemma rbt_foldi_fold_disj: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 217 | "RBT_Impl.foldi (\<lambda>s. s = False) (\<lambda>k v s. s \<or> P k) t val = RBT_Impl.fold (\<lambda>k v s. s \<or> P k) t val" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 218 | proof (induction t arbitrary: val) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 219 | case (Branch c t1) then show ?case | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 220 | by (cases "RBT_Impl.fold (\<lambda>k v s. s \<or> P k) t1 False") (simp_all add: Bex_True) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 221 | qed simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 222 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 223 | lemma foldi_fold_disj: "foldi (\<lambda>s. s = False) (\<lambda>k v s. s \<or> P k) t val = fold_keys (\<lambda>k s. s \<or> P k) t val" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 224 | unfolding fold_keys_def by transfer (rule rbt_foldi_fold_disj) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 225 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 226 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 227 | subsection {* folding over non empty trees and selecting the minimal and maximal element *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 228 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 229 | (** concrete **) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 230 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 231 | (* The concrete part is here because it's probably not general enough to be moved to RBT_Impl *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 232 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 233 | definition rbt_fold1_keys :: "('a \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> ('a::linorder, 'b) RBT_Impl.rbt \<Rightarrow> 'a" 
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 234 | where "rbt_fold1_keys f t = List.fold f (tl(RBT_Impl.keys t)) (hd(RBT_Impl.keys t))" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 235 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 236 | (* minimum *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 237 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 238 | definition rbt_min :: "('a::linorder, unit) RBT_Impl.rbt \<Rightarrow> 'a" 
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 239 | where "rbt_min t = rbt_fold1_keys min t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 240 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 241 | lemma key_le_right: "rbt_sorted (Branch c lt k v rt) \<Longrightarrow> (\<And>x. x \<in>set (RBT_Impl.keys rt) \<Longrightarrow> k \<le> x)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 242 | by (auto simp: rbt_greater_prop less_imp_le) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 243 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 244 | lemma left_le_key: "rbt_sorted (Branch c lt k v rt) \<Longrightarrow> (\<And>x. x \<in>set (RBT_Impl.keys lt) \<Longrightarrow> x \<le> k)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 245 | by (auto simp: rbt_less_prop less_imp_le) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 246 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 247 | lemma fold_min_triv: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 248 | fixes k :: "_ :: linorder" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 249 | shows "(\<forall>x\<in>set xs. k \<le> x) \<Longrightarrow> List.fold min xs k = k" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 250 | by (induct xs) (auto simp add: min_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 251 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 252 | lemma rbt_min_simps: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 253 | "is_rbt (Branch c RBT_Impl.Empty k v rt) \<Longrightarrow> rbt_min (Branch c RBT_Impl.Empty k v rt) = k" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 254 | by (auto intro: fold_min_triv dest: key_le_right is_rbt_rbt_sorted simp: rbt_fold1_keys_def rbt_min_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 255 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 256 | fun rbt_min_opt where | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 257 | "rbt_min_opt (Branch c RBT_Impl.Empty k v rt) = k" | | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 258 | "rbt_min_opt (Branch c (Branch lc llc lk lv lrt) k v rt) = rbt_min_opt (Branch lc llc lk lv lrt)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 259 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 260 | lemma rbt_min_opt_Branch: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 261 | "t1 \<noteq> rbt.Empty \<Longrightarrow> rbt_min_opt (Branch c t1 k () t2) = rbt_min_opt t1" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 262 | by (cases t1) auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 263 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 264 | lemma rbt_min_opt_induct [case_names empty left_empty left_non_empty]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 265 |   fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 266 | assumes "P rbt.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 267 | assumes "\<And>color t1 a b t2. P t1 \<Longrightarrow> P t2 \<Longrightarrow> t1 = rbt.Empty \<Longrightarrow> P (Branch color t1 a b t2)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 268 | assumes "\<And>color t1 a b t2. P t1 \<Longrightarrow> P t2 \<Longrightarrow> t1 \<noteq> rbt.Empty \<Longrightarrow> P (Branch color t1 a b t2)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 269 | shows "P t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 270 | using assms | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 271 | apply (induction t) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 272 | apply simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 273 | apply (case_tac "t1 = rbt.Empty") | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 274 | apply simp_all | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 275 | done | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 276 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 277 | lemma rbt_min_opt_in_set: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 278 |   fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 279 | assumes "t \<noteq> rbt.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 280 | shows "rbt_min_opt t \<in> set (RBT_Impl.keys t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 281 | using assms by (induction t rule: rbt_min_opt.induct) (auto) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 282 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 283 | lemma rbt_min_opt_is_min: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 284 |   fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 285 | assumes "rbt_sorted t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 286 | assumes "t \<noteq> rbt.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 287 | shows "\<And>y. y \<in> set (RBT_Impl.keys t) \<Longrightarrow> y \<ge> rbt_min_opt t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 288 | using assms | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 289 | proof (induction t rule: rbt_min_opt_induct) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 290 | case empty | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 291 | then show ?case by simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 292 | next | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 293 | case left_empty | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 294 | then show ?case by (auto intro: key_le_right simp del: rbt_sorted.simps) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 295 | next | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 296 | case (left_non_empty c t1 k v t2 y) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 297 | then have "y = k \<or> y \<in> set (RBT_Impl.keys t1) \<or> y \<in> set (RBT_Impl.keys t2)" by auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 298 | with left_non_empty show ?case | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 299 | proof(elim disjE) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 300 | case goal1 then show ?case | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 301 | by (auto simp add: rbt_min_opt_Branch intro: left_le_key rbt_min_opt_in_set) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 302 | next | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 303 | case goal2 with left_non_empty show ?case by (auto simp add: rbt_min_opt_Branch) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 304 | next | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 305 | case goal3 show ?case | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 306 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 307 | from goal3 have "rbt_min_opt t1 \<le> k" by (simp add: left_le_key rbt_min_opt_in_set) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 308 | moreover from goal3 have "k \<le> y" by (simp add: key_le_right) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 309 | ultimately show ?thesis using goal3 by (simp add: rbt_min_opt_Branch) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 310 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 311 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 312 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 313 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 314 | lemma rbt_min_eq_rbt_min_opt: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 315 | assumes "t \<noteq> RBT_Impl.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 316 | assumes "is_rbt t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 317 | shows "rbt_min t = rbt_min_opt t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 318 | proof - | 
| 51489 | 319 | from assms have "hd (RBT_Impl.keys t) # tl (RBT_Impl.keys t) = RBT_Impl.keys t" by (cases t) simp_all | 
| 320 | with assms show ?thesis | |
| 321 | by (simp add: rbt_min_def rbt_fold1_keys_def rbt_min_opt_is_min | |
| 51540 
eea5c4ca4a0e
explicit sublocale dependency for Min/Max yields more appropriate Min/Max prefix for a couple of facts
 haftmann parents: 
51489diff
changeset | 322 | Min.set_eq_fold [symmetric] Min_eqI rbt_min_opt_in_set) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 323 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 324 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 325 | (* maximum *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 326 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 327 | definition rbt_max :: "('a::linorder, unit) RBT_Impl.rbt \<Rightarrow> 'a" 
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 328 | where "rbt_max t = rbt_fold1_keys max t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 329 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 330 | lemma fold_max_triv: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 331 | fixes k :: "_ :: linorder" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 332 | shows "(\<forall>x\<in>set xs. x \<le> k) \<Longrightarrow> List.fold max xs k = k" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 333 | by (induct xs) (auto simp add: max_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 334 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 335 | lemma fold_max_rev_eq: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 336 |   fixes xs :: "('a :: linorder) list"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 337 | assumes "xs \<noteq> []" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 338 | shows "List.fold max (tl xs) (hd xs) = List.fold max (tl (rev xs)) (hd (rev xs))" | 
| 51540 
eea5c4ca4a0e
explicit sublocale dependency for Min/Max yields more appropriate Min/Max prefix for a couple of facts
 haftmann parents: 
51489diff
changeset | 339 | using assms by (simp add: Max.set_eq_fold [symmetric]) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 340 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 341 | lemma rbt_max_simps: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 342 | assumes "is_rbt (Branch c lt k v RBT_Impl.Empty)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 343 | shows "rbt_max (Branch c lt k v RBT_Impl.Empty) = k" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 344 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 345 | have "List.fold max (tl (rev(RBT_Impl.keys lt @ [k]))) (hd (rev(RBT_Impl.keys lt @ [k]))) = k" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 346 | using assms by (auto intro!: fold_max_triv dest!: left_le_key is_rbt_rbt_sorted) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 347 | then show ?thesis by (auto simp add: rbt_max_def rbt_fold1_keys_def fold_max_rev_eq) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 348 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 349 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 350 | fun rbt_max_opt where | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 351 | "rbt_max_opt (Branch c lt k v RBT_Impl.Empty) = k" | | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 352 | "rbt_max_opt (Branch c lt k v (Branch rc rlc rk rv rrt)) = rbt_max_opt (Branch rc rlc rk rv rrt)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 353 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 354 | lemma rbt_max_opt_Branch: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 355 | "t2 \<noteq> rbt.Empty \<Longrightarrow> rbt_max_opt (Branch c t1 k () t2) = rbt_max_opt t2" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 356 | by (cases t2) auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 357 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 358 | lemma rbt_max_opt_induct [case_names empty right_empty right_non_empty]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 359 |   fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 360 | assumes "P rbt.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 361 | assumes "\<And>color t1 a b t2. P t1 \<Longrightarrow> P t2 \<Longrightarrow> t2 = rbt.Empty \<Longrightarrow> P (Branch color t1 a b t2)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 362 | assumes "\<And>color t1 a b t2. P t1 \<Longrightarrow> P t2 \<Longrightarrow> t2 \<noteq> rbt.Empty \<Longrightarrow> P (Branch color t1 a b t2)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 363 | shows "P t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 364 | using assms | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 365 | apply (induction t) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 366 | apply simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 367 | apply (case_tac "t2 = rbt.Empty") | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 368 | apply simp_all | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 369 | done | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 370 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 371 | lemma rbt_max_opt_in_set: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 372 |   fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 373 | assumes "t \<noteq> rbt.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 374 | shows "rbt_max_opt t \<in> set (RBT_Impl.keys t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 375 | using assms by (induction t rule: rbt_max_opt.induct) (auto) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 376 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 377 | lemma rbt_max_opt_is_max: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 378 |   fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 379 | assumes "rbt_sorted t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 380 | assumes "t \<noteq> rbt.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 381 | shows "\<And>y. y \<in> set (RBT_Impl.keys t) \<Longrightarrow> y \<le> rbt_max_opt t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 382 | using assms | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 383 | proof (induction t rule: rbt_max_opt_induct) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 384 | case empty | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 385 | then show ?case by simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 386 | next | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 387 | case right_empty | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 388 | then show ?case by (auto intro: left_le_key simp del: rbt_sorted.simps) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 389 | next | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 390 | case (right_non_empty c t1 k v t2 y) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 391 | then have "y = k \<or> y \<in> set (RBT_Impl.keys t2) \<or> y \<in> set (RBT_Impl.keys t1)" by auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 392 | with right_non_empty show ?case | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 393 | proof(elim disjE) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 394 | case goal1 then show ?case | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 395 | by (auto simp add: rbt_max_opt_Branch intro: key_le_right rbt_max_opt_in_set) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 396 | next | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 397 | case goal2 with right_non_empty show ?case by (auto simp add: rbt_max_opt_Branch) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 398 | next | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 399 | case goal3 show ?case | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 400 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 401 | from goal3 have "rbt_max_opt t2 \<ge> k" by (simp add: key_le_right rbt_max_opt_in_set) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 402 | moreover from goal3 have "y \<le> k" by (simp add: left_le_key) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 403 | ultimately show ?thesis using goal3 by (simp add: rbt_max_opt_Branch) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 404 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 405 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 406 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 407 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 408 | lemma rbt_max_eq_rbt_max_opt: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 409 | assumes "t \<noteq> RBT_Impl.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 410 | assumes "is_rbt t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 411 | shows "rbt_max t = rbt_max_opt t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 412 | proof - | 
| 51489 | 413 | from assms have "hd (RBT_Impl.keys t) # tl (RBT_Impl.keys t) = RBT_Impl.keys t" by (cases t) simp_all | 
| 414 | with assms show ?thesis | |
| 415 | by (simp add: rbt_max_def rbt_fold1_keys_def rbt_max_opt_is_max | |
| 51540 
eea5c4ca4a0e
explicit sublocale dependency for Min/Max yields more appropriate Min/Max prefix for a couple of facts
 haftmann parents: 
51489diff
changeset | 416 | Max.set_eq_fold [symmetric] Max_eqI rbt_max_opt_in_set) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 417 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 418 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 419 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 420 | (** abstract **) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 421 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 422 | lift_definition fold1_keys :: "('a \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> ('a::linorder, 'b) rbt \<Rightarrow> 'a"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 423 | is rbt_fold1_keys by simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 424 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 425 | lemma fold1_keys_def_alt: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 426 | "fold1_keys f t = List.fold f (tl(keys t)) (hd(keys t))" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 427 | by transfer (simp add: rbt_fold1_keys_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 428 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 429 | lemma finite_fold1_fold1_keys: | 
| 51489 | 430 | assumes "semilattice f" | 
| 431 | assumes "\<not> is_empty t" | |
| 432 | shows "semilattice_set.F f (Set t) = fold1_keys f t" | |
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 433 | proof - | 
| 51489 | 434 | from `semilattice f` interpret semilattice_set f by (rule semilattice_set.intro) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 435 | show ?thesis using assms | 
| 51489 | 436 | by (auto simp: fold1_keys_def_alt set_keys fold_def_alt non_empty_keys set_eq_fold [symmetric]) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 437 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 438 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 439 | (* minimum *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 440 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 441 | lift_definition r_min :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_min by simp
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 442 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 443 | lift_definition r_min_opt :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_min_opt by simp
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 444 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 445 | lemma r_min_alt_def: "r_min t = fold1_keys min t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 446 | by transfer (simp add: rbt_min_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 447 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 448 | lemma r_min_eq_r_min_opt: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 449 | assumes "\<not> (is_empty t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 450 | shows "r_min t = r_min_opt t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 451 | using assms unfolding is_empty_empty by transfer (auto intro: rbt_min_eq_rbt_min_opt) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 452 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 453 | lemma fold_keys_min_top_eq: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 454 |   fixes t :: "('a :: {linorder, bounded_lattice_top}, unit) rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 455 | assumes "\<not> (is_empty t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 456 | shows "fold_keys min t top = fold1_keys min t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 457 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 458 | have *: "\<And>t. RBT_Impl.keys t \<noteq> [] \<Longrightarrow> List.fold min (RBT_Impl.keys t) top = | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 459 | List.fold min (hd(RBT_Impl.keys t) # tl(RBT_Impl.keys t)) top" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 460 | by (simp add: hd_Cons_tl[symmetric]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 461 |   { fix x :: "_ :: {linorder, bounded_lattice_top}" and xs
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 462 | have "List.fold min (x#xs) top = List.fold min xs x" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 463 | by (simp add: inf_min[symmetric]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 464 | } note ** = this | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 465 | show ?thesis using assms | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 466 | unfolding fold_keys_def_alt fold1_keys_def_alt is_empty_empty | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 467 | apply transfer | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 468 | apply (case_tac t) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 469 | apply simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 470 | apply (subst *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 471 | apply simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 472 | apply (subst **) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 473 | apply simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 474 | done | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 475 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 476 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 477 | (* maximum *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 478 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 479 | lift_definition r_max :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_max by simp
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 480 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 481 | lift_definition r_max_opt :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_max_opt by simp
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 482 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 483 | lemma r_max_alt_def: "r_max t = fold1_keys max t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 484 | by transfer (simp add: rbt_max_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 485 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 486 | lemma r_max_eq_r_max_opt: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 487 | assumes "\<not> (is_empty t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 488 | shows "r_max t = r_max_opt t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 489 | using assms unfolding is_empty_empty by transfer (auto intro: rbt_max_eq_rbt_max_opt) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 490 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 491 | lemma fold_keys_max_bot_eq: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 492 |   fixes t :: "('a :: {linorder, bounded_lattice_bot}, unit) rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 493 | assumes "\<not> (is_empty t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 494 | shows "fold_keys max t bot = fold1_keys max t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 495 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 496 | have *: "\<And>t. RBT_Impl.keys t \<noteq> [] \<Longrightarrow> List.fold max (RBT_Impl.keys t) bot = | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 497 | List.fold max (hd(RBT_Impl.keys t) # tl(RBT_Impl.keys t)) bot" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 498 | by (simp add: hd_Cons_tl[symmetric]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 499 |   { fix x :: "_ :: {linorder, bounded_lattice_bot}" and xs
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 500 | have "List.fold max (x#xs) bot = List.fold max xs x" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 501 | by (simp add: sup_max[symmetric]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 502 | } note ** = this | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 503 | show ?thesis using assms | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 504 | unfolding fold_keys_def_alt fold1_keys_def_alt is_empty_empty | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 505 | apply transfer | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 506 | apply (case_tac t) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 507 | apply simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 508 | apply (subst *) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 509 | apply simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 510 | apply (subst **) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 511 | apply simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 512 | done | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 513 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 514 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 515 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 516 | section {* Code equations *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 517 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 518 | code_datatype Set Coset | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 519 | |
| 50996 
51ad7b4ac096
restore code equations for List.set in RBT_Set; make Scala happy according to 7.1 in the code generator manual
 kuncar parents: 
49948diff
changeset | 520 | declare set.simps[code] | 
| 
51ad7b4ac096
restore code equations for List.set in RBT_Set; make Scala happy according to 7.1 in the code generator manual
 kuncar parents: 
49948diff
changeset | 521 | |
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 522 | lemma empty_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 523 | "Set.empty = Set RBT.empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 524 | by (auto simp: Set_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 525 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 526 | lemma UNIV_Coset [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 527 | "UNIV = Coset RBT.empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 528 | by (auto simp: Set_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 529 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 530 | lemma is_empty_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 531 | "Set.is_empty (Set t) = RBT.is_empty t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 532 | unfolding Set.is_empty_def by (auto simp: fun_eq_iff Set_def intro: lookup_empty_empty[THEN iffD1]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 533 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 534 | lemma compl_code [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 535 | "- Set xs = Coset xs" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 536 | "- Coset xs = Set xs" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 537 | by (simp_all add: Set_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 538 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 539 | lemma member_code [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 540 | "x \<in> (Set t) = (RBT.lookup t x = Some ())" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 541 | "x \<in> (Coset t) = (RBT.lookup t x = None)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 542 | by (simp_all add: Set_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 543 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 544 | lemma insert_code [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 545 | "Set.insert x (Set t) = Set (RBT.insert x () t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 546 | "Set.insert x (Coset t) = Coset (RBT.delete x t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 547 | by (auto simp: Set_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 548 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 549 | lemma remove_code [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 550 | "Set.remove x (Set t) = Set (RBT.delete x t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 551 | "Set.remove x (Coset t) = Coset (RBT.insert x () t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 552 | by (auto simp: Set_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 553 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 554 | lemma union_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 555 | "Set t \<union> A = fold_keys Set.insert t A" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 556 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 557 | interpret comp_fun_idem Set.insert | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 558 | by (fact comp_fun_idem_insert) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 559 | from finite_fold_fold_keys[OF `comp_fun_commute Set.insert`] | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 560 | show ?thesis by (auto simp add: union_fold_insert) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 561 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 562 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 563 | lemma inter_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 564 | "A \<inter> Set t = rbt_filter (\<lambda>k. k \<in> A) t" | 
| 49758 
718f10c8bbfc
use Set.filter instead of Finite_Set.filter, which is removed then
 kuncar parents: 
49757diff
changeset | 565 | by (simp add: inter_Set_filter Set_filter_rbt_filter) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 566 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 567 | lemma minus_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 568 | "A - Set t = fold_keys Set.remove t A" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 569 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 570 | interpret comp_fun_idem Set.remove | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 571 | by (fact comp_fun_idem_remove) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 572 | from finite_fold_fold_keys[OF `comp_fun_commute Set.remove`] | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 573 | show ?thesis by (auto simp add: minus_fold_remove) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 574 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 575 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 576 | lemma union_Coset [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 577 | "Coset t \<union> A = - rbt_filter (\<lambda>k. k \<notin> A) t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 578 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 579 | have *: "\<And>A B. (-A \<union> B) = -(-B \<inter> A)" by blast | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 580 | show ?thesis by (simp del: boolean_algebra_class.compl_inf add: * inter_Set) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 581 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 582 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 583 | lemma union_Set_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 584 | "Set t1 \<union> Set t2 = Set (union t1 t2)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 585 | by (auto simp add: lookup_union map_add_Some_iff Set_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 586 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 587 | lemma inter_Coset [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 588 | "A \<inter> Coset t = fold_keys Set.remove t A" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 589 | by (simp add: Diff_eq [symmetric] minus_Set) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 590 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 591 | lemma inter_Coset_Coset [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 592 | "Coset t1 \<inter> Coset t2 = Coset (union t1 t2)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 593 | by (auto simp add: lookup_union map_add_Some_iff Set_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 594 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 595 | lemma minus_Coset [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 596 | "A - Coset t = rbt_filter (\<lambda>k. k \<in> A) t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 597 | by (simp add: inter_Set[simplified Int_commute]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 598 | |
| 49757 
73ab6d4a9236
rename Set.project to Set.filter - more appropriate name
 kuncar parents: 
48623diff
changeset | 599 | lemma filter_Set [code]: | 
| 
73ab6d4a9236
rename Set.project to Set.filter - more appropriate name
 kuncar parents: 
48623diff
changeset | 600 | "Set.filter P (Set t) = (rbt_filter P t)" | 
| 49758 
718f10c8bbfc
use Set.filter instead of Finite_Set.filter, which is removed then
 kuncar parents: 
49757diff
changeset | 601 | by (auto simp add: Set_filter_rbt_filter) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 602 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 603 | lemma image_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 604 |   "image f (Set t) = fold_keys (\<lambda>k A. Set.insert (f k) A) t {}"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 605 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 606 | have "comp_fun_commute (\<lambda>k. Set.insert (f k))" by default auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 607 | then show ?thesis by (auto simp add: image_fold_insert intro!: finite_fold_fold_keys) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 608 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 609 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 610 | lemma Ball_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 611 | "Ball (Set t) P \<longleftrightarrow> foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> P k) t True" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 612 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 613 | have "comp_fun_commute (\<lambda>k s. s \<and> P k)" by default auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 614 | then show ?thesis | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 615 | by (simp add: foldi_fold_conj[symmetric] Ball_fold finite_fold_fold_keys) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 616 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 617 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 618 | lemma Bex_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 619 | "Bex (Set t) P \<longleftrightarrow> foldi (\<lambda>s. s = False) (\<lambda>k v s. s \<or> P k) t False" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 620 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 621 | have "comp_fun_commute (\<lambda>k s. s \<or> P k)" by default auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 622 | then show ?thesis | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 623 | by (simp add: foldi_fold_disj[symmetric] Bex_fold finite_fold_fold_keys) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 624 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 625 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 626 | lemma subset_code [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 627 | "Set t \<le> B \<longleftrightarrow> (\<forall>x\<in>Set t. x \<in> B)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 628 | "A \<le> Coset t \<longleftrightarrow> (\<forall>y\<in>Set t. y \<notin> A)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 629 | by auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 630 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 631 | definition non_empty_trees where [code del]: "non_empty_trees t1 t2 \<longleftrightarrow> Coset t1 \<le> Set t2" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 632 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 633 | code_abort non_empty_trees | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 634 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 635 | lemma subset_Coset_empty_Set_empty [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 636 | "Coset t1 \<le> Set t2 \<longleftrightarrow> (case (impl_of t1, impl_of t2) of | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 637 | (rbt.Empty, rbt.Empty) => False | | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 638 | (_, _) => non_empty_trees t1 t2)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 639 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 640 | have *: "\<And>t. impl_of t = rbt.Empty \<Longrightarrow> t = RBT rbt.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 641 | by (subst(asm) RBT_inverse[symmetric]) (auto simp: impl_of_inject) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 642 | have **: "Lifting.invariant is_rbt rbt.Empty rbt.Empty" unfolding Lifting.invariant_def by simp | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 643 | show ?thesis | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 644 | by (auto simp: Set_def lookup.abs_eq[OF **] dest!: * split: rbt.split simp: non_empty_trees_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 645 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 646 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 647 | text {* A frequent case – avoid intermediate sets *}
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 648 | lemma [code_unfold]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 649 | "Set t1 \<subseteq> Set t2 \<longleftrightarrow> foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> k \<in> Set t2) t1 True" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 650 | by (simp add: subset_code Ball_Set) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 651 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 652 | lemma card_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 653 | "card (Set t) = fold_keys (\<lambda>_ n. n + 1) t 0" | 
| 51489 | 654 | by (auto simp add: card.eq_fold intro: finite_fold_fold_keys comp_fun_commute_const) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 655 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 656 | lemma setsum_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 657 | "setsum f (Set xs) = fold_keys (plus o f) xs 0" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 658 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 659 | have "comp_fun_commute (\<lambda>x. op + (f x))" by default (auto simp: add_ac) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 660 | then show ?thesis | 
| 51489 | 661 | by (auto simp add: setsum.eq_fold finite_fold_fold_keys o_def) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 662 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 663 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 664 | definition not_a_singleton_tree where [code del]: "not_a_singleton_tree x y = x y" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 665 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 666 | code_abort not_a_singleton_tree | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 667 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 668 | lemma the_elem_set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 669 |   fixes t :: "('a :: linorder, unit) rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 670 | shows "the_elem (Set t) = (case impl_of t of | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 671 | (Branch RBT_Impl.B RBT_Impl.Empty x () RBT_Impl.Empty) \<Rightarrow> x | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 672 | | _ \<Rightarrow> not_a_singleton_tree the_elem (Set t))" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 673 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 674 |   {
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 675 | fix x :: "'a :: linorder" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 676 | let ?t = "Branch RBT_Impl.B RBT_Impl.Empty x () RBT_Impl.Empty" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 677 |     have *:"?t \<in> {t. is_rbt t}" unfolding is_rbt_def by auto
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 678 | then have **:"Lifting.invariant is_rbt ?t ?t" unfolding Lifting.invariant_def by auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 679 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 680 | have "impl_of t = ?t \<Longrightarrow> the_elem (Set t) = x" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 681 | by (subst(asm) RBT_inverse[symmetric, OF *]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 682 | (auto simp: Set_def the_elem_def lookup.abs_eq[OF **] impl_of_inject) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 683 | } | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 684 | then show ?thesis unfolding not_a_singleton_tree_def | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 685 | by(auto split: rbt.split unit.split color.split) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 686 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 687 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 688 | lemma Pow_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 689 |   "Pow (Set t) = fold_keys (\<lambda>x A. A \<union> Set.insert x ` A) t {{}}"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 690 | by (simp add: Pow_fold finite_fold_fold_keys[OF comp_fun_commute_Pow_fold]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 691 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 692 | lemma product_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 693 | "Product_Type.product (Set t1) (Set t2) = | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 694 |     fold_keys (\<lambda>x A. fold_keys (\<lambda>y. Set.insert (x, y)) t2 A) t1 {}"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 695 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 696 | have *:"\<And>x. comp_fun_commute (\<lambda>y. Set.insert (x, y))" by default auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 697 |   show ?thesis using finite_fold_fold_keys[OF comp_fun_commute_product_fold, of "Set t2" "{}" "t1"]  
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 698 | by (simp add: product_fold Product_Type.product_def finite_fold_fold_keys[OF *]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 699 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 700 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 701 | lemma Id_on_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 702 |   "Id_on (Set t) =  fold_keys (\<lambda>x. Set.insert (x, x)) t {}"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 703 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 704 | have "comp_fun_commute (\<lambda>x. Set.insert (x, x))" by default auto | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 705 | then show ?thesis | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 706 | by (auto simp add: Id_on_fold intro!: finite_fold_fold_keys) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 707 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 708 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 709 | lemma Image_Set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 710 |   "(Set t) `` S = fold_keys (\<lambda>(x,y) A. if x \<in> S then Set.insert y A else A) t {}"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 711 | by (auto simp add: Image_fold finite_fold_fold_keys[OF comp_fun_commute_Image_fold]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 712 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 713 | lemma trancl_set_ntrancl [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 714 | "trancl (Set t) = ntrancl (card (Set t) - 1) (Set t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 715 | by (simp add: finite_trancl_ntranl) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 716 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 717 | lemma relcomp_Set[code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 718 | "(Set t1) O (Set t2) = fold_keys | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 719 |     (\<lambda>(x,y) A. fold_keys (\<lambda>(w,z) A'. if y = w then Set.insert (x,z) A' else A') t2 A) t1 {}"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 720 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 721 | interpret comp_fun_idem Set.insert by (fact comp_fun_idem_insert) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 722 | have *: "\<And>x y. comp_fun_commute (\<lambda>(w, z) A'. if y = w then Set.insert (x, z) A' else A')" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 723 | by default (auto simp add: fun_eq_iff) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 724 |   show ?thesis using finite_fold_fold_keys[OF comp_fun_commute_relcomp_fold, of "Set t2" "{}" t1]
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 725 | by (simp add: relcomp_fold finite_fold_fold_keys[OF *]) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 726 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 727 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 728 | lemma wf_set [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 729 | "wf (Set t) = acyclic (Set t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 730 | by (simp add: wf_iff_acyclic_if_finite) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 731 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 732 | definition not_non_empty_tree where [code del]: "not_non_empty_tree x y = x y" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 733 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 734 | code_abort not_non_empty_tree | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 735 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 736 | lemma Min_fin_set_fold [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 737 | "Min (Set t) = (if is_empty t then not_non_empty_tree Min (Set t) else r_min_opt t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 738 | proof - | 
| 51489 | 739 | have *: "semilattice (min :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)" .. | 
| 740 | with finite_fold1_fold1_keys [OF *, folded Min_def] | |
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 741 | show ?thesis | 
| 51489 | 742 | by (simp add: not_non_empty_tree_def r_min_alt_def r_min_eq_r_min_opt [symmetric]) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 743 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 744 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 745 | lemma Inf_fin_set_fold [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 746 | "Inf_fin (Set t) = Min (Set t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 747 | by (simp add: inf_min Inf_fin_def Min_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 748 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 749 | lemma Inf_Set_fold: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 750 |   fixes t :: "('a :: {linorder, complete_lattice}, unit) rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 751 | shows "Inf (Set t) = (if is_empty t then top else r_min_opt t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 752 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 753 | have "comp_fun_commute (min :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)" by default (simp add: fun_eq_iff ac_simps) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 754 | then have "t \<noteq> empty \<Longrightarrow> Finite_Set.fold min top (Set t) = fold1_keys min t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 755 | by (simp add: finite_fold_fold_keys fold_keys_min_top_eq) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 756 | then show ?thesis | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 757 | by (auto simp add: Inf_fold_inf inf_min empty_Set[symmetric] r_min_eq_r_min_opt[symmetric] r_min_alt_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 758 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 759 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 760 | definition Inf' :: "'a :: {linorder, complete_lattice} set \<Rightarrow> 'a" where [code del]: "Inf' x = Inf x"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 761 | declare Inf'_def[symmetric, code_unfold] | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 762 | declare Inf_Set_fold[folded Inf'_def, code] | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 763 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 764 | lemma INFI_Set_fold [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 765 | "INFI (Set t) f = fold_keys (inf \<circ> f) t top" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 766 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 767 | have "comp_fun_commute ((inf :: 'a \<Rightarrow> 'a \<Rightarrow> 'a) \<circ> f)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 768 | by default (auto simp add: fun_eq_iff ac_simps) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 769 | then show ?thesis | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 770 | by (auto simp: INF_fold_inf finite_fold_fold_keys) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 771 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 772 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 773 | lemma Max_fin_set_fold [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 774 | "Max (Set t) = (if is_empty t then not_non_empty_tree Max (Set t) else r_max_opt t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 775 | proof - | 
| 51489 | 776 | have *: "semilattice (max :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)" .. | 
| 777 | with finite_fold1_fold1_keys [OF *, folded Max_def] | |
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 778 | show ?thesis | 
| 51489 | 779 | by (simp add: not_non_empty_tree_def r_max_alt_def r_max_eq_r_max_opt [symmetric]) | 
| 48623 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 780 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 781 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 782 | lemma Sup_fin_set_fold [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 783 | "Sup_fin (Set t) = Max (Set t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 784 | by (simp add: sup_max Sup_fin_def Max_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 785 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 786 | lemma Sup_Set_fold: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 787 |   fixes t :: "('a :: {linorder, complete_lattice}, unit) rbt"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 788 | shows "Sup (Set t) = (if is_empty t then bot else r_max_opt t)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 789 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 790 | have "comp_fun_commute (max :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)" by default (simp add: fun_eq_iff ac_simps) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 791 | then have "t \<noteq> empty \<Longrightarrow> Finite_Set.fold max bot (Set t) = fold1_keys max t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 792 | by (simp add: finite_fold_fold_keys fold_keys_max_bot_eq) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 793 | then show ?thesis | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 794 | by (auto simp add: Sup_fold_sup sup_max empty_Set[symmetric] r_max_eq_r_max_opt[symmetric] r_max_alt_def) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 795 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 796 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 797 | definition Sup' :: "'a :: {linorder, complete_lattice} set \<Rightarrow> 'a" where [code del]: "Sup' x = Sup x"
 | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 798 | declare Sup'_def[symmetric, code_unfold] | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 799 | declare Sup_Set_fold[folded Sup'_def, code] | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 800 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 801 | lemma SUPR_Set_fold [code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 802 | "SUPR (Set t) f = fold_keys (sup \<circ> f) t bot" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 803 | proof - | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 804 | have "comp_fun_commute ((sup :: 'a \<Rightarrow> 'a \<Rightarrow> 'a) \<circ> f)" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 805 | by default (auto simp add: fun_eq_iff ac_simps) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 806 | then show ?thesis | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 807 | by (auto simp: SUP_fold_sup finite_fold_fold_keys) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 808 | qed | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 809 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 810 | lemma sorted_list_set[code]: | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 811 | "sorted_list_of_set (Set t) = keys t" | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 812 | by (auto simp add: set_keys intro: sorted_distinct_set_unique) | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 813 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 814 | hide_const (open) RBT_Set.Set RBT_Set.Coset | 
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 815 | |
| 
bea613f2543d
implementation of sets by RBT trees for the code generator
 kuncar parents: diff
changeset | 816 | end |