| author | haftmann | 
| Sat, 23 Mar 2013 17:11:06 +0100 | |
| changeset 51487 | f4bfdee99304 | 
| parent 51143 | 0a2371e7ced3 | 
| child 53374 | a14d2a854c02 | 
| permissions | -rw-r--r-- | 
| 
22259
 
476604be7d88
New theory for converting between predicates and sets.
 
berghofe 
parents:  
diff
changeset
 | 
1  | 
(* Title: HOL/Predicate.thy  | 
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
2  | 
Author: Lukas Bulwahn and Florian Haftmann, TU Muenchen  | 
| 
22259
 
476604be7d88
New theory for converting between predicates and sets.
 
berghofe 
parents:  
diff
changeset
 | 
3  | 
*)  | 
| 
 
476604be7d88
New theory for converting between predicates and sets.
 
berghofe 
parents:  
diff
changeset
 | 
4  | 
|
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
5  | 
header {* Predicates as enumerations *}
 | 
| 
22259
 
476604be7d88
New theory for converting between predicates and sets.
 
berghofe 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
476604be7d88
New theory for converting between predicates and sets.
 
berghofe 
parents:  
diff
changeset
 | 
7  | 
theory Predicate  | 
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
8  | 
imports List  | 
| 
22259
 
476604be7d88
New theory for converting between predicates and sets.
 
berghofe 
parents:  
diff
changeset
 | 
9  | 
begin  | 
| 
 
476604be7d88
New theory for converting between predicates and sets.
 
berghofe 
parents:  
diff
changeset
 | 
10  | 
|
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
11  | 
subsection {* The type of predicate enumerations (a monad) *}
 | 
