| author | wenzelm | 
| Mon, 24 Jun 2019 16:26:25 +0200 | |
| changeset 70359 | 470d4f145e4c | 
| parent 68109 | cebf36c14226 | 
| child 73707 | 06aeb9054c07 | 
| 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  | 
|
| 60500 | 5  | 
section \<open>Implementation of sets using RBT trees\<close>  | 
| 
48623
 
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: 
50996 
diff
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  | 
| 
58301
 
de95aeedf49e
fixed situation in 'primrec' whereby the original value of a constructor argument of nested type was not translated correctly to a 'map fst'
 
blanchet 
parents: 
57816 
diff
changeset
 | 
13  | 
outside of List.thy using 'a list as an implementation of sets cannot be  | 
| 
48623
 
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  | 
|
| 60500 | 19  | 
section \<open>Definition of code datatype constructors\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
20  | 
|
| 61076 | 21  | 
definition Set :: "('a::linorder, unit) rbt \<Rightarrow> 'a set" 
 | 
| 56019 | 22  | 
  where "Set t = {x . RBT.lookup t x = Some ()}"
 | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
23  | 
|
| 61076 | 24  | 
definition Coset :: "('a::linorder, unit) rbt \<Rightarrow> 'a set" 
 | 
| 
48623
 
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  | 
|
| 60500 | 28  | 
section \<open>Deletion of already existing code equations\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
29  | 
|
| 66148 | 30  | 
declare [[code drop: Set.empty Set.is_empty uminus_set_inst.uminus_set  | 
31  | 
Set.member Set.insert Set.remove UNIV Set.filter image  | 
|
32  | 
Set.subset_eq Ball Bex can_select Set.union minus_set_inst.minus_set Set.inter  | 
|
33  | 
card the_elem Pow sum prod Product_Type.product Id_on  | 
|
34  | 
Image trancl relcomp wf Min Inf_fin Max Sup_fin  | 
|
35  | 
"(Inf :: 'a set set \<Rightarrow> 'a set)" "(Sup :: 'a set set \<Rightarrow> 'a set)"  | 
|
36  | 
sorted_list_of_set List.map_project List.Bleast]]  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
37  | 
|
| 53955 | 38  | 
|
| 60500 | 39  | 
section \<open>Lemmas\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
40  | 
|
| 60500 | 41  | 
subsection \<open>Auxiliary lemmas\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
42  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
43  | 
lemma [simp]: "x \<noteq> Some () \<longleftrightarrow> x = None"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
44  | 
by (auto simp: not_Some_eq[THEN iffD1])  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
45  | 
|
| 56019 | 46  | 
lemma Set_set_keys: "Set x = dom (RBT.lookup x)"  | 
| 49928 | 47  | 
by (auto simp: Set_def)  | 
48  | 
||
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
49  | 
lemma finite_Set [simp, intro!]: "finite (Set x)"  | 
| 49928 | 50  | 
by (simp add: Set_set_keys)  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
51  | 
|
| 56019 | 52  | 
lemma set_keys: "Set t = set(RBT.keys t)"  | 
| 49928 | 53  | 
by (simp add: Set_set_keys lookup_keys)  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
54  | 
|
| 60500 | 55  | 
subsection \<open>fold and filter\<close>  | 
| 
48623
 
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 finite_fold_rbt_fold_eq:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
58  | 
assumes "comp_fun_commute f"  | 
| 56019 | 59  | 
shows "Finite_Set.fold f A (set (RBT.entries t)) = RBT.fold (curry f) t A"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
60  | 
proof -  | 
| 56019 | 61  | 
have *: "remdups (RBT.entries t) = RBT.entries t"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
62  | 
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
 | 
63  | 
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
 | 
64  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
65  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
66  | 
definition fold_keys :: "('a :: linorder \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a, _) rbt \<Rightarrow> 'b \<Rightarrow> 'b" 
 | 
| 56019 | 67  | 
where [code_unfold]:"fold_keys f t A = RBT.fold (\<lambda>k _ t. f k t) t A"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
68  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
69  | 
lemma fold_keys_def_alt:  | 
| 56019 | 70  | 
"fold_keys f t s = List.fold f (RBT.keys t) s"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
71  | 
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
 | 
72  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
73  | 
lemma finite_fold_fold_keys:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
74  | 
assumes "comp_fun_commute f"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
75  | 
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
 | 
76  | 
using assms  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
77  | 
proof -  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
78  | 
interpret comp_fun_commute f by fact  | 
| 56019 | 79  | 
have "set (RBT.keys t) = fst ` (set (RBT.entries t))" by (auto simp: fst_eq_Domain keys_entries)  | 
80  | 
moreover have "inj_on fst (set (RBT.entries t))" using distinct_entries distinct_map by auto  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
81  | 
ultimately show ?thesis  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
82  | 
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
 | 
83  | 
comp_comp_fun_commute)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
84  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
85  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
86  | 
definition rbt_filter :: "('a :: linorder \<Rightarrow> bool) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> 'a set" where
 | 
| 56019 | 87  | 
  "rbt_filter P t = RBT.fold (\<lambda>k _ A'. if P k then Set.insert k A' else A') t {}"
 | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
88  | 
|
| 
49758
 
718f10c8bbfc
use Set.filter instead of Finite_Set.filter, which is removed then
 
kuncar 
parents: 
49757 
diff
changeset
 | 
89  | 
lemma Set_filter_rbt_filter:  | 
| 
 
718f10c8bbfc
use Set.filter instead of Finite_Set.filter, which is removed then
 
kuncar 
parents: 
49757 
diff
changeset
 | 
90  | 
"Set.filter P (Set t) = rbt_filter P t"  | 
| 
 
