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