| 30328 | 12  | 
|
13  | 
datatype 'a pred = Pred "'a \<Rightarrow> bool"  | 
|
14  | 
||
15  | 
primrec eval :: "'a pred \<Rightarrow> 'a \<Rightarrow> bool" where  | 
|
16  | 
eval_pred: "eval (Pred f) = f"  | 
|
17  | 
||
18  | 
lemma Pred_eval [simp]:  | 
|
19  | 
"Pred (eval x) = x"  | 
|
20  | 
by (cases x) simp  | 
|
21  | 
||
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
22  | 
lemma pred_eqI:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
23  | 
"(\<And>w. eval P w \<longleftrightarrow> eval Q w) \<Longrightarrow> P = Q"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
24  | 
by (cases P, cases Q) (auto simp add: fun_eq_iff)  | 
| 30328 | 25  | 
|
| 
46038
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
26  | 
lemma pred_eq_iff:  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
27  | 
"P = Q \<Longrightarrow> (\<And>w. eval P w \<longleftrightarrow> eval Q w)"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
28  | 
by (simp add: pred_eqI)  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
29  | 
|
| 44033 | 30  | 
instantiation pred :: (type) complete_lattice  | 
| 30328 | 31  | 
begin  | 
32  | 
||
33  | 
definition  | 
|
34  | 
"P \<le> Q \<longleftrightarrow> eval P \<le> eval Q"  | 
|
35  | 
||
36  | 
definition  | 
|
37  | 
"P < Q \<longleftrightarrow> eval P < eval Q"  | 
|
38  | 
||
39  | 
definition  | 
|
40  | 
"\<bottom> = Pred \<bottom>"  | 
|
41  | 
||
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
42  | 
lemma eval_bot [simp]:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
43  | 
"eval \<bottom> = \<bottom>"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
44  | 
by (simp add: bot_pred_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
45  | 
|
| 30328 | 46  | 
definition  | 
47  | 
"\<top> = Pred \<top>"  | 
|
48  | 
||
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
49  | 
lemma eval_top [simp]:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
50  | 
"eval \<top> = \<top>"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
51  | 
by (simp add: top_pred_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
52  | 
|
| 30328 | 53  | 
definition  | 
54  | 
"P \<sqinter> Q = Pred (eval P \<sqinter> eval Q)"  | 
|
55  | 
||
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
56  | 
lemma eval_inf [simp]:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
57  | 
"eval (P \<sqinter> Q) = eval P \<sqinter> eval Q"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
58  | 
by (simp add: inf_pred_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
59  | 
|
| 30328 | 60  | 
definition  | 
61  | 
"P \<squnion> Q = Pred (eval P \<squnion> eval Q)"  | 
|
62  | 
||
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
63  | 
lemma eval_sup [simp]:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
64  | 
"eval (P \<squnion> Q) = eval P \<squnion> eval Q"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
65  | 
by (simp add: sup_pred_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
66  | 
|
| 30328 | 67  | 
definition  | 
| 37767 | 68  | 
"\<Sqinter>A = Pred (INFI A eval)"  | 
| 30328 | 69  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
70  | 
lemma eval_Inf [simp]:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
71  | 
"eval (\<Sqinter>A) = INFI A eval"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
72  | 
by (simp add: Inf_pred_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
73  | 
|
| 30328 | 74  | 
definition  | 
| 37767 | 75  | 
"\<Squnion>A = Pred (SUPR A eval)"  | 
| 30328 | 76  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
77  | 
lemma eval_Sup [simp]:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
78  | 
"eval (\<Squnion>A) = SUPR A eval"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
79  | 
by (simp add: Sup_pred_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
80  | 
|
| 44033 | 81  | 
instance proof  | 
| 44415 | 82  | 
qed (auto intro!: pred_eqI simp add: less_eq_pred_def less_pred_def le_fun_def less_fun_def)  | 
| 44033 | 83  | 
|
84  | 
end  | 
|
85  | 
||
86  | 
lemma eval_INFI [simp]:  | 
|
87  | 
"eval (INFI A f) = INFI A (eval \<circ> f)"  | 
|
| 
44928
 
7ef6505bde7f
renamed Complete_Lattices lemmas, removed legacy names
 
hoelzl 
parents: 
44415 
diff
changeset
 | 
88  | 
by (simp only: INF_def eval_Inf image_compose)  | 
| 44033 | 89  | 
|
90  | 
lemma eval_SUPR [simp]:  | 
|
91  | 
"eval (SUPR A f) = SUPR A (eval \<circ> f)"  | 
|
| 
44928
 
7ef6505bde7f
renamed Complete_Lattices lemmas, removed legacy names
 
hoelzl 
parents: 
44415 
diff
changeset
 | 
92  | 
by (simp only: SUP_def eval_Sup image_compose)  | 
| 44033 | 93  | 
|
94  | 
instantiation pred :: (type) complete_boolean_algebra  | 
|
95  | 
begin  | 
|
96  | 
||
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
97  | 
definition  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
98  | 
"- P = Pred (- eval P)"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
99  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
100  | 
lemma eval_compl [simp]:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
101  | 
"eval (- P) = - eval P"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
102  | 
by (simp add: uminus_pred_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
103  | 
|
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
104  | 
definition  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
105  | 
"P - Q = Pred (eval P - eval Q)"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
106  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
107  | 
lemma eval_minus [simp]:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
108  | 
"eval (P - Q) = eval P - eval Q"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
109  | 
by (simp add: minus_pred_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
110  | 
|
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
111  | 
instance proof  | 
| 46884 | 112  | 
qed (auto intro!: pred_eqI)  | 
| 30328 | 113  | 
|
| 
22259
 
476604be7d88
New theory for converting between predicates and sets.
 
berghofe 
parents:  
diff
changeset
 | 
114  | 
end  | 
| 30328 | 115  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
116  | 
definition single :: "'a \<Rightarrow> 'a pred" where  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
117  | 
"single x = Pred ((op =) x)"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
118  | 
|
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
119  | 
lemma eval_single [simp]:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
120  | 
"eval (single x) = (op =) x"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
121  | 
by (simp add: single_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
122  | 
|
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
123  | 
definition bind :: "'a pred \<Rightarrow> ('a \<Rightarrow> 'b pred) \<Rightarrow> 'b pred" (infixl "\<guillemotright>=" 70) where
 | 
| 41080 | 124  | 
  "P \<guillemotright>= f = (SUPR {x. eval P x} f)"
 | 
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
125  | 
|
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
126  | 
lemma eval_bind [simp]:  | 
| 41080 | 127  | 
  "eval (P \<guillemotright>= f) = eval (SUPR {x. eval P x} f)"
 | 
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
128  | 
by (simp add: bind_def)  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
129  | 
|
| 30328 | 130  | 
lemma bind_bind:  | 
131  | 
"(P \<guillemotright>= Q) \<guillemotright>= R = P \<guillemotright>= (\<lambda>x. Q x \<guillemotright>= R)"  | 
|
| 46884 | 132  | 
by (rule pred_eqI) auto  | 
| 30328 | 133  | 
|
134  | 
lemma bind_single:  | 
|
135  | 
"P \<guillemotright>= single = P"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
136  | 
by (rule pred_eqI) auto  | 
| 30328 | 137  | 
|
138  | 
lemma single_bind:  | 
|
139  | 
"single x \<guillemotright>= P = P x"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
140  | 
by (rule pred_eqI) auto  | 
| 30328 | 141  | 
|
142  | 
lemma bottom_bind:  | 
|
143  | 
"\<bottom> \<guillemotright>= P = \<bottom>"  | 
|
| 
40674
 
54dbe6a1c349
adhere established Collect/mem convention more closely
 
haftmann 
parents: 
40616 
diff
changeset
 | 
144  | 
by (rule pred_eqI) auto  | 
| 30328 | 145  | 
|
146  | 
lemma sup_bind:  | 
|
147  | 
"(P \<squnion> Q) \<guillemotright>= R = P \<guillemotright>= R \<squnion> Q \<guillemotright>= R"  | 
|
| 
40674
 
54dbe6a1c349
adhere established Collect/mem convention more closely
 
haftmann 
parents: 
40616 
diff
changeset
 | 
148  | 
by (rule pred_eqI) auto  | 
| 30328 | 149  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
150  | 
lemma Sup_bind:  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
151  | 
"(\<Squnion>A \<guillemotright>= f) = \<Squnion>((\<lambda>x. x \<guillemotright>= f) ` A)"  | 
| 46884 | 152  | 
by (rule pred_eqI) auto  | 
| 30328 | 153  | 
|
154  | 
lemma pred_iffI:  | 
|
155  | 
assumes "\<And>x. eval A x \<Longrightarrow> eval B x"  | 
|
156  | 
and "\<And>x. eval B x \<Longrightarrow> eval A x"  | 
|
157  | 
shows "A = B"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
158  | 
using assms by (auto intro: pred_eqI)  | 
| 30328 | 159  | 
|
160  | 
lemma singleI: "eval (single x) x"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
161  | 
by simp  | 
| 30328 | 162  | 
|
163  | 
lemma singleI_unit: "eval (single ()) x"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
164  | 
by simp  | 
| 30328 | 165  | 
|
166  | 
lemma singleE: "eval (single x) y \<Longrightarrow> (y = x \<Longrightarrow> P) \<Longrightarrow> P"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
167  | 
by simp  | 
| 30328 | 168  | 
|
169  | 
lemma singleE': "eval (single x) y \<Longrightarrow> (x = y \<Longrightarrow> P) \<Longrightarrow> P"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
170  | 
by simp  | 
| 30328 | 171  | 
|
172  | 
lemma bindI: "eval P x \<Longrightarrow> eval (Q x) y \<Longrightarrow> eval (P \<guillemotright>= Q) y"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
173  | 
by auto  | 
| 30328 | 174  | 
|
175  | 
lemma bindE: "eval (R \<guillemotright>= Q) y \<Longrightarrow> (\<And>x. eval R x \<Longrightarrow> eval (Q x) y \<Longrightarrow> P) \<Longrightarrow> P"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
176  | 
by auto  | 
| 30328 | 177  | 
|
178  | 
lemma botE: "eval \<bottom> x \<Longrightarrow> P"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
179  | 
by auto  | 
| 30328 | 180  | 
|
181  | 
lemma supI1: "eval A x \<Longrightarrow> eval (A \<squnion> B) x"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
182  | 
by auto  | 
| 30328 | 183  | 
|
184  | 
lemma supI2: "eval B x \<Longrightarrow> eval (A \<squnion> B) x"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
185  | 
by auto  | 
| 30328 | 186  | 
|
187  | 
lemma supE: "eval (A \<squnion> B) x \<Longrightarrow> (eval A x \<Longrightarrow> P) \<Longrightarrow> (eval B x \<Longrightarrow> P) \<Longrightarrow> P"  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
188  | 
by auto  | 
| 30328 | 189  | 
|
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
190  | 
lemma single_not_bot [simp]:  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
191  | 
"single x \<noteq> \<bottom>"  | 
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
192  | 
by (auto simp add: single_def bot_pred_def fun_eq_iff)  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
193  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
194  | 
lemma not_bot:  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
195  | 
assumes "A \<noteq> \<bottom>"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
196  | 
obtains x where "eval A x"  | 
| 
45970
 
b6d0cff57d96
adjusted to set/pred distinction by means of type constructor `set`
 
haftmann 
parents: 
45630 
diff
changeset
 | 
197  | 
using assms by (cases A) (auto simp add: bot_pred_def)  | 
| 
 
b6d0cff57d96
adjusted to set/pred distinction by means of type constructor `set`
 
haftmann 
parents: 
45630 
diff
changeset
 | 
198  | 
|
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
199  | 
|
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
200  | 
subsection {* Emptiness check and definite choice *}
 | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
201  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
202  | 
definition is_empty :: "'a pred \<Rightarrow> bool" where  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
203  | 
"is_empty A \<longleftrightarrow> A = \<bottom>"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
204  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
205  | 
lemma is_empty_bot:  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
206  | 
"is_empty \<bottom>"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
207  | 
by (simp add: is_empty_def)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
208  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
209  | 
lemma not_is_empty_single:  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
210  | 
"\<not> is_empty (single x)"  | 
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
211  | 
by (auto simp add: is_empty_def single_def bot_pred_def fun_eq_iff)  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
212  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
213  | 
lemma is_empty_sup:  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
214  | 
"is_empty (A \<squnion> B) \<longleftrightarrow> is_empty A \<and> is_empty B"  | 
| 36008 | 215  | 
by (auto simp add: is_empty_def)  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
216  | 
|
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
217  | 
definition singleton :: "(unit \<Rightarrow> 'a) \<Rightarrow> 'a pred \<Rightarrow> 'a" where  | 
| 33111 | 218  | 
"singleton dfault A = (if \<exists>!x. eval A x then THE x. eval A x else dfault ())"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
219  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
220  | 
lemma singleton_eqI:  | 
| 33110 | 221  | 
"\<exists>!x. eval A x \<Longrightarrow> eval A x \<Longrightarrow> singleton dfault A = x"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
222  | 
by (auto simp add: singleton_def)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
223  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
224  | 
lemma eval_singletonI:  | 
| 33110 | 225  | 
"\<exists>!x. eval A x \<Longrightarrow> eval A (singleton dfault A)"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
226  | 
proof -  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
227  | 
assume assm: "\<exists>!x. eval A x"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
228  | 
then obtain x where "eval A x" ..  | 
| 33110 | 229  | 
moreover with assm have "singleton dfault A = x" by (rule singleton_eqI)  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
230  | 
ultimately show ?thesis by simp  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
231  | 
qed  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
232  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
233  | 
lemma single_singleton:  | 
| 33110 | 234  | 
"\<exists>!x. eval A x \<Longrightarrow> single (singleton dfault A) = A"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
235  | 
proof -  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
236  | 
assume assm: "\<exists>!x. eval A x"  | 
| 33110 | 237  | 
then have "eval A (singleton dfault A)"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
238  | 
by (rule eval_singletonI)  | 
| 33110 | 239  | 
moreover from assm have "\<And>x. eval A x \<Longrightarrow> singleton dfault A = x"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
240  | 
by (rule singleton_eqI)  | 
| 33110 | 241  | 
ultimately have "eval (single (singleton dfault A)) = eval A"  | 
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
242  | 
by (simp (no_asm_use) add: single_def fun_eq_iff) blast  | 
| 
40616
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
243  | 
then have "\<And>x. eval (single (singleton dfault A)) x = eval A x"  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
244  | 
by simp  | 
| 
 
c5ee1e06d795
eval simp rules for predicate type, simplify primitive proofs
 
haftmann 
parents: 
39302 
diff
changeset
 | 
245  | 
then show ?thesis by (rule pred_eqI)  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
246  | 
qed  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
247  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
248  | 
lemma singleton_undefinedI:  | 
| 33111 | 249  | 
"\<not> (\<exists>!x. eval A x) \<Longrightarrow> singleton dfault A = dfault ()"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
250  | 
by (simp add: singleton_def)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
251  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
252  | 
lemma singleton_bot:  | 
| 33111 | 253  | 
"singleton dfault \<bottom> = dfault ()"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
254  | 
by (auto simp add: bot_pred_def intro: singleton_undefinedI)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
255  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
256  | 
lemma singleton_single:  | 
| 33110 | 257  | 
"singleton dfault (single x) = x"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
258  | 
by (auto simp add: intro: singleton_eqI singleI elim: singleE)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
259  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
260  | 
lemma singleton_sup_single_single:  | 
| 33111 | 261  | 
"singleton dfault (single x \<squnion> single y) = (if x = y then x else dfault ())"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
262  | 
proof (cases "x = y")  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
263  | 
case True then show ?thesis by (simp add: singleton_single)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
264  | 
next  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
265  | 
case False  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
266  | 
have "eval (single x \<squnion> single y) x"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
267  | 
and "eval (single x \<squnion> single y) y"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
268  | 
by (auto intro: supI1 supI2 singleI)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
269  | 
with False have "\<not> (\<exists>!z. eval (single x \<squnion> single y) z)"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
270  | 
by blast  | 
| 33111 | 271  | 
then have "singleton dfault (single x \<squnion> single y) = dfault ()"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
272  | 
by (rule singleton_undefinedI)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
273  | 
with False show ?thesis by simp  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
274  | 
qed  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
275  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
276  | 
lemma singleton_sup_aux:  | 
| 33110 | 277  | 
"singleton dfault (A \<squnion> B) = (if A = \<bottom> then singleton dfault B  | 
278  | 
else if B = \<bottom> then singleton dfault A  | 
|
279  | 
else singleton dfault  | 
|
280  | 
(single (singleton dfault A) \<squnion> single (singleton dfault B)))"  | 
|
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
281  | 
proof (cases "(\<exists>!x. eval A x) \<and> (\<exists>!y. eval B y)")  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
282  | 
case True then show ?thesis by (simp add: single_singleton)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
283  | 
next  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
284  | 
case False  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
285  | 
from False have A_or_B:  | 
| 33111 | 286  | 
"singleton dfault A = dfault () \<or> singleton dfault B = dfault ()"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
287  | 
by (auto intro!: singleton_undefinedI)  | 
| 33110 | 288  | 
then have rhs: "singleton dfault  | 
| 33111 | 289  | 
(single (singleton dfault A) \<squnion> single (singleton dfault B)) = dfault ()"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
290  | 
by (auto simp add: singleton_sup_single_single singleton_single)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
291  | 
from False have not_unique:  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
292  | 
"\<not> (\<exists>!x. eval A x) \<or> \<not> (\<exists>!y. eval B y)" by simp  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
293  | 
show ?thesis proof (cases "A \<noteq> \<bottom> \<and> B \<noteq> \<bottom>")  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
294  | 
case True  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
295  | 
then obtain a b where a: "eval A a" and b: "eval B b"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
296  | 
by (blast elim: not_bot)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
297  | 
with True not_unique have "\<not> (\<exists>!x. eval (A \<squnion> B) x)"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
298  | 
by (auto simp add: sup_pred_def bot_pred_def)  | 
| 33111 | 299  | 
then have "singleton dfault (A \<squnion> B) = dfault ()" by (rule singleton_undefinedI)  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
300  | 
with True rhs show ?thesis by simp  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
301  | 
next  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
302  | 
case False then show ?thesis by auto  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
303  | 
qed  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
304  | 
qed  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
305  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
306  | 
lemma singleton_sup:  | 
| 33110 | 307  | 
"singleton dfault (A \<squnion> B) = (if A = \<bottom> then singleton dfault B  | 
308  | 
else if B = \<bottom> then singleton dfault A  | 
|
| 33111 | 309  | 
else if singleton dfault A = singleton dfault B then singleton dfault A else dfault ())"  | 
| 33110 | 310  | 
using singleton_sup_aux [of dfault A B] by (simp only: singleton_sup_single_single)  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
311  | 
|
| 30328 | 312  | 
|
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
313  | 
subsection {* Derived operations *}
 | 
| 30328 | 314  | 
|
315  | 
definition if_pred :: "bool \<Rightarrow> unit pred" where  | 
|
316  | 
if_pred_eq: "if_pred b = (if b then single () else \<bottom>)"  | 
|
317  | 
||
| 
33754
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
318  | 
definition holds :: "unit pred \<Rightarrow> bool" where  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
319  | 
holds_eq: "holds P = eval P ()"  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
320  | 
|
| 30328 | 321  | 
definition not_pred :: "unit pred \<Rightarrow> unit pred" where  | 
322  | 
not_pred_eq: "not_pred P = (if eval P () then \<bottom> else single ())"  | 
|
323  | 
||
324  | 
lemma if_predI: "P \<Longrightarrow> eval (if_pred P) ()"  | 
|
325  | 
unfolding if_pred_eq by (auto intro: singleI)  | 
|
326  | 
||
327  | 
lemma if_predE: "eval (if_pred b) x \<Longrightarrow> (b \<Longrightarrow> x = () \<Longrightarrow> P) \<Longrightarrow> P"  | 
|
328  | 
unfolding if_pred_eq by (cases b) (auto elim: botE)  | 
|
329  | 
||
330  | 
lemma not_predI: "\<not> P \<Longrightarrow> eval (not_pred (Pred (\<lambda>u. P))) ()"  | 
|
331  | 
unfolding not_pred_eq eval_pred by (auto intro: singleI)  | 
|
332  | 
||
333  | 
lemma not_predI': "\<not> eval P () \<Longrightarrow> eval (not_pred P) ()"  | 
|
334  | 
unfolding not_pred_eq by (auto intro: singleI)  | 
|
335  | 
||
336  | 
lemma not_predE: "eval (not_pred (Pred (\<lambda>u. P))) x \<Longrightarrow> (\<not> P \<Longrightarrow> thesis) \<Longrightarrow> thesis"  | 
|
337  | 
unfolding not_pred_eq  | 
|
338  | 
by (auto split: split_if_asm elim: botE)  | 
|
339  | 
||
340  | 
lemma not_predE': "eval (not_pred P) x \<Longrightarrow> (\<not> eval P x \<Longrightarrow> thesis) \<Longrightarrow> thesis"  | 
|
341  | 
unfolding not_pred_eq  | 
|
342  | 
by (auto split: split_if_asm elim: botE)  | 
|
| 
33754
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
343  | 
lemma "f () = False \<or> f () = True"  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
344  | 
by simp  | 
| 30328 | 345  | 
|
| 37549 | 346  | 
lemma closure_of_bool_cases [no_atp]:  | 
| 44007 | 347  | 
fixes f :: "unit \<Rightarrow> bool"  | 
348  | 
assumes "f = (\<lambda>u. False) \<Longrightarrow> P f"  | 
|
349  | 
assumes "f = (\<lambda>u. True) \<Longrightarrow> P f"  | 
|
350  | 
shows "P f"  | 
|
| 
33754
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
351  | 
proof -  | 
| 44007 | 352  | 
have "f = (\<lambda>u. False) \<or> f = (\<lambda>u. True)"  | 
| 
33754
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
353  | 
apply (cases "f ()")  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
354  | 
apply (rule disjI2)  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
355  | 
apply (rule ext)  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
356  | 
apply (simp add: unit_eq)  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
357  | 
apply (rule disjI1)  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
358  | 
apply (rule ext)  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
359  | 
apply (simp add: unit_eq)  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
360  | 
done  | 
| 41550 | 361  | 
from this assms show ?thesis by blast  | 
| 
33754
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
362  | 
qed  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
363  | 
|
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
364  | 
lemma unit_pred_cases:  | 
| 44007 | 365  | 
assumes "P \<bottom>"  | 
366  | 
assumes "P (single ())"  | 
|
367  | 
shows "P Q"  | 
|
| 44415 | 368  | 
using assms unfolding bot_pred_def bot_fun_def bot_bool_def empty_def single_def proof (cases Q)  | 
| 44007 | 369  | 
fix f  | 
370  | 
assume "P (Pred (\<lambda>u. False))" "P (Pred (\<lambda>u. () = u))"  | 
|
371  | 
then have "P (Pred f)"  | 
|
372  | 
by (cases _ f rule: closure_of_bool_cases) simp_all  | 
|
373  | 
moreover assume "Q = Pred f"  | 
|
374  | 
ultimately show "P Q" by simp  | 
|
375  | 
qed  | 
|
376  | 
||
| 
33754
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
377  | 
lemma holds_if_pred:  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
378  | 
"holds (if_pred b) = b"  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
379  | 
unfolding if_pred_eq holds_eq  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
380  | 
by (cases b) (auto intro: singleI elim: botE)  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
381  | 
|
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
382  | 
lemma if_pred_holds:  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
383  | 
"if_pred (holds P) = P"  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
384  | 
unfolding if_pred_eq holds_eq  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
385  | 
by (rule unit_pred_cases) (auto intro: singleI elim: botE)  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
386  | 
|
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
387  | 
lemma is_empty_holds:  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
388  | 
"is_empty P \<longleftrightarrow> \<not> holds P"  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
389  | 
unfolding is_empty_def holds_eq  | 
| 
 
f2957bd46faf
adding derived constant Predicate.holds to Predicate theory; adopting the predicate compiler
 
bulwahn 
parents: 
33622 
diff
changeset
 | 
390  | 
by (rule unit_pred_cases) (auto elim: botE intro: singleI)  | 
| 30328 | 391  | 
|
| 41311 | 392  | 
definition map :: "('a \<Rightarrow> 'b) \<Rightarrow> 'a pred \<Rightarrow> 'b pred" where
 | 
393  | 
"map f P = P \<guillemotright>= (single o f)"  | 
|
394  | 
||
395  | 
lemma eval_map [simp]:  | 
|
| 44363 | 396  | 
  "eval (map f P) = (\<Squnion>x\<in>{x. eval P x}. (\<lambda>y. f x = y))"
 | 
| 44415 | 397  | 
by (auto simp add: map_def comp_def)  | 
| 41311 | 398  | 
|
| 
41505
 
6d19301074cf
"enriched_type" replaces less specific "type_lifting"
 
haftmann 
parents: 
41372 
diff
changeset
 | 
399  | 
enriched_type map: map  | 
| 44363 | 400  | 
by (rule ext, rule pred_eqI, auto)+  | 
| 41311 | 401  | 
|
402  | 
||
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
403  | 
subsection {* Implementation *}
 | 
| 30328 | 404  | 
|
405  | 
datatype 'a seq = Empty | Insert "'a" "'a pred" | Join "'a pred" "'a seq"  | 
|
406  | 
||
407  | 
primrec pred_of_seq :: "'a seq \<Rightarrow> 'a pred" where  | 
|
| 44414 | 408  | 
"pred_of_seq Empty = \<bottom>"  | 
409  | 
| "pred_of_seq (Insert x P) = single x \<squnion> P"  | 
|
410  | 
| "pred_of_seq (Join P xq) = P \<squnion> pred_of_seq xq"  | 
|
| 30328 | 411  | 
|
412  | 
definition Seq :: "(unit \<Rightarrow> 'a seq) \<Rightarrow> 'a pred" where  | 
|
413  | 
"Seq f = pred_of_seq (f ())"  | 
|
414  | 
||
415  | 
code_datatype Seq  | 
|
416  | 
||
417  | 
primrec member :: "'a seq \<Rightarrow> 'a \<Rightarrow> bool" where  | 
|
418  | 
"member Empty x \<longleftrightarrow> False"  | 
|
| 44414 | 419  | 
| "member (Insert y P) x \<longleftrightarrow> x = y \<or> eval P x"  | 
420  | 
| "member (Join P xq) x \<longleftrightarrow> eval P x \<or> member xq x"  | 
|
| 30328 | 421  | 
|
422  | 
lemma eval_member:  | 
|
423  | 
"member xq = eval (pred_of_seq xq)"  | 
|
424  | 
proof (induct xq)  | 
|
425  | 
case Empty show ?case  | 
|
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
426  | 
by (auto simp add: fun_eq_iff elim: botE)  | 
| 30328 | 427  | 
next  | 
428  | 
case Insert show ?case  | 
|
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
429  | 
by (auto simp add: fun_eq_iff elim: supE singleE intro: supI1 supI2 singleI)  | 
| 30328 | 430  | 
next  | 
431  | 
case Join then show ?case  | 
|
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
432  | 
by (auto simp add: fun_eq_iff elim: supE intro: supI1 supI2)  | 
| 30328 | 433  | 
qed  | 
434  | 
||
| 
46038
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
435  | 
lemma eval_code [(* FIXME declare simp *)code]: "eval (Seq f) = member (f ())"  | 
| 30328 | 436  | 
unfolding Seq_def by (rule sym, rule eval_member)  | 
437  | 
||
438  | 
lemma single_code [code]:  | 
|
439  | 
"single x = Seq (\<lambda>u. Insert x \<bottom>)"  | 
|
440  | 
unfolding Seq_def by simp  | 
|
441  | 
||
| 41080 | 442  | 
primrec "apply" :: "('a \<Rightarrow> 'b pred) \<Rightarrow> 'a seq \<Rightarrow> 'b seq" where
 | 
| 44415 | 443  | 
"apply f Empty = Empty"  | 
444  | 
| "apply f (Insert x P) = Join (f x) (Join (P \<guillemotright>= f) Empty)"  | 
|
445  | 
| "apply f (Join P xq) = Join (P \<guillemotright>= f) (apply f xq)"  | 
|
| 30328 | 446  | 
|
447  | 
lemma apply_bind:  | 
|
448  | 
"pred_of_seq (apply f xq) = pred_of_seq xq \<guillemotright>= f"  | 
|
449  | 
proof (induct xq)  | 
|
450  | 
case Empty show ?case  | 
|
451  | 
by (simp add: bottom_bind)  | 
|
452  | 
next  | 
|
453  | 
case Insert show ?case  | 
|
454  | 
by (simp add: single_bind sup_bind)  | 
|
455  | 
next  | 
|
456  | 
case Join then show ?case  | 
|
457  | 
by (simp add: sup_bind)  | 
|
458  | 
qed  | 
|
459  | 
||
460  | 
lemma bind_code [code]:  | 
|
461  | 
"Seq g \<guillemotright>= f = Seq (\<lambda>u. apply f (g ()))"  | 
|
462  | 
unfolding Seq_def by (rule sym, rule apply_bind)  | 
|
463  | 
||
464  | 
lemma bot_set_code [code]:  | 
|
465  | 
"\<bottom> = Seq (\<lambda>u. Empty)"  | 
|
466  | 
unfolding Seq_def by simp  | 
|
467  | 
||
| 30376 | 468  | 
primrec adjunct :: "'a pred \<Rightarrow> 'a seq \<Rightarrow> 'a seq" where  | 
| 44415 | 469  | 
"adjunct P Empty = Join P Empty"  | 
470  | 
| "adjunct P (Insert x Q) = Insert x (Q \<squnion> P)"  | 
|
471  | 
| "adjunct P (Join Q xq) = Join Q (adjunct P xq)"  | 
|
| 30376 | 472  | 
|
473  | 
lemma adjunct_sup:  | 
|
474  | 
"pred_of_seq (adjunct P xq) = P \<squnion> pred_of_seq xq"  | 
|
475  | 
by (induct xq) (simp_all add: sup_assoc sup_commute sup_left_commute)  | 
|
476  | 
||
| 30328 | 477  | 
lemma sup_code [code]:  | 
478  | 
"Seq f \<squnion> Seq g = Seq (\<lambda>u. case f ()  | 
|
479  | 
of Empty \<Rightarrow> g ()  | 
|
480  | 
| Insert x P \<Rightarrow> Insert x (P \<squnion> Seq g)  | 
|
| 30376 | 481  | 
| Join P xq \<Rightarrow> adjunct (Seq g) (Join P xq))"  | 
| 30328 | 482  | 
proof (cases "f ()")  | 
483  | 
case Empty  | 
|
484  | 
thus ?thesis  | 
|
| 
34007
 
aea892559fc5
tuned lattices theory fragements; generlized some lemmas from sets to lattices
 
haftmann 
parents: 
33988 
diff
changeset
 | 
485  | 
unfolding Seq_def by (simp add: sup_commute [of "\<bottom>"])  | 
| 30328 | 486  | 
next  | 
487  | 
case Insert  | 
|
488  | 
thus ?thesis  | 
|
489  | 
unfolding Seq_def by (simp add: sup_assoc)  | 
|
490  | 
next  | 
|
491  | 
case Join  | 
|
492  | 
thus ?thesis  | 
|
| 30376 | 493  | 
unfolding Seq_def  | 
494  | 
by (simp add: adjunct_sup sup_assoc sup_commute sup_left_commute)  | 
|
| 30328 | 495  | 
qed  | 
496  | 
||
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
497  | 
lemma [code]:  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
498  | 
"size (P :: 'a Predicate.pred) = 0" by (cases P) simp  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
499  | 
|
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
500  | 
lemma [code]:  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
501  | 
"pred_size f P = 0" by (cases P) simp  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
502  | 
|
| 
30430
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
503  | 
primrec contained :: "'a seq \<Rightarrow> 'a pred \<Rightarrow> bool" where  | 
| 44415 | 504  | 
"contained Empty Q \<longleftrightarrow> True"  | 
505  | 
| "contained (Insert x P) Q \<longleftrightarrow> eval Q x \<and> P \<le> Q"  | 
|
506  | 
| "contained (Join P xq) Q \<longleftrightarrow> P \<le> Q \<and> contained xq Q"  | 
|
| 
30430
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
507  | 
|
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
508  | 
lemma single_less_eq_eval:  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
509  | 
"single x \<le> P \<longleftrightarrow> eval P x"  | 
| 44415 | 510  | 
by (auto simp add: less_eq_pred_def le_fun_def)  | 
| 
30430
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
511  | 
|
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
512  | 
lemma contained_less_eq:  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
513  | 
"contained xq Q \<longleftrightarrow> pred_of_seq xq \<le> Q"  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
514  | 
by (induct xq) (simp_all add: single_less_eq_eval)  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
515  | 
|
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
516  | 
lemma less_eq_pred_code [code]:  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
517  | 
"Seq f \<le> Q = (case f ()  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
518  | 
of Empty \<Rightarrow> True  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
519  | 
| Insert x P \<Rightarrow> eval Q x \<and> P \<le> Q  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
520  | 
| Join P xq \<Rightarrow> P \<le> Q \<and> contained xq Q)"  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
521  | 
by (cases "f ()")  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
522  | 
(simp_all add: Seq_def single_less_eq_eval contained_less_eq)  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
523  | 
|
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
524  | 
lemma eq_pred_code [code]:  | 
| 31133 | 525  | 
fixes P Q :: "'a pred"  | 
| 
38857
 
97775f3e8722
renamed class/constant eq to equal; tuned some instantiations
 
haftmann 
parents: 
38651 
diff
changeset
 | 
526  | 
shows "HOL.equal P Q \<longleftrightarrow> P \<le> Q \<and> Q \<le> P"  | 
| 
 
97775f3e8722
renamed class/constant eq to equal; tuned some instantiations
 
haftmann 
parents: 
38651 
diff
changeset
 | 
527  | 
by (auto simp add: equal)  | 
| 
 
97775f3e8722
renamed class/constant eq to equal; tuned some instantiations
 
haftmann 
parents: 
38651 
diff
changeset
 | 
528  | 
|
| 
 
97775f3e8722
renamed class/constant eq to equal; tuned some instantiations
 
haftmann 
parents: 
38651 
diff
changeset
 | 
529  | 
lemma [code nbe]:  | 
| 
 
97775f3e8722
renamed class/constant eq to equal; tuned some instantiations
 
haftmann 
parents: 
38651 
diff
changeset
 | 
530  | 
"HOL.equal (x :: 'a pred) x \<longleftrightarrow> True"  | 
| 
 
97775f3e8722
renamed class/constant eq to equal; tuned some instantiations
 
haftmann 
parents: 
38651 
diff
changeset
 | 
531  | 
by (fact equal_refl)  | 
| 
30430
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
532  | 
|
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
533  | 
lemma [code]:  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
534  | 
"pred_case f P = f (eval P)"  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
535  | 
by (cases P) simp  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
536  | 
|
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
537  | 
lemma [code]:  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
538  | 
"pred_rec f P = f (eval P)"  | 
| 
 
42ea5d85edcc
explicit code equations for some rarely used pred operations
 
haftmann 
parents: 
30378 
diff
changeset
 | 
539  | 
by (cases P) simp  | 
| 30328 | 540  | 
|
| 
31105
 
95f66b234086
added general preprocessing of equality in predicates for code generation
 
bulwahn 
parents: 
30430 
diff
changeset
 | 
541  | 
inductive eq :: "'a \<Rightarrow> 'a \<Rightarrow> bool" where "eq x x"  | 
| 
 
95f66b234086
added general preprocessing of equality in predicates for code generation
 
bulwahn 
parents: 
30430 
diff
changeset
 | 
542  | 
|
| 
 
95f66b234086
added general preprocessing of equality in predicates for code generation
 
bulwahn 
parents: 
30430 
diff
changeset
 | 
543  | 
lemma eq_is_eq: "eq x y \<equiv> (x = y)"  | 
| 31108 | 544  | 
by (rule eq_reflection) (auto intro: eq.intros elim: eq.cases)  | 
| 30948 | 545  | 
|
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
546  | 
primrec null :: "'a seq \<Rightarrow> bool" where  | 
| 44415 | 547  | 
"null Empty \<longleftrightarrow> True"  | 
548  | 
| "null (Insert x P) \<longleftrightarrow> False"  | 
|
549  | 
| "null (Join P xq) \<longleftrightarrow> is_empty P \<and> null xq"  | 
|
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
550  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
551  | 
lemma null_is_empty:  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
552  | 
"null xq \<longleftrightarrow> is_empty (pred_of_seq xq)"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
553  | 
by (induct xq) (simp_all add: is_empty_bot not_is_empty_single is_empty_sup)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
554  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
555  | 
lemma is_empty_code [code]:  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
556  | 
"is_empty (Seq f) \<longleftrightarrow> null (f ())"  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
557  | 
by (simp add: null_is_empty Seq_def)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
558  | 
|
| 33111 | 559  | 
primrec the_only :: "(unit \<Rightarrow> 'a) \<Rightarrow> 'a seq \<Rightarrow> 'a" where  | 
560  | 
[code del]: "the_only dfault Empty = dfault ()"  | 
|
| 44415 | 561  | 
| "the_only dfault (Insert x P) = (if is_empty P then x else let y = singleton dfault P in if x = y then x else dfault ())"  | 
562  | 
| "the_only dfault (Join P xq) = (if is_empty P then the_only dfault xq else if null xq then singleton dfault P  | 
|
| 33110 | 563  | 
else let x = singleton dfault P; y = the_only dfault xq in  | 
| 33111 | 564  | 
if x = y then x else dfault ())"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
565  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
566  | 
lemma the_only_singleton:  | 
| 33110 | 567  | 
"the_only dfault xq = singleton dfault (pred_of_seq xq)"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
568  | 
by (induct xq)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
569  | 
(auto simp add: singleton_bot singleton_single is_empty_def  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
570  | 
null_is_empty Let_def singleton_sup)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
571  | 
|
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
572  | 
lemma singleton_code [code]:  | 
| 33110 | 573  | 
"singleton dfault (Seq f) = (case f ()  | 
| 33111 | 574  | 
of Empty \<Rightarrow> dfault ()  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
575  | 
| Insert x P \<Rightarrow> if is_empty P then x  | 
| 33110 | 576  | 
else let y = singleton dfault P in  | 
| 33111 | 577  | 
if x = y then x else dfault ()  | 
| 33110 | 578  | 
| Join P xq \<Rightarrow> if is_empty P then the_only dfault xq  | 
579  | 
else if null xq then singleton dfault P  | 
|
580  | 
else let x = singleton dfault P; y = the_only dfault xq in  | 
|
| 33111 | 581  | 
if x = y then x else dfault ())"  | 
| 
32578
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
582  | 
by (cases "f ()")  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
583  | 
(auto simp add: Seq_def the_only_singleton is_empty_def  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
584  | 
null_is_empty singleton_bot singleton_single singleton_sup Let_def)  | 
| 
 
22117a76f943
added emptiness check predicate and singleton projection
 
haftmann 
parents: 
32372 
diff
changeset
 | 
585  | 
|
| 44414 | 586  | 
definition the :: "'a pred \<Rightarrow> 'a" where  | 
| 37767 | 587  | 
"the A = (THE x. eval A x)"  | 
| 33111 | 588  | 
|
| 
40674
 
54dbe6a1c349
adhere established Collect/mem convention more closely
 
haftmann 
parents: 
40616 
diff
changeset
 | 
589  | 
lemma the_eqI:  | 
| 41080 | 590  | 
"(THE x. eval P x) = x \<Longrightarrow> the P = x"  | 
| 
40674
 
54dbe6a1c349
adhere established Collect/mem convention more closely
 
haftmann 
parents: 
40616 
diff
changeset
 | 
591  | 
by (simp add: the_def)  | 
| 
 
54dbe6a1c349
adhere established Collect/mem convention more closely
 
haftmann 
parents: 
40616 
diff
changeset
 | 
592  | 
|
| 44414 | 593  | 
definition not_unique :: "'a pred \<Rightarrow> 'a" where  | 
594  | 
[code del]: "not_unique A = (THE x. eval A x)"  | 
|
595  | 
||
596  | 
code_abort not_unique  | 
|
597  | 
||
| 
40674
 
54dbe6a1c349
adhere established Collect/mem convention more closely
 
haftmann 
parents: 
40616 
diff
changeset
 | 
598  | 
lemma the_eq [code]: "the A = singleton (\<lambda>x. not_unique A) A"  | 
| 
 
54dbe6a1c349
adhere established Collect/mem convention more closely
 
haftmann 
parents: 
40616 
diff
changeset
 | 
599  | 
by (rule the_eqI) (simp add: singleton_def not_unique_def)  | 
| 33110 | 600  | 
|
| 
36531
 
19f6e3b0d9b6
code_reflect: specify module name directly after keyword
 
haftmann 
parents: 
36513 
diff
changeset
 | 
601  | 
code_reflect Predicate  | 
| 36513 | 602  | 
datatypes pred = Seq and seq = Empty | Insert | Join  | 
603  | 
||
| 30948 | 604  | 
ML {*
 | 
605  | 
signature PREDICATE =  | 
|
606  | 
sig  | 
|
| 
51126
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
607  | 
  val anamorph: ('a -> ('b * 'a) option) -> int -> 'a -> 'b list * 'a
 | 
| 30948 | 608  | 
datatype 'a pred = Seq of (unit -> 'a seq)  | 
609  | 
and 'a seq = Empty | Insert of 'a * 'a pred | Join of 'a pred * 'a seq  | 
|
| 
51126
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
610  | 
  val map: ('a -> 'b) -> 'a pred -> 'b pred
 | 
| 
30959
 
458e55fd0a33
fixed compilation of predicate types in ML environment
 
haftmann 
parents: 
30948 
diff
changeset
 | 
611  | 
  val yield: 'a pred -> ('a * 'a pred) option
 | 
| 
 
458e55fd0a33
fixed compilation of predicate types in ML environment
 
haftmann 
parents: 
30948 
diff
changeset
 | 
612  | 
val yieldn: int -> 'a pred -> 'a list * 'a pred  | 
| 30948 | 613  | 
end;  | 
614  | 
||
615  | 
structure Predicate : PREDICATE =  | 
|
616  | 
struct  | 
|
617  | 
||
| 
51126
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
618  | 
fun anamorph f k x =  | 
| 
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
619  | 
(if k = 0 then ([], x)  | 
| 
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
620  | 
else case f x  | 
| 
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
621  | 
of NONE => ([], x)  | 
| 
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
622  | 
| SOME (v, y) => let  | 
| 
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
623  | 
val k' = k - 1;  | 
| 
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
624  | 
val (vs, z) = anamorph f k' y  | 
| 
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
625  | 
in (v :: vs, z) end);  | 
| 
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
626  | 
|
| 36513 | 627  | 
datatype pred = datatype Predicate.pred  | 
628  | 
datatype seq = datatype Predicate.seq  | 
|
629  | 
||
| 
51126
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
630  | 
fun map f = @{code Predicate.map} f;
 | 
| 
30959
 
458e55fd0a33
fixed compilation of predicate types in ML environment
 
haftmann 
parents: 
30948 
diff
changeset
 | 
631  | 
|
| 36513 | 632  | 
fun yield (Seq f) = next (f ())  | 
633  | 
and next Empty = NONE  | 
|
634  | 
| next (Insert (x, P)) = SOME (x, P)  | 
|
635  | 
| next (Join (P, xq)) = (case yield P  | 
|
| 
30959
 
458e55fd0a33
fixed compilation of predicate types in ML environment
 
haftmann 
parents: 
30948 
diff
changeset
 | 
636  | 
of NONE => next xq  | 
| 36513 | 637  | 
| SOME (x, Q) => SOME (x, Seq (fn _ => Join (Q, xq))));  | 
| 
30959
 
458e55fd0a33
fixed compilation of predicate types in ML environment
 
haftmann 
parents: 
30948 
diff
changeset
 | 
638  | 
|
| 
51126
 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 
haftmann 
parents: 
51112 
diff
changeset
 | 
639  | 
fun yieldn k = anamorph yield k;  | 
| 30948 | 640  | 
|
641  | 
end;  | 
|
642  | 
*}  | 
|
643  | 
||
| 
46038
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
644  | 
text {* Conversion from and to sets *}
 | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
645  | 
|
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
646  | 
definition pred_of_set :: "'a set \<Rightarrow> 'a pred" where  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
647  | 
"pred_of_set = Pred \<circ> (\<lambda>A x. x \<in> A)"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
648  | 
|
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
649  | 
lemma eval_pred_of_set [simp]:  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
650  | 
"eval (pred_of_set A) x \<longleftrightarrow> x \<in>A"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
651  | 
by (simp add: pred_of_set_def)  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
652  | 
|
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
653  | 
definition set_of_pred :: "'a pred \<Rightarrow> 'a set" where  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
654  | 
"set_of_pred = Collect \<circ> eval"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
655  | 
|
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
656  | 
lemma member_set_of_pred [simp]:  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
657  | 
"x \<in> set_of_pred P \<longleftrightarrow> Predicate.eval P x"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
658  | 
by (simp add: set_of_pred_def)  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
659  | 
|
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
660  | 
definition set_of_seq :: "'a seq \<Rightarrow> 'a set" where  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
661  | 
"set_of_seq = set_of_pred \<circ> pred_of_seq"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
662  | 
|
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
663  | 
lemma member_set_of_seq [simp]:  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
664  | 
"x \<in> set_of_seq xq = Predicate.member xq x"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
665  | 
by (simp add: set_of_seq_def eval_member)  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
666  | 
|
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
667  | 
lemma of_pred_code [code]:  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
668  | 
"set_of_pred (Predicate.Seq f) = (case f () of  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
669  | 
     Predicate.Empty \<Rightarrow> {}
 | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
670  | 
| Predicate.Insert x P \<Rightarrow> insert x (set_of_pred P)  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
671  | 
| Predicate.Join P xq \<Rightarrow> set_of_pred P \<union> set_of_seq xq)"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
672  | 
by (auto split: seq.split simp add: eval_code)  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
673  | 
|
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
674  | 
lemma of_seq_code [code]:  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
675  | 
  "set_of_seq Predicate.Empty = {}"
 | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
676  | 
"set_of_seq (Predicate.Insert x P) = insert x (set_of_pred P)"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
677  | 
"set_of_seq (Predicate.Join P xq) = set_of_pred P \<union> set_of_seq xq"  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
678  | 
by auto  | 
| 
 
bb2f7488a0f1
conversions from sets to predicates and vice versa; extensionality on predicates
 
haftmann 
parents: 
45970 
diff
changeset
 | 
679  | 
|
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
680  | 
text {* Lazy Evaluation of an indexed function *}
 | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
681  | 
|
| 
51143
 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 
haftmann 
parents: 
51126 
diff
changeset
 | 
682  | 
function iterate_upto :: "(natural \<Rightarrow> 'a) \<Rightarrow> natural \<Rightarrow> natural \<Rightarrow> 'a Predicate.pred"  | 
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
683  | 
where  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
684  | 
"iterate_upto f n m =  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
685  | 
Predicate.Seq (%u. if n > m then Predicate.Empty  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
686  | 
else Predicate.Insert (f n) (iterate_upto f (n + 1) m))"  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
687  | 
by pat_completeness auto  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
688  | 
|
| 
51143
 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 
haftmann 
parents: 
51126 
diff
changeset
 | 
689  | 
termination by (relation "measure (%(f, n, m). nat_of_natural (m + 1 - n))")  | 
| 
 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 
haftmann 
parents: 
51126 
diff
changeset
 | 
690  | 
(auto simp add: less_natural_def)  | 
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
691  | 
|
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
692  | 
text {* Misc *}
 | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
693  | 
|
| 47399 | 694  | 
declare Inf_set_fold [where 'a = "'a Predicate.pred", code]  | 
695  | 
declare Sup_set_fold [where 'a = "'a Predicate.pred", code]  | 
|
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
696  | 
|
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
697  | 
(* FIXME: better implement conversion by bisection *)  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
698  | 
|
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
699  | 
lemma pred_of_set_fold_sup:  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
700  | 
assumes "finite A"  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
701  | 
shows "pred_of_set A = Finite_Set.fold sup bot (Predicate.single ` A)" (is "?lhs = ?rhs")  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
702  | 
proof (rule sym)  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
703  | 
interpret comp_fun_idem "sup :: 'a Predicate.pred \<Rightarrow> 'a Predicate.pred \<Rightarrow> 'a Predicate.pred"  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
704  | 
by (fact comp_fun_idem_sup)  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
705  | 
from `finite A` show "?rhs = ?lhs" by (induct A) (auto intro!: pred_eqI)  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
706  | 
qed  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
707  | 
|
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
708  | 
lemma pred_of_set_set_fold_sup:  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
709  | 
"pred_of_set (set xs) = fold sup (List.map Predicate.single xs) bot"  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
710  | 
proof -  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
711  | 
interpret comp_fun_idem "sup :: 'a Predicate.pred \<Rightarrow> 'a Predicate.pred \<Rightarrow> 'a Predicate.pred"  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
712  | 
by (fact comp_fun_idem_sup)  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
713  | 
show ?thesis by (simp add: pred_of_set_fold_sup fold_set_fold [symmetric])  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
714  | 
qed  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
715  | 
|
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
716  | 
lemma pred_of_set_set_foldr_sup [code]:  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
717  | 
"pred_of_set (set xs) = foldr sup (List.map Predicate.single xs) bot"  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
718  | 
by (simp add: pred_of_set_set_fold_sup ac_simps foldr_fold fun_eq_iff)  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
719  | 
|
| 30328 | 720  | 
no_notation  | 
721  | 
bind (infixl "\<guillemotright>=" 70)  | 
|
722  | 
||
| 
36176
 
3fe7e97ccca8
replaced generic 'hide' command by more conventional 'hide_class', 'hide_type', 'hide_const', 'hide_fact' -- frees some popular keywords;
 
wenzelm 
parents: 
36008 
diff
changeset
 | 
723  | 
hide_type (open) pred seq  | 
| 
 
3fe7e97ccca8
replaced generic 'hide' command by more conventional 'hide_class', 'hide_type', 'hide_const', 'hide_fact' -- frees some popular keywords;
 
wenzelm 
parents: 
36008 
diff
changeset
 | 
724  | 
hide_const (open) Pred eval single bind is_empty singleton if_pred not_pred holds  | 
| 33111 | 725  | 
Empty Insert Join Seq member pred_of_seq "apply" adjunct null the_only eq map not_unique the  | 
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
726  | 
iterate_upto  | 
| 
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
727  | 
hide_fact (open) null_def member_def  | 
| 30328 | 728  | 
|
729  | 
end  | 
|
| 
46664
 
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
 
haftmann 
parents: 
46638 
diff
changeset
 | 
730  |