718f10c8bbfc
use Set.filter instead of Finite_Set.filter, which is removed then
 
kuncar 
parents: 
49757 
diff
changeset
 | 
91  | 
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
 | 
92  | 
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
 | 
93  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
94  | 
|
| 60500 | 95  | 
subsection \<open>foldi and Ball\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
96  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
97  | 
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
 | 
98  | 
by (induction t) auto  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
99  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
100  | 
lemma rbt_foldi_fold_conj:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
101  | 
"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
 | 
102  | 
proof (induction t arbitrary: val)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
103  | 
case (Branch c t1) then show ?case  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
104  | 
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
 | 
105  | 
qed simp  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
106  | 
|
| 56019 | 107  | 
lemma foldi_fold_conj: "RBT.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"  | 
108  | 
unfolding fold_keys_def including rbt.lifting by transfer (rule rbt_foldi_fold_conj)  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
109  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
110  | 
|
| 60500 | 111  | 
subsection \<open>foldi and Bex\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
112  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
113  | 
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
 | 
114  | 
by (induction t) auto  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
115  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
116  | 
lemma rbt_foldi_fold_disj:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
117  | 
"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
 | 
118  | 
proof (induction t arbitrary: val)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
119  | 
case (Branch c t1) then show ?case  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
120  | 
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
 | 
121  | 
qed simp  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
122  | 
|
| 56019 | 123  | 
lemma foldi_fold_disj: "RBT.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"  | 
124  | 
unfolding fold_keys_def including rbt.lifting by transfer (rule rbt_foldi_fold_disj)  | 
|
| 
48623
 
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  | 
|
| 60500 | 127  | 
subsection \<open>folding over non empty trees and selecting the minimal and maximal element\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
128  | 
|
| 67408 | 129  | 
subsubsection \<open>concrete\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
130  | 
|
| 67408 | 131  | 
text \<open>The concrete part is here because it's probably not general enough to be moved to \<open>RBT_Impl\<close>\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
132  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
133  | 
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
 | 
134  | 
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
 | 
135  | 
|
| 67408 | 136  | 
|
137  | 
paragraph \<open>minimum\<close>  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
138  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
139  | 
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
 | 
140  | 
where "rbt_min t = rbt_fold1_keys min t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
141  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
142  | 
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
 | 
143  | 
by (auto simp: rbt_greater_prop less_imp_le)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
144  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
145  | 
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
 | 
146  | 
by (auto simp: rbt_less_prop less_imp_le)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
147  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
148  | 
lemma fold_min_triv:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
149  | 
fixes k :: "_ :: linorder"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
150  | 
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
 | 
151  | 
by (induct xs) (auto simp add: min_def)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
152  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
153  | 
lemma rbt_min_simps:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
154  | 
"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
 | 
155  | 
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
 | 
156  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
157  | 
fun rbt_min_opt where  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
158  | 
"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
 | 
159  | 
"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
 | 
160  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
161  | 
lemma rbt_min_opt_Branch:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
162  | 
"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
 | 
163  | 
by (cases t1) auto  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
164  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
165  | 
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
 | 
166  | 
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
167  | 
assumes "P rbt.Empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
168  | 
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
 | 
169  | 
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
 | 
170  | 
shows "P t"  | 
| 63649 | 171  | 
using assms  | 
172  | 
proof (induct t)  | 
|
173  | 
case Empty  | 
|
174  | 
then show ?case by simp  | 
|
175  | 
next  | 
|
176  | 
case (Branch x1 t1 x3 x4 t2)  | 
|
177  | 
then show ?case by (cases "t1 = rbt.Empty") simp_all  | 
|
178  | 
qed  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
179  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
180  | 
lemma rbt_min_opt_in_set:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
181  | 
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
182  | 
assumes "t \<noteq> rbt.Empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
183  | 
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
 | 
184  | 
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
 | 
185  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
186  | 
lemma rbt_min_opt_is_min:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
187  | 
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
188  | 
assumes "rbt_sorted t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
189  | 
assumes "t \<noteq> rbt.Empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
190  | 
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
 | 
191  | 
using assms  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
192  | 
proof (induction t rule: rbt_min_opt_induct)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
193  | 
case empty  | 
| 60580 | 194  | 
then show ?case by simp  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
195  | 
next  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
196  | 
case left_empty  | 
| 60580 | 197  | 
then show ?case by (auto intro: key_le_right simp del: rbt_sorted.simps)  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
198  | 
next  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
199  | 
case (left_non_empty c t1 k v t2 y)  | 
| 60580 | 200  | 
then consider "y = k" | "y \<in> set (RBT_Impl.keys t1)" | "y \<in> set (RBT_Impl.keys t2)"  | 
201  | 
by auto  | 
|
202  | 
then show ?case  | 
|
203  | 
proof cases  | 
|
204  | 
case 1  | 
|
205  | 
with left_non_empty show ?thesis  | 
|
206  | 
by (auto simp add: rbt_min_opt_Branch intro: left_le_key rbt_min_opt_in_set)  | 
|
207  | 
next  | 
|
208  | 
case 2  | 
|
209  | 
with left_non_empty show ?thesis  | 
|
210  | 
by (auto simp add: rbt_min_opt_Branch)  | 
|
211  | 
next  | 
|
212  | 
case y: 3  | 
|
213  | 
have "rbt_min_opt t1 \<le> k"  | 
|
214  | 
using left_non_empty by (simp add: left_le_key rbt_min_opt_in_set)  | 
|
215  | 
moreover have "k \<le> y"  | 
|
216  | 
using left_non_empty y by (simp add: key_le_right)  | 
|
217  | 
ultimately show ?thesis  | 
|
218  | 
using left_non_empty y by (simp add: rbt_min_opt_Branch)  | 
|
219  | 
qed  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
220  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
221  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
222  | 
lemma rbt_min_eq_rbt_min_opt:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
223  | 
assumes "t \<noteq> RBT_Impl.Empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
224  | 
assumes "is_rbt t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
225  | 
shows "rbt_min t = rbt_min_opt t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
226  | 
proof -  | 
| 51489 | 227  | 
from assms have "hd (RBT_Impl.keys t) # tl (RBT_Impl.keys t) = RBT_Impl.keys t" by (cases t) simp_all  | 
228  | 
with assms show ?thesis  | 
|
229  | 
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: 
51489 
diff
changeset
 | 
230  | 
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
 | 
231  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
232  | 
|
| 67408 | 233  | 
|
234  | 
paragraph \<open>maximum\<close>  | 
|
| 
48623
 
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  | 
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
 | 
237  | 
where "rbt_max t = rbt_fold1_keys max t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
238  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
239  | 
lemma fold_max_triv:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
240  | 
fixes k :: "_ :: linorder"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
241  | 
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
 | 
242  | 
by (induct xs) (auto simp add: max_def)  | 
| 
 
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 fold_max_rev_eq:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
245  | 
  fixes xs :: "('a :: linorder) list"
 | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
246  | 
assumes "xs \<noteq> []"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
247  | 
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: 
51489 
diff
changeset
 | 
248  | 
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
 | 
249  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
250  | 
lemma rbt_max_simps:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
251  | 
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
 | 
252  | 
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
 | 
253  | 
proof -  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
254  | 
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
 | 
255  | 
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
 | 
256  | 
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
 | 
257  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
258  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
259  | 
fun rbt_max_opt where  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
260  | 
"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
 | 
261  | 
"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
 | 
262  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
263  | 
lemma rbt_max_opt_Branch:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
264  | 
"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
 | 
265  | 
by (cases t2) auto  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
266  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
267  | 
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
 | 
268  | 
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
269  | 
assumes "P rbt.Empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
270  | 
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
 | 
271  | 
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
 | 
272  | 
shows "P t"  | 
| 63649 | 273  | 
using assms  | 
274  | 
proof (induct t)  | 
|
275  | 
case Empty  | 
|
276  | 
then show ?case by simp  | 
|
277  | 
next  | 
|
278  | 
case (Branch x1 t1 x3 x4 t2)  | 
|
279  | 
then show ?case by (cases "t2 = rbt.Empty") simp_all  | 
|
280  | 
qed  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
281  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
282  | 
lemma rbt_max_opt_in_set:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
283  | 
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
284  | 
assumes "t \<noteq> rbt.Empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
285  | 
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
 | 
286  | 
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
 | 
287  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
288  | 
lemma rbt_max_opt_is_max:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
289  | 
  fixes t :: "('a :: linorder, unit) RBT_Impl.rbt"
 | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
290  | 
assumes "rbt_sorted t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
291  | 
assumes "t \<noteq> rbt.Empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
292  | 
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
 | 
293  | 
using assms  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
294  | 
proof (induction t rule: rbt_max_opt_induct)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
295  | 
case empty  | 
| 60580 | 296  | 
then show ?case by simp  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
297  | 
next  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
298  | 
case right_empty  | 
| 60580 | 299  | 
then show ?case by (auto intro: left_le_key simp del: rbt_sorted.simps)  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
300  | 
next  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
301  | 
case (right_non_empty c t1 k v t2 y)  | 
| 60580 | 302  | 
then consider "y = k" | "y \<in> set (RBT_Impl.keys t2)" | "y \<in> set (RBT_Impl.keys t1)"  | 
303  | 
by auto  | 
|
304  | 
then show ?case  | 
|
305  | 
proof cases  | 
|
306  | 
case 1  | 
|
307  | 
with right_non_empty show ?thesis  | 
|
308  | 
by (auto simp add: rbt_max_opt_Branch intro: key_le_right rbt_max_opt_in_set)  | 
|
309  | 
next  | 
|
310  | 
case 2  | 
|
311  | 
with right_non_empty show ?thesis  | 
|
312  | 
by (auto simp add: rbt_max_opt_Branch)  | 
|
313  | 
next  | 
|
314  | 
case y: 3  | 
|
315  | 
have "rbt_max_opt t2 \<ge> k"  | 
|
316  | 
using right_non_empty by (simp add: key_le_right rbt_max_opt_in_set)  | 
|
317  | 
moreover have "y \<le> k"  | 
|
318  | 
using right_non_empty y by (simp add: left_le_key)  | 
|
319  | 
ultimately show ?thesis  | 
|
320  | 
using right_non_empty by (simp add: rbt_max_opt_Branch)  | 
|
321  | 
qed  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
322  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
323  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
324  | 
lemma rbt_max_eq_rbt_max_opt:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
325  | 
assumes "t \<noteq> RBT_Impl.Empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
326  | 
assumes "is_rbt t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
327  | 
shows "rbt_max t = rbt_max_opt t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
328  | 
proof -  | 
| 51489 | 329  | 
from assms have "hd (RBT_Impl.keys t) # tl (RBT_Impl.keys t) = RBT_Impl.keys t" by (cases t) simp_all  | 
330  | 
with assms show ?thesis  | 
|
331  | 
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: 
51489 
diff
changeset
 | 
332  | 
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
 | 
333  | 
qed  | 
| 
 
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  | 
|
| 67408 | 336  | 
subsubsection \<open>abstract\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
337  | 
|
| 56019 | 338  | 
context includes rbt.lifting begin  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
339  | 
lift_definition fold1_keys :: "('a \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> ('a::linorder, 'b) rbt \<Rightarrow> 'a"
 | 
| 
55565
 
f663fc1e653b
simplify proofs because of the stronger reflexivity prover
 
kuncar 
parents: 
54263 
diff
changeset
 | 
340  | 
is rbt_fold1_keys .  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
341  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
342  | 
lemma fold1_keys_def_alt:  | 
| 56019 | 343  | 
"fold1_keys f t = List.fold f (tl (RBT.keys t)) (hd (RBT.keys t))"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
344  | 
by transfer (simp add: rbt_fold1_keys_def)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
345  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
346  | 
lemma finite_fold1_fold1_keys:  | 
| 51489 | 347  | 
assumes "semilattice f"  | 
| 56019 | 348  | 
assumes "\<not> RBT.is_empty t"  | 
| 51489 | 349  | 
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
 | 
350  | 
proof -  | 
| 60500 | 351  | 
from \<open>semilattice f\<close> 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
 | 
352  | 
show ?thesis using assms  | 
| 51489 | 353  | 
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
 | 
354  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
355  | 
|
| 67408 | 356  | 
|
357  | 
paragraph \<open>minimum\<close>  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
358  | 
|
| 
55565
 
f663fc1e653b
simplify proofs because of the stronger reflexivity prover
 
kuncar 
parents: 
54263 
diff
changeset
 | 
359  | 
lift_definition r_min :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_min .
 | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
360  | 
|
| 
55565
 
f663fc1e653b
simplify proofs because of the stronger reflexivity prover
 
kuncar 
parents: 
54263 
diff
changeset
 | 
361  | 
lift_definition r_min_opt :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_min_opt .
 | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
362  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
363  | 
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
 | 
364  | 
by transfer (simp add: rbt_min_def)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
365  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
366  | 
lemma r_min_eq_r_min_opt:  | 
| 56019 | 367  | 
assumes "\<not> (RBT.is_empty t)"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
368  | 
shows "r_min t = r_min_opt t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
369  | 
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
 | 
370  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
371  | 
lemma fold_keys_min_top_eq:  | 
| 63649 | 372  | 
  fixes t :: "('a::{linorder,bounded_lattice_top}, unit) rbt"
 | 
| 56019 | 373  | 
assumes "\<not> (RBT.is_empty t)"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
374  | 
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
 | 
375  | 
proof -  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
376  | 
have *: "\<And>t. RBT_Impl.keys t \<noteq> [] \<Longrightarrow> List.fold min (RBT_Impl.keys t) top =  | 
| 63649 | 377  | 
List.fold min (hd (RBT_Impl.keys t) # tl (RBT_Impl.keys t)) top"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
378  | 
by (simp add: hd_Cons_tl[symmetric])  | 
| 63649 | 379  | 
have **: "List.fold min (x # xs) top = List.fold min xs x" for x :: 'a and xs  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
380  | 
by (simp add: inf_min[symmetric])  | 
| 63649 | 381  | 
show ?thesis  | 
382  | 
using assms  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
383  | 
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
 | 
384  | 
apply transfer  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
385  | 
apply (case_tac t)  | 
| 63649 | 386  | 
apply simp  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
387  | 
apply (subst *)  | 
| 63649 | 388  | 
apply simp  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
389  | 
apply (subst **)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
390  | 
apply simp  | 
| 63649 | 391  | 
done  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
392  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
393  | 
|
| 67408 | 394  | 
|
395  | 
paragraph \<open>maximum\<close>  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
396  | 
|
| 
55565
 
f663fc1e653b
simplify proofs because of the stronger reflexivity prover
 
kuncar 
parents: 
54263 
diff
changeset
 | 
397  | 
lift_definition r_max :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_max .
 | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
398  | 
|
| 
55565
 
f663fc1e653b
simplify proofs because of the stronger reflexivity prover
 
kuncar 
parents: 
54263 
diff
changeset
 | 
399  | 
lift_definition r_max_opt :: "('a :: linorder, unit) rbt \<Rightarrow> 'a" is rbt_max_opt .
 | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
400  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
401  | 
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
 | 
402  | 
by transfer (simp add: rbt_max_def)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
403  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
404  | 
lemma r_max_eq_r_max_opt:  | 
| 56019 | 405  | 
assumes "\<not> (RBT.is_empty t)"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
406  | 
shows "r_max t = r_max_opt t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
407  | 
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
 | 
408  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
409  | 
lemma fold_keys_max_bot_eq:  | 
| 63649 | 410  | 
  fixes t :: "('a::{linorder,bounded_lattice_bot}, unit) rbt"
 | 
| 56019 | 411  | 
assumes "\<not> (RBT.is_empty t)"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
412  | 
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
 | 
413  | 
proof -  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
414  | 
have *: "\<And>t. RBT_Impl.keys t \<noteq> [] \<Longrightarrow> List.fold max (RBT_Impl.keys t) bot =  | 
| 63649 | 415  | 
List.fold max (hd(RBT_Impl.keys t) # tl(RBT_Impl.keys t)) bot"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
416  | 
by (simp add: hd_Cons_tl[symmetric])  | 
| 63649 | 417  | 
have **: "List.fold max (x # xs) bot = List.fold max xs x" for x :: 'a and xs  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
418  | 
by (simp add: sup_max[symmetric])  | 
| 63649 | 419  | 
show ?thesis  | 
420  | 
using assms  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
421  | 
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
 | 
422  | 
apply transfer  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
423  | 
apply (case_tac t)  | 
| 63649 | 424  | 
apply simp  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
425  | 
apply (subst *)  | 
| 63649 | 426  | 
apply simp  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
427  | 
apply (subst **)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
428  | 
apply simp  | 
| 63649 | 429  | 
done  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
430  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
431  | 
|
| 56019 | 432  | 
end  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
433  | 
|
| 60500 | 434  | 
section \<open>Code equations\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
435  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
436  | 
code_datatype Set Coset  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
437  | 
|
| 
57816
 
d8bbb97689d3
no need for 'set_simps' now that 'datatype_new' generates the desired 'set' property
 
blanchet 
parents: 
57514 
diff
changeset
 | 
438  | 
declare list.set[code] (* needed? *)  | 
| 
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: 
49948 
diff
changeset
 | 
439  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
440  | 
lemma empty_Set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
441  | 
"Set.empty = Set RBT.empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
442  | 
by (auto simp: Set_def)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
443  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
444  | 
lemma UNIV_Coset [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
445  | 
"UNIV = Coset RBT.empty"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
446  | 
by (auto simp: Set_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 is_empty_Set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
449  | 
"Set.is_empty (Set t) = RBT.is_empty t"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
450  | 
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
 | 
451  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
452  | 
lemma compl_code [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
453  | 
"- Set xs = Coset xs"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
454  | 
"- Coset xs = Set xs"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
455  | 
by (simp_all add: Set_def)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
456  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
457  | 
lemma member_code [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
458  | 
"x \<in> (Set t) = (RBT.lookup t x = Some ())"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
459  | 
"x \<in> (Coset t) = (RBT.lookup t x = None)"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
460  | 
by (simp_all add: Set_def)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
461  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
462  | 
lemma insert_code [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
463  | 
"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
 | 
464  | 
"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
 | 
465  | 
by (auto simp: Set_def)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
466  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
467  | 
lemma remove_code [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
468  | 
"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
 | 
469  | 
"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
 | 
470  | 
by (auto simp: Set_def)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
471  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
472  | 
lemma union_Set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
473  | 
"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
 | 
474  | 
proof -  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
475  | 
interpret comp_fun_idem Set.insert  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
476  | 
by (fact comp_fun_idem_insert)  | 
| 
67682
 
00c436488398
tuned proofs -- prefer explicit names for facts from 'interpret';
 
wenzelm 
parents: 
67408 
diff
changeset
 | 
477  | 
from finite_fold_fold_keys[OF comp_fun_commute_axioms]  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
478  | 
show ?thesis by (auto simp add: union_fold_insert)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
479  | 
qed  | 
| 
 
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  | 
lemma inter_Set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
482  | 
"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: 
49757 
diff
changeset
 | 
483  | 
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
 | 
484  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
485  | 
lemma minus_Set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
486  | 
"A - Set t = fold_keys Set.remove t A"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
487  | 
proof -  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
488  | 
interpret comp_fun_idem Set.remove  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
489  | 
by (fact comp_fun_idem_remove)  | 
| 
67682
 
00c436488398
tuned proofs -- prefer explicit names for facts from 'interpret';
 
wenzelm 
parents: 
67408 
diff
changeset
 | 
490  | 
from finite_fold_fold_keys[OF comp_fun_commute_axioms]  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
491  | 
show ?thesis by (auto simp add: minus_fold_remove)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
492  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
493  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
494  | 
lemma union_Coset [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
495  | 
"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
 | 
496  | 
proof -  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
497  | 
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
 | 
498  | 
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
 | 
499  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
500  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
501  | 
lemma union_Set_Set [code]:  | 
| 56019 | 502  | 
"Set t1 \<union> Set t2 = Set (RBT.union t1 t2)"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
503  | 
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
 | 
504  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
505  | 
lemma inter_Coset [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
506  | 
"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
 | 
507  | 
by (simp add: Diff_eq [symmetric] minus_Set)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
508  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
509  | 
lemma inter_Coset_Coset [code]:  | 
| 56019 | 510  | 
"Coset t1 \<inter> Coset t2 = Coset (RBT.union t1 t2)"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
511  | 
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
 | 
512  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
513  | 
lemma minus_Coset [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
514  | 
"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
 | 
515  | 
by (simp add: inter_Set[simplified Int_commute])  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
516  | 
|
| 
49757
 
73ab6d4a9236
rename Set.project to Set.filter - more appropriate name
 
kuncar 
parents: 
48623 
diff
changeset
 | 
517  | 
lemma filter_Set [code]:  | 
| 
 
73ab6d4a9236
rename Set.project to Set.filter - more appropriate name
 
kuncar 
parents: 
48623 
diff
changeset
 | 
518  | 
"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: 
49757 
diff
changeset
 | 
519  | 
by (auto simp add: Set_filter_rbt_filter)  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
520  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
521  | 
lemma image_Set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
522  | 
  "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
 | 
523  | 
proof -  | 
| 60679 | 524  | 
have "comp_fun_commute (\<lambda>k. Set.insert (f k))"  | 
525  | 
by standard auto  | 
|
526  | 
then show ?thesis  | 
|
527  | 
by (auto simp add: image_fold_insert intro!: finite_fold_fold_keys)  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
528  | 
qed  | 
| 
 
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 Ball_Set [code]:  | 
| 56019 | 531  | 
"Ball (Set t) P \<longleftrightarrow> RBT.foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> P k) t True"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
532  | 
proof -  | 
| 60679 | 533  | 
have "comp_fun_commute (\<lambda>k s. s \<and> P k)"  | 
534  | 
by standard auto  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
535  | 
then show ?thesis  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
536  | 
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
 | 
537  | 
qed  | 
| 
 
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 Bex_Set [code]:  | 
| 56019 | 540  | 
"Bex (Set t) P \<longleftrightarrow> RBT.foldi (\<lambda>s. s = False) (\<lambda>k v s. s \<or> P k) t False"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
541  | 
proof -  | 
| 60679 | 542  | 
have "comp_fun_commute (\<lambda>k s. s \<or> P k)"  | 
543  | 
by standard auto  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
544  | 
then show ?thesis  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
545  | 
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
 | 
546  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
547  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
548  | 
lemma subset_code [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
549  | 
"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
 | 
550  | 
"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
 | 
551  | 
by auto  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
552  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
553  | 
lemma subset_Coset_empty_Set_empty [code]:  | 
| 56019 | 554  | 
"Coset t1 \<le> Set t2 \<longleftrightarrow> (case (RBT.impl_of t1, RBT.impl_of t2) of  | 
| 67091 | 555  | 
(rbt.Empty, rbt.Empty) \<Rightarrow> False |  | 
556  | 
(_, _) \<Rightarrow> Code.abort (STR ''non_empty_trees'') (\<lambda>_. Coset t1 \<le> Set t2))"  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
557  | 
proof -  | 
| 56019 | 558  | 
have *: "\<And>t. RBT.impl_of t = rbt.Empty \<Longrightarrow> t = RBT rbt.Empty"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
559  | 
by (subst(asm) RBT_inverse[symmetric]) (auto simp: impl_of_inject)  | 
| 
56519
 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 
kuncar 
parents: 
56218 
diff
changeset
 | 
560  | 
have **: "eq_onp is_rbt rbt.Empty rbt.Empty" unfolding eq_onp_def by simp  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
561  | 
show ?thesis  | 
| 53745 | 562  | 
by (auto simp: Set_def lookup.abs_eq[OF **] dest!: * split: rbt.split)  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
563  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
564  | 
|
| 60500 | 565  | 
text \<open>A frequent case -- avoid intermediate sets\<close>  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
566  | 
lemma [code_unfold]:  | 
| 56019 | 567  | 
"Set t1 \<subseteq> Set t2 \<longleftrightarrow> RBT.foldi (\<lambda>s. s = True) (\<lambda>k v s. s \<and> k \<in> Set t2) t1 True"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
568  | 
by (simp add: subset_code Ball_Set)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
569  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
570  | 
lemma card_Set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
571  | 
"card (Set t) = fold_keys (\<lambda>_ n. n + 1) t 0"  | 
| 51489 | 572  | 
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
 | 
573  | 
|
| 64267 | 574  | 
lemma sum_Set [code]:  | 
| 67091 | 575  | 
"sum f (Set xs) = fold_keys (plus \<circ> f) xs 0"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
576  | 
proof -  | 
| 67399 | 577  | 
have "comp_fun_commute (\<lambda>x. (+) (f x))"  | 
| 60679 | 578  | 
by standard (auto simp: ac_simps)  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
579  | 
then show ?thesis  | 
| 64267 | 580  | 
by (auto simp add: sum.eq_fold finite_fold_fold_keys o_def)  | 
| 
48623
 
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 the_elem_set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
584  | 
  fixes t :: "('a :: linorder, unit) rbt"
 | 
| 56019 | 585  | 
shows "the_elem (Set t) = (case RBT.impl_of t of  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
586  | 
(Branch RBT_Impl.B RBT_Impl.Empty x () RBT_Impl.Empty) \<Rightarrow> x  | 
| 53745 | 587  | 
| _ \<Rightarrow> Code.abort (STR ''not_a_singleton_tree'') (\<lambda>_. the_elem (Set t)))"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
588  | 
proof -  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
589  | 
  {
 | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
590  | 
fix x :: "'a :: linorder"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
591  | 
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
 | 
592  | 
    have *:"?t \<in> {t. is_rbt t}" unfolding is_rbt_def by auto
 | 
| 
56519
 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 
kuncar 
parents: 
56218 
diff
changeset
 | 
593  | 
then have **:"eq_onp is_rbt ?t ?t" unfolding eq_onp_def by auto  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
594  | 
|
| 56019 | 595  | 
have "RBT.impl_of t = ?t \<Longrightarrow> the_elem (Set t) = x"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
596  | 
by (subst(asm) RBT_inverse[symmetric, OF *])  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
597  | 
(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
 | 
598  | 
}  | 
| 53745 | 599  | 
then show ?thesis  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
600  | 
by(auto split: rbt.split unit.split color.split)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
601  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
602  | 
|
| 60679 | 603  | 
lemma Pow_Set [code]: "Pow (Set t) = fold_keys (\<lambda>x A. A \<union> Set.insert x ` A) t {{}}"
 | 
604  | 
by (simp add: Pow_fold finite_fold_fold_keys[OF comp_fun_commute_Pow_fold])  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
605  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
606  | 
lemma product_Set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
607  | 
"Product_Type.product (Set t1) (Set t2) =  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
608  | 
    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
 | 
609  | 
proof -  | 
| 60679 | 610  | 
have *: "comp_fun_commute (\<lambda>y. Set.insert (x, y))" for x  | 
611  | 
by standard auto  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
612  | 
  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
 | 
613  | 
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
 | 
614  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
615  | 
|
| 60679 | 616  | 
lemma Id_on_Set [code]: "Id_on (Set t) =  fold_keys (\<lambda>x. Set.insert (x, x)) t {}"
 | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
617  | 
proof -  | 
| 60679 | 618  | 
have "comp_fun_commute (\<lambda>x. Set.insert (x, x))"  | 
619  | 
by standard auto  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
620  | 
then show ?thesis  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
621  | 
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
 | 
622  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
623  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
624  | 
lemma Image_Set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
625  | 
  "(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
 | 
626  | 
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
 | 
627  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
628  | 
lemma trancl_set_ntrancl [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
629  | 
"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
 | 
630  | 
by (simp add: finite_trancl_ntranl)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
631  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
632  | 
lemma relcomp_Set[code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
633  | 
"(Set t1) O (Set t2) = fold_keys  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
634  | 
    (\<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
 | 
635  | 
proof -  | 
| 60679 | 636  | 
interpret comp_fun_idem Set.insert  | 
637  | 
by (fact comp_fun_idem_insert)  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
638  | 
have *: "\<And>x y. comp_fun_commute (\<lambda>(w, z) A'. if y = w then Set.insert (x, z) A' else A')"  | 
| 60679 | 639  | 
by standard (auto simp add: fun_eq_iff)  | 
640  | 
show ?thesis  | 
|
641  | 
    using finite_fold_fold_keys[OF comp_fun_commute_relcomp_fold, of "Set t2" "{}" t1]
 | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
642  | 
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
 | 
643  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
644  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
645  | 
lemma wf_set [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
646  | 
"wf (Set t) = acyclic (Set t)"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
647  | 
by (simp add: wf_iff_acyclic_if_finite)  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
648  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
649  | 
lemma Min_fin_set_fold [code]:  | 
| 53745 | 650  | 
"Min (Set t) =  | 
| 56019 | 651  | 
(if RBT.is_empty t  | 
| 53745 | 652  | 
then Code.abort (STR ''not_non_empty_tree'') (\<lambda>_. Min (Set t))  | 
653  | 
else r_min_opt t)"  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
654  | 
proof -  | 
| 51489 | 655  | 
have *: "semilattice (min :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)" ..  | 
656  | 
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
 | 
657  | 
show ?thesis  | 
| 53745 | 658  | 
by (simp add: 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
 | 
659  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
660  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
661  | 
lemma Inf_fin_set_fold [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
662  | 
"Inf_fin (Set t) = Min (Set t)"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
663  | 
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
 | 
664  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
665  | 
lemma Inf_Set_fold:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
666  | 
  fixes t :: "('a :: {linorder, complete_lattice}, unit) rbt"
 | 
| 56019 | 667  | 
shows "Inf (Set t) = (if RBT.is_empty t then top else r_min_opt t)"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
668  | 
proof -  | 
| 60679 | 669  | 
have "comp_fun_commute (min :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)"  | 
670  | 
by standard (simp add: fun_eq_iff ac_simps)  | 
|
| 56019 | 671  | 
then have "t \<noteq> RBT.empty \<Longrightarrow> Finite_Set.fold min top (Set t) = fold1_keys min t"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
672  | 
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
 | 
673  | 
then show ?thesis  | 
| 60679 | 674  | 
by (auto simp add: Inf_fold_inf inf_min empty_Set[symmetric]  | 
675  | 
r_min_eq_r_min_opt[symmetric] r_min_alt_def)  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
676  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
677  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
678  | 
lemma Max_fin_set_fold [code]:  | 
| 53745 | 679  | 
"Max (Set t) =  | 
| 56019 | 680  | 
(if RBT.is_empty t  | 
| 53745 | 681  | 
then Code.abort (STR ''not_non_empty_tree'') (\<lambda>_. Max (Set t))  | 
682  | 
else r_max_opt t)"  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
683  | 
proof -  | 
| 51489 | 684  | 
have *: "semilattice (max :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)" ..  | 
685  | 
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
 | 
686  | 
show ?thesis  | 
| 53745 | 687  | 
by (simp add: 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
 | 
688  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
689  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
690  | 
lemma Sup_fin_set_fold [code]:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
691  | 
"Sup_fin (Set t) = Max (Set t)"  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
692  | 
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
 | 
693  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
694  | 
lemma Sup_Set_fold:  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
695  | 
  fixes t :: "('a :: {linorder, complete_lattice}, unit) rbt"
 | 
| 56019 | 696  | 
shows "Sup (Set t) = (if RBT.is_empty t then bot else r_max_opt t)"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
697  | 
proof -  | 
| 60679 | 698  | 
have "comp_fun_commute (max :: 'a \<Rightarrow> 'a \<Rightarrow> 'a)"  | 
699  | 
by standard (simp add: fun_eq_iff ac_simps)  | 
|
| 56019 | 700  | 
then have "t \<noteq> RBT.empty \<Longrightarrow> Finite_Set.fold max bot (Set t) = fold1_keys max t"  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
701  | 
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
 | 
702  | 
then show ?thesis  | 
| 60679 | 703  | 
by (auto simp add: Sup_fold_sup sup_max empty_Set[symmetric]  | 
704  | 
r_max_eq_r_max_opt[symmetric] r_max_alt_def)  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
705  | 
qed  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
706  | 
|
| 
66404
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
707  | 
context  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
708  | 
begin  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
709  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
710  | 
qualified definition Inf' :: "'a :: {linorder, complete_lattice} set \<Rightarrow> 'a"
 | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
711  | 
where [code_abbrev]: "Inf' = Inf"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
712  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
713  | 
lemma Inf'_Set_fold [code]:  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
714  | 
"Inf' (Set t) = (if RBT.is_empty t then top else r_min_opt t)"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
715  | 
by (simp add: Inf'_def Inf_Set_fold)  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
716  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
717  | 
qualified definition Sup' :: "'a :: {linorder, complete_lattice} set \<Rightarrow> 'a"
 | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
718  | 
where [code_abbrev]: "Sup' = Sup"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
719  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
720  | 
lemma Sup'_Set_fold [code]:  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
721  | 
"Sup' (Set t) = (if RBT.is_empty t then bot else r_max_opt t)"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
722  | 
by (simp add: Sup'_def Sup_Set_fold)  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
723  | 
|
| 
66404
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
724  | 
lemma [code drop: Gcd_fin, code]:  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
725  | 
  "Gcd\<^sub>f\<^sub>i\<^sub>n (Set t) = fold_keys gcd t (0::'a::{semiring_gcd, linorder})"
 | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
726  | 
proof -  | 
| 
66404
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
727  | 
have "comp_fun_commute (gcd :: 'a \<Rightarrow> _)"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
728  | 
by standard (simp add: fun_eq_iff ac_simps)  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
729  | 
with finite_fold_fold_keys [of _ 0 t]  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
730  | 
have "Finite_Set.fold gcd 0 (Set t) = fold_keys gcd t 0"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
731  | 
by blast  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
732  | 
then show ?thesis  | 
| 
66404
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
733  | 
by (simp add: Gcd_fin.eq_fold)  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
734  | 
qed  | 
| 
66404
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
735  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
736  | 
lemma [code drop: "Gcd :: _ \<Rightarrow> nat", code]:  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
737  | 
"Gcd (Set t) = (Gcd\<^sub>f\<^sub>i\<^sub>n (Set t) :: nat)"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
738  | 
by simp  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
739  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
740  | 
lemma [code drop: "Gcd :: _ \<Rightarrow> int", code]:  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
741  | 
"Gcd (Set t) = (Gcd\<^sub>f\<^sub>i\<^sub>n (Set t) :: int)"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
742  | 
by simp  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
743  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
744  | 
lemma [code drop: Lcm_fin,code]:  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
745  | 
  "Lcm\<^sub>f\<^sub>i\<^sub>n (Set t) = fold_keys lcm t (1::'a::{semiring_gcd, linorder})"
 | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
746  | 
proof -  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
747  | 
have "comp_fun_commute (lcm :: 'a \<Rightarrow> _)"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
748  | 
by standard (simp add: fun_eq_iff ac_simps)  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
749  | 
with finite_fold_fold_keys [of _ 1 t]  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
750  | 
have "Finite_Set.fold lcm 1 (Set t) = fold_keys lcm t 1"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
751  | 
by blast  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
752  | 
then show ?thesis  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
753  | 
by (simp add: Lcm_fin.eq_fold)  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
754  | 
qed  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
755  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
756  | 
qualified definition Lcm' :: "'a :: semiring_Gcd set \<Rightarrow> 'a"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
757  | 
where [code_abbrev]: "Lcm' = Lcm"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
758  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
759  | 
lemma [code drop: "Lcm :: _ \<Rightarrow> nat", code]:  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
760  | 
"Lcm (Set t) = (Lcm\<^sub>f\<^sub>i\<^sub>n (Set t) :: nat)"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
761  | 
by simp  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
762  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
763  | 
lemma [code drop: "Lcm :: _ \<Rightarrow> int", code]:  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
764  | 
"Lcm (Set t) = (Lcm\<^sub>f\<^sub>i\<^sub>n (Set t) :: int)"  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
765  | 
by simp  | 
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
766  | 
|
| 
 
7eb451adbda6
code generation for Gcd and Lcm when sets are implemented by red-black trees
 
haftmann 
parents: 
66148 
diff
changeset
 | 
767  | 
end  | 
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
768  | 
|
| 60679 | 769  | 
lemma sorted_list_set[code]: "sorted_list_of_set (Set t) = RBT.keys t"  | 
770  | 
by (auto simp add: set_keys intro: sorted_distinct_set_unique)  | 
|
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
771  | 
|
| 53955 | 772  | 
lemma Bleast_code [code]:  | 
| 60679 | 773  | 
"Bleast (Set t) P =  | 
| 63194 | 774  | 
(case List.filter P (RBT.keys t) of  | 
| 60679 | 775  | 
x # xs \<Rightarrow> x  | 
776  | 
| [] \<Rightarrow> abort_Bleast (Set t) P)"  | 
|
| 63194 | 777  | 
proof (cases "List.filter P (RBT.keys t)")  | 
| 60679 | 778  | 
case Nil  | 
779  | 
thus ?thesis by (simp add: Bleast_def abort_Bleast_def)  | 
|
| 53955 | 780  | 
next  | 
781  | 
case (Cons x ys)  | 
|
782  | 
have "(LEAST x. x \<in> Set t \<and> P x) = x"  | 
|
783  | 
proof (rule Least_equality)  | 
|
| 60679 | 784  | 
show "x \<in> Set t \<and> P x"  | 
785  | 
using Cons[symmetric]  | 
|
786  | 
by (auto simp add: set_keys Cons_eq_filter_iff)  | 
|
| 53955 | 787  | 
next  | 
| 60679 | 788  | 
fix y  | 
789  | 
assume "y \<in> Set t \<and> P y"  | 
|
790  | 
then show "x \<le> y"  | 
|
791  | 
using Cons[symmetric]  | 
|
| 53955 | 792  | 
by(auto simp add: set_keys Cons_eq_filter_iff)  | 
| 68109 | 793  | 
(metis sorted.simps(2) sorted_append sorted_keys)  | 
| 53955 | 794  | 
qed  | 
795  | 
thus ?thesis using Cons by (simp add: Bleast_def)  | 
|
796  | 
qed  | 
|
797  | 
||
| 
48623
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
798  | 
hide_const (open) RBT_Set.Set RBT_Set.Coset  | 
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
799  | 
|
| 
 
bea613f2543d
implementation of sets by RBT trees for the code generator
 
kuncar 
parents:  
diff
changeset
 | 
800  | 
end  |