author | huffman |
Sat, 27 Feb 2010 16:34:13 -0800 | |
changeset 35461 | 34360a1e3537 |
parent 35460 | 8cb42aa19358 |
child 35462 | f5461b02d754 |
permissions | -rw-r--r-- |
35444 | 1 |
(* Title: HOLCF/Tools/domain/domain_constructors.ML |
2 |
Author: Brian Huffman |
|
3 |
||
4 |
Defines constructor functions for a given domain isomorphism |
|
5 |
and proves related theorems. |
|
6 |
*) |
|
7 |
||
8 |
signature DOMAIN_CONSTRUCTORS = |
|
9 |
sig |
|
10 |
val add_domain_constructors : |
|
11 |
string |
|
12 |
-> typ * (binding * (bool * binding option * typ) list * mixfix) list |
|
13 |
-> term * term |
|
14 |
-> thm * thm |
|
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
15 |
-> thm |
35444 | 16 |
-> theory |
17 |
-> { con_consts : term list, |
|
35451 | 18 |
con_betas : thm list, |
35457
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
19 |
exhaust : thm, |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
20 |
casedist : thm, |
35448
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
21 |
con_compacts : thm list, |
35452
cf8c5a751a9a
move proof of con_rews into domain_constructor.ML
huffman
parents:
35451
diff
changeset
|
22 |
con_rews : thm list, |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
23 |
inverts : thm list, |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
24 |
injects : thm list, |
35458
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
25 |
dist_les : thm list, |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
26 |
dist_eqs : thm list, |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
27 |
cases : thm list, |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
28 |
sel_rews : thm list, |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
29 |
dis_rews : thm list |
35453 | 30 |
} * theory; |
35444 | 31 |
end; |
32 |
||
33 |
||
34 |
structure Domain_Constructors :> DOMAIN_CONSTRUCTORS = |
|
35 |
struct |
|
36 |
||
37 |
(******************************************************************************) |
|
38 |
(************************** building types and terms **************************) |
|
39 |
(******************************************************************************) |
|
40 |
||
41 |
||
35448
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
42 |
(*** Operations from Isabelle/HOL ***) |
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
43 |
|
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
44 |
val boolT = HOLogic.boolT; |
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
45 |
|
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
46 |
val mk_equals = Logic.mk_equals; |
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
47 |
val mk_eq = HOLogic.mk_eq; |
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
48 |
val mk_trp = HOLogic.mk_Trueprop; |
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
49 |
val mk_fst = HOLogic.mk_fst; |
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
50 |
val mk_snd = HOLogic.mk_snd; |
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
51 |
val mk_not = HOLogic.mk_not; |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
52 |
val mk_conj = HOLogic.mk_conj; |
35457
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
53 |
val mk_disj = HOLogic.mk_disj; |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
54 |
|
35457
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
55 |
fun mk_ex (x, t) = HOLogic.exists_const (fastype_of x) $ Term.lambda x t; |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
56 |
|
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
57 |
(*** Basic HOLCF concepts ***) |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
58 |
|
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
59 |
fun mk_bottom T = Const (@{const_name UU}, T); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
60 |
|
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
61 |
fun below_const T = Const (@{const_name below}, [T, T] ---> boolT); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
62 |
fun mk_below (t, u) = below_const (fastype_of t) $ t $ u; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
63 |
|
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
64 |
fun mk_undef t = mk_eq (t, mk_bottom (fastype_of t)); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
65 |
|
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
66 |
fun mk_defined t = mk_not (mk_undef t); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
67 |
|
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
68 |
fun mk_compact t = |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
69 |
Const (@{const_name compact}, fastype_of t --> boolT) $ t; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
70 |
|
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
71 |
fun mk_cont t = |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
72 |
Const (@{const_name cont}, fastype_of t --> boolT) $ t; |
35448
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
73 |
|
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
74 |
|
35444 | 75 |
(*** Continuous function space ***) |
76 |
||
77 |
(* ->> is taken from holcf_logic.ML *) |
|
78 |
fun mk_cfunT (T, U) = Type(@{type_name "->"}, [T, U]); |
|
79 |
||
80 |
infixr 6 ->>; val (op ->>) = mk_cfunT; |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
81 |
infix -->>; val (op -->>) = Library.foldr mk_cfunT; |
35444 | 82 |
|
83 |
fun dest_cfunT (Type(@{type_name "->"}, [T, U])) = (T, U) |
|
84 |
| dest_cfunT T = raise TYPE ("dest_cfunT", [T], []); |
|
85 |
||
86 |
fun capply_const (S, T) = |
|
87 |
Const(@{const_name Rep_CFun}, (S ->> T) --> (S --> T)); |
|
88 |
||
89 |
fun cabs_const (S, T) = |
|
90 |
Const(@{const_name Abs_CFun}, (S --> T) --> (S ->> T)); |
|
91 |
||
92 |
fun mk_cabs t = |
|
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
93 |
let val T = fastype_of t |
35444 | 94 |
in cabs_const (Term.domain_type T, Term.range_type T) $ t end |
95 |
||
96 |
(* builds the expression (LAM v. rhs) *) |
|
97 |
fun big_lambda v rhs = |
|
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
98 |
cabs_const (fastype_of v, fastype_of rhs) $ Term.lambda v rhs; |
35444 | 99 |
|
100 |
(* builds the expression (LAM v1 v2 .. vn. rhs) *) |
|
101 |
fun big_lambdas [] rhs = rhs |
|
102 |
| big_lambdas (v::vs) rhs = big_lambda v (big_lambdas vs rhs); |
|
103 |
||
104 |
fun mk_capply (t, u) = |
|
105 |
let val (S, T) = |
|
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
106 |
case fastype_of t of |
35444 | 107 |
Type(@{type_name "->"}, [S, T]) => (S, T) |
108 |
| _ => raise TERM ("mk_capply " ^ ML_Syntax.print_list ML_Syntax.print_term [t, u], [t, u]); |
|
109 |
in capply_const (S, T) $ t $ u end; |
|
110 |
||
111 |
infix 9 ` ; val (op `) = mk_capply; |
|
112 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
113 |
val list_ccomb : term * term list -> term = Library.foldl mk_capply; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
114 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
115 |
fun mk_ID T = Const (@{const_name ID}, T ->> T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
116 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
117 |
fun cfcomp_const (T, U, V) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
118 |
Const (@{const_name cfcomp}, (U ->> V) ->> (T ->> U) ->> (T ->> V)); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
119 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
120 |
fun mk_cfcomp (f, g) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
121 |
let |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
122 |
val (U, V) = dest_cfunT (fastype_of f); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
123 |
val (T, U') = dest_cfunT (fastype_of g); |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
124 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
125 |
if U = U' |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
126 |
then mk_capply (mk_capply (cfcomp_const (T, U, V), f), g) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
127 |
else raise TYPE ("mk_cfcomp", [U, U'], [f, g]) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
128 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
129 |
|
35444 | 130 |
|
131 |
(*** Product type ***) |
|
132 |
||
133 |
fun mk_tupleT [] = HOLogic.unitT |
|
134 |
| mk_tupleT [T] = T |
|
135 |
| mk_tupleT (T :: Ts) = HOLogic.mk_prodT (T, mk_tupleT Ts); |
|
136 |
||
137 |
(* builds the expression (v1,v2,..,vn) *) |
|
138 |
fun mk_tuple [] = HOLogic.unit |
|
139 |
| mk_tuple (t::[]) = t |
|
140 |
| mk_tuple (t::ts) = HOLogic.mk_prod (t, mk_tuple ts); |
|
141 |
||
142 |
(* builds the expression (%(v1,v2,..,vn). rhs) *) |
|
143 |
fun lambda_tuple [] rhs = Term.lambda (Free("unit", HOLogic.unitT)) rhs |
|
144 |
| lambda_tuple (v::[]) rhs = Term.lambda v rhs |
|
145 |
| lambda_tuple (v::vs) rhs = |
|
146 |
HOLogic.mk_split (Term.lambda v (lambda_tuple vs rhs)); |
|
147 |
||
148 |
||
149 |
(*** Lifted cpo type ***) |
|
150 |
||
151 |
fun mk_upT T = Type(@{type_name "u"}, [T]); |
|
152 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
153 |
fun dest_upT (Type(@{type_name "u"}, [T])) = T |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
154 |
| dest_upT T = raise TYPE ("dest_upT", [T], []); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
155 |
|
35444 | 156 |
fun up_const T = Const(@{const_name up}, T ->> mk_upT T); |
157 |
||
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
158 |
fun mk_up t = up_const (fastype_of t) ` t; |
35444 | 159 |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
160 |
fun fup_const (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
161 |
Const(@{const_name fup}, (T ->> U) ->> mk_upT T ->> U); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
162 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
163 |
fun from_up T = fup_const (T, T) ` mk_ID T; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
164 |
|
35444 | 165 |
|
166 |
(*** Strict product type ***) |
|
167 |
||
168 |
val oneT = @{typ "one"}; |
|
169 |
||
170 |
fun mk_sprodT (T, U) = Type(@{type_name "**"}, [T, U]); |
|
171 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
172 |
fun dest_sprodT (Type(@{type_name "**"}, [T, U])) = (T, U) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
173 |
| dest_sprodT T = raise TYPE ("dest_sprodT", [T], []); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
174 |
|
35444 | 175 |
fun spair_const (T, U) = |
176 |
Const(@{const_name spair}, T ->> U ->> mk_sprodT (T, U)); |
|
177 |
||
178 |
(* builds the expression (:t, u:) *) |
|
179 |
fun mk_spair (t, u) = |
|
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
180 |
spair_const (fastype_of t, fastype_of u) ` t ` u; |
35444 | 181 |
|
182 |
(* builds the expression (:t1,t2,..,tn:) *) |
|
183 |
fun mk_stuple [] = @{term "ONE"} |
|
184 |
| mk_stuple (t::[]) = t |
|
185 |
| mk_stuple (t::ts) = mk_spair (t, mk_stuple ts); |
|
186 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
187 |
fun sfst_const (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
188 |
Const(@{const_name sfst}, mk_sprodT (T, U) ->> T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
189 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
190 |
fun ssnd_const (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
191 |
Const(@{const_name ssnd}, mk_sprodT (T, U) ->> U); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
192 |
|
35444 | 193 |
|
194 |
(*** Strict sum type ***) |
|
195 |
||
196 |
fun mk_ssumT (T, U) = Type(@{type_name "++"}, [T, U]); |
|
197 |
||
198 |
fun dest_ssumT (Type(@{type_name "++"}, [T, U])) = (T, U) |
|
199 |
| dest_ssumT T = raise TYPE ("dest_ssumT", [T], []); |
|
200 |
||
201 |
fun sinl_const (T, U) = Const(@{const_name sinl}, T ->> mk_ssumT (T, U)); |
|
202 |
fun sinr_const (T, U) = Const(@{const_name sinr}, U ->> mk_ssumT (T, U)); |
|
203 |
||
204 |
(* builds the list [sinl(t1), sinl(sinr(t2)), ... sinr(...sinr(tn))] *) |
|
205 |
fun mk_sinjects ts = |
|
206 |
let |
|
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
207 |
val Ts = map fastype_of ts; |
35444 | 208 |
fun combine (t, T) (us, U) = |
209 |
let |
|
210 |
val v = sinl_const (T, U) ` t; |
|
211 |
val vs = map (fn u => sinr_const (T, U) ` u) us; |
|
212 |
in |
|
213 |
(v::vs, mk_ssumT (T, U)) |
|
214 |
end |
|
215 |
fun inj [] = error "mk_sinjects: empty list" |
|
216 |
| inj ((t, T)::[]) = ([t], T) |
|
217 |
| inj ((t, T)::ts) = combine (t, T) (inj ts); |
|
218 |
in |
|
219 |
fst (inj (ts ~~ Ts)) |
|
220 |
end; |
|
221 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
222 |
fun sscase_const (T, U, V) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
223 |
Const(@{const_name sscase}, |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
224 |
(T ->> V) ->> (U ->> V) ->> mk_ssumT (T, U) ->> V); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
225 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
226 |
fun from_sinl (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
227 |
sscase_const (T, U, T) ` mk_ID T ` mk_bottom (U ->> T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
228 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
229 |
fun from_sinr (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
230 |
sscase_const (T, U, U) ` mk_bottom (T ->> U) ` mk_ID U; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
231 |
|
35444 | 232 |
|
233 |
(*** miscellaneous constructions ***) |
|
234 |
||
235 |
val trT = @{typ "tr"}; |
|
236 |
||
237 |
val deflT = @{typ "udom alg_defl"}; |
|
238 |
||
239 |
fun mapT T = |
|
240 |
let |
|
241 |
fun argTs (Type (_, Ts)) = Ts | argTs _ = []; |
|
242 |
fun auto T = T ->> T; |
|
243 |
in |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
244 |
map auto (argTs T) -->> auto T |
35444 | 245 |
end; |
246 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
247 |
fun mk_strict t = |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
248 |
let val (T, U) = dest_cfunT (fastype_of t); |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
249 |
in mk_eq (t ` mk_bottom T, mk_bottom U) end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
250 |
|
35444 | 251 |
fun mk_fix t = |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
252 |
let val (T, _) = dest_cfunT (fastype_of t) |
35444 | 253 |
in mk_capply (Const(@{const_name fix}, (T ->> T) ->> T), t) end; |
254 |
||
255 |
fun mk_Rep_of T = |
|
256 |
Const (@{const_name Rep_of}, Term.itselfT T --> deflT) $ Logic.mk_type T; |
|
257 |
||
258 |
fun coerce_const T = Const (@{const_name coerce}, T); |
|
259 |
||
260 |
fun isodefl_const T = |
|
35448
f9f73f0475eb
move proof of compactness rules into domain_constructors.ML
huffman
parents:
35447
diff
changeset
|
261 |
Const (@{const_name isodefl}, (T ->> T) --> deflT --> boolT); |
35444 | 262 |
|
263 |
(* splits a cterm into the right and lefthand sides of equality *) |
|
264 |
fun dest_eqs t = HOLogic.dest_eq (HOLogic.dest_Trueprop t); |
|
265 |
||
266 |
fun mk_eqs (t, u) = HOLogic.mk_Trueprop (HOLogic.mk_eq (t, u)); |
|
267 |
||
268 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
269 |
(************************** miscellaneous functions ***************************) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
270 |
|
35461
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
271 |
val simple_ss = |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
272 |
HOL_basic_ss addsimps simp_thms; |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
273 |
|
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
274 |
val beta_ss = |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
275 |
HOL_basic_ss |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
276 |
addsimps simp_thms |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
277 |
addsimps [@{thm beta_cfun}] |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
278 |
addsimprocs [@{simproc cont_proc}]; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
279 |
|
35444 | 280 |
fun define_consts |
281 |
(specs : (binding * term * mixfix) list) |
|
282 |
(thy : theory) |
|
283 |
: (term list * thm list) * theory = |
|
284 |
let |
|
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
285 |
fun mk_decl (b, t, mx) = (b, fastype_of t, mx); |
35444 | 286 |
val decls = map mk_decl specs; |
287 |
val thy = Cont_Consts.add_consts decls thy; |
|
288 |
fun mk_const (b, T, mx) = Const (Sign.full_name thy b, T); |
|
289 |
val consts = map mk_const decls; |
|
290 |
fun mk_def c (b, t, mx) = |
|
291 |
(Binding.suffix_name "_def" b, Logic.mk_equals (c, t)); |
|
292 |
val defs = map2 mk_def consts specs; |
|
293 |
val (def_thms, thy) = |
|
294 |
PureThy.add_defs false (map Thm.no_attributes defs) thy; |
|
295 |
in |
|
296 |
((consts, def_thms), thy) |
|
297 |
end; |
|
298 |
||
35449 | 299 |
fun prove |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
300 |
(thy : theory) |
35449 | 301 |
(defs : thm list) |
35447 | 302 |
(goal : term) |
35449 | 303 |
(tacs : {prems: thm list, context: Proof.context} -> tactic list) |
35447 | 304 |
: thm = |
35449 | 305 |
let |
306 |
fun tac {prems, context} = |
|
307 |
rewrite_goals_tac defs THEN |
|
308 |
EVERY (tacs {prems = map (rewrite_rule defs) prems, context = context}) |
|
309 |
in |
|
310 |
Goal.prove_global thy [] [] goal tac |
|
311 |
end; |
|
35445 | 312 |
|
313 |
(************** generating beta reduction rules from definitions **************) |
|
35444 | 314 |
|
35445 | 315 |
local |
316 |
fun arglist (Const _ $ Abs (s, T, t)) = |
|
317 |
let |
|
318 |
val arg = Free (s, T); |
|
319 |
val (args, body) = arglist (subst_bound (arg, t)); |
|
320 |
in (arg :: args, body) end |
|
321 |
| arglist t = ([], t); |
|
322 |
in |
|
323 |
fun beta_of_def thy def_thm = |
|
324 |
let |
|
325 |
val (con, lam) = Logic.dest_equals (concl_of def_thm); |
|
326 |
val (args, rhs) = arglist lam; |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
327 |
val lhs = list_ccomb (con, args); |
35445 | 328 |
val goal = mk_equals (lhs, rhs); |
329 |
val cs = ContProc.cont_thms lam; |
|
330 |
val betas = map (fn c => mk_meta_eq (c RS @{thm beta_cfun})) cs; |
|
331 |
in |
|
35449 | 332 |
prove thy (def_thm::betas) goal (K [rtac reflexive_thm 1]) |
35445 | 333 |
end; |
334 |
end; |
|
35444 | 335 |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
336 |
(******************************************************************************) |
35453 | 337 |
(************* definitions and theorems for constructor functions *************) |
338 |
(******************************************************************************) |
|
339 |
||
340 |
fun add_constructors |
|
35454
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
341 |
(spec : (binding * (bool * typ) list * mixfix) list) |
35453 | 342 |
(abs_const : term) |
343 |
(iso_locale : thm) |
|
344 |
(thy : theory) |
|
345 |
= |
|
346 |
let |
|
347 |
||
348 |
(* get theorems about rep and abs *) |
|
349 |
val abs_strict = iso_locale RS @{thm iso.abs_strict}; |
|
350 |
||
35457
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
351 |
(* get types of type isomorphism *) |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
352 |
val (rhsT, lhsT) = dest_cfunT (fastype_of abs_const); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
353 |
|
35455 | 354 |
fun vars_of args = |
355 |
let |
|
356 |
val Ts = map snd args; |
|
357 |
val ns = Datatype_Prop.make_tnames Ts; |
|
358 |
in |
|
359 |
map Free (ns ~~ Ts) |
|
360 |
end; |
|
361 |
||
35453 | 362 |
(* define constructor functions *) |
363 |
val ((con_consts, con_defs), thy) = |
|
364 |
let |
|
35454
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
365 |
fun one_arg (lazy, T) var = if lazy then mk_up var else var; |
35453 | 366 |
fun one_con (_,args,_) = mk_stuple (map2 one_arg args (vars_of args)); |
367 |
fun mk_abs t = abs_const ` t; |
|
368 |
val rhss = map mk_abs (mk_sinjects (map one_con spec)); |
|
369 |
fun mk_def (bind, args, mx) rhs = |
|
370 |
(bind, big_lambdas (vars_of args) rhs, mx); |
|
371 |
in |
|
372 |
define_consts (map2 mk_def spec rhss) thy |
|
373 |
end; |
|
374 |
||
375 |
(* prove beta reduction rules for constructors *) |
|
376 |
val con_betas = map (beta_of_def thy) con_defs; |
|
377 |
||
378 |
(* replace bindings with terms in constructor spec *) |
|
379 |
val spec' : (term * (bool * typ) list) list = |
|
35454
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
380 |
let fun one_con con (b, args, mx) = (con, args); |
35453 | 381 |
in map2 one_con con_consts spec end; |
382 |
||
35457
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
383 |
(* prove exhaustiveness of constructors *) |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
384 |
local |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
385 |
fun arg2typ n (true, T) = (n+1, mk_upT (TVar (("'a", n), @{sort cpo}))) |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
386 |
| arg2typ n (false, T) = (n+1, TVar (("'a", n), @{sort pcpo})); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
387 |
fun args2typ n [] = (n, oneT) |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
388 |
| args2typ n [arg] = arg2typ n arg |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
389 |
| args2typ n (arg::args) = |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
390 |
let |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
391 |
val (n1, t1) = arg2typ n arg; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
392 |
val (n2, t2) = args2typ n1 args |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
393 |
in (n2, mk_sprodT (t1, t2)) end; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
394 |
fun cons2typ n [] = (n, oneT) |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
395 |
| cons2typ n [con] = args2typ n (snd con) |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
396 |
| cons2typ n (con::cons) = |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
397 |
let |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
398 |
val (n1, t1) = args2typ n (snd con); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
399 |
val (n2, t2) = cons2typ n1 cons |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
400 |
in (n2, mk_ssumT (t1, t2)) end; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
401 |
val ct = ctyp_of thy (snd (cons2typ 1 spec')); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
402 |
val thm1 = instantiate' [SOME ct] [] @{thm exh_start}; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
403 |
val thm2 = rewrite_rule (map mk_meta_eq @{thms ex_defined_iffs}) thm1; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
404 |
val thm3 = rewrite_rule [mk_meta_eq @{thm conj_assoc}] thm2; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
405 |
|
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
406 |
val x = Free ("x", lhsT); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
407 |
fun one_con (con, args) = |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
408 |
let |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
409 |
val Ts = map snd args; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
410 |
val ns = Name.variant_list ["x"] (Datatype_Prop.make_tnames Ts); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
411 |
val vs = map Free (ns ~~ Ts); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
412 |
val nonlazy = map snd (filter_out (fst o fst) (args ~~ vs)); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
413 |
val eqn = mk_eq (x, list_ccomb (con, vs)); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
414 |
val conj = foldr1 mk_conj (eqn :: map mk_defined nonlazy); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
415 |
in Library.foldr mk_ex (vs, conj) end; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
416 |
val goal = mk_trp (foldr1 mk_disj (mk_undef x :: map one_con spec')); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
417 |
(* first 3 rules replace "x = UU \/ P" with "rep$x = UU \/ P" *) |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
418 |
val tacs = [ |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
419 |
rtac (iso_locale RS @{thm iso.casedist_rule}) 1, |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
420 |
rewrite_goals_tac [mk_meta_eq (iso_locale RS @{thm iso.iso_swap})], |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
421 |
rtac thm3 1]; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
422 |
in |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
423 |
val exhaust = prove thy con_betas goal (K tacs); |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
424 |
val casedist = |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
425 |
(exhaust RS @{thm exh_casedist0}) |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
426 |
|> rewrite_rule @{thms exh_casedists} |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
427 |
|> Drule.export_without_context; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
428 |
end; |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
429 |
|
35453 | 430 |
(* prove compactness rules for constructors *) |
431 |
val con_compacts = |
|
432 |
let |
|
433 |
val rules = @{thms compact_sinl compact_sinr compact_spair |
|
434 |
compact_up compact_ONE}; |
|
435 |
val tacs = |
|
436 |
[rtac (iso_locale RS @{thm iso.compact_abs}) 1, |
|
437 |
REPEAT (resolve_tac rules 1 ORELSE atac 1)]; |
|
438 |
fun con_compact (con, args) = |
|
439 |
let |
|
35455 | 440 |
val vs = vars_of args; |
35453 | 441 |
val con_app = list_ccomb (con, vs); |
442 |
val concl = mk_trp (mk_compact con_app); |
|
443 |
val assms = map (mk_trp o mk_compact) vs; |
|
444 |
val goal = Logic.list_implies (assms, concl); |
|
445 |
in |
|
446 |
prove thy con_betas goal (K tacs) |
|
447 |
end; |
|
448 |
in |
|
449 |
map con_compact spec' |
|
450 |
end; |
|
451 |
||
452 |
(* prove strictness rules for constructors *) |
|
453 |
local |
|
454 |
fun con_strict (con, args) = |
|
455 |
let |
|
456 |
val rules = abs_strict :: @{thms con_strict_rules}; |
|
35455 | 457 |
val vs = vars_of args; |
35453 | 458 |
val nonlazy = map snd (filter_out fst (map fst args ~~ vs)); |
459 |
fun one_strict v' = |
|
460 |
let |
|
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
461 |
val UU = mk_bottom (fastype_of v'); |
35453 | 462 |
val vs' = map (fn v => if v = v' then UU else v) vs; |
463 |
val goal = mk_trp (mk_undef (list_ccomb (con, vs'))); |
|
464 |
val tacs = [simp_tac (HOL_basic_ss addsimps rules) 1]; |
|
465 |
in prove thy con_betas goal (K tacs) end; |
|
466 |
in map one_strict nonlazy end; |
|
467 |
||
468 |
fun con_defin (con, args) = |
|
469 |
let |
|
470 |
fun iff_disj (t, []) = HOLogic.mk_not t |
|
471 |
| iff_disj (t, ts) = mk_eq (t, foldr1 HOLogic.mk_disj ts); |
|
35455 | 472 |
val vs = vars_of args; |
35453 | 473 |
val nonlazy = map snd (filter_out fst (map fst args ~~ vs)); |
474 |
val lhs = mk_undef (list_ccomb (con, vs)); |
|
475 |
val rhss = map mk_undef nonlazy; |
|
476 |
val goal = mk_trp (iff_disj (lhs, rhss)); |
|
477 |
val rule1 = iso_locale RS @{thm iso.abs_defined_iff}; |
|
478 |
val rules = rule1 :: @{thms con_defined_iff_rules}; |
|
479 |
val tacs = [simp_tac (HOL_ss addsimps rules) 1]; |
|
480 |
in prove thy con_betas goal (K tacs) end; |
|
481 |
in |
|
482 |
val con_stricts = maps con_strict spec'; |
|
483 |
val con_defins = map con_defin spec'; |
|
484 |
val con_rews = con_stricts @ con_defins; |
|
485 |
end; |
|
486 |
||
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
487 |
(* prove injectiveness of constructors *) |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
488 |
local |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
489 |
fun pgterm rel (con, args) = |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
490 |
let |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
491 |
fun prime (Free (n, T)) = Free (n^"'", T) |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
492 |
| prime t = t; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
493 |
val xs = vars_of args; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
494 |
val ys = map prime xs; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
495 |
val nonlazy = map snd (filter_out (fst o fst) (args ~~ xs)); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
496 |
val lhs = rel (list_ccomb (con, xs), list_ccomb (con, ys)); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
497 |
val rhs = foldr1 mk_conj (ListPair.map rel (xs, ys)); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
498 |
val concl = mk_trp (mk_eq (lhs, rhs)); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
499 |
val zs = case args of [_] => [] | _ => nonlazy; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
500 |
val assms = map (mk_trp o mk_defined) zs; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
501 |
val goal = Logic.list_implies (assms, concl); |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
502 |
in prove thy con_betas goal end; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
503 |
val cons' = filter (fn (_, args) => not (null args)) spec'; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
504 |
in |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
505 |
val inverts = |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
506 |
let |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
507 |
val abs_below = iso_locale RS @{thm iso.abs_below}; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
508 |
val rules1 = abs_below :: @{thms sinl_below sinr_below spair_below up_below}; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
509 |
val rules2 = @{thms up_defined spair_defined ONE_defined} |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
510 |
val rules = rules1 @ rules2; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
511 |
val tacs = [asm_simp_tac (simple_ss addsimps rules) 1]; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
512 |
in map (fn c => pgterm mk_below c (K tacs)) cons' end; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
513 |
val injects = |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
514 |
let |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
515 |
val abs_eq = iso_locale RS @{thm iso.abs_eq}; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
516 |
val rules1 = abs_eq :: @{thms sinl_eq sinr_eq spair_eq up_eq}; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
517 |
val rules2 = @{thms up_defined spair_defined ONE_defined} |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
518 |
val rules = rules1 @ rules2; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
519 |
val tacs = [asm_simp_tac (simple_ss addsimps rules) 1]; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
520 |
in map (fn c => pgterm mk_eq c (K tacs)) cons' end; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
521 |
end; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
522 |
|
35458
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
523 |
(* prove distinctness of constructors *) |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
524 |
local |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
525 |
fun map_dist (f : 'a -> 'a -> 'b) (xs : 'a list) : 'b list = |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
526 |
flat (map_index (fn (i, x) => map (f x) (nth_drop i xs)) xs); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
527 |
fun prime (Free (n, T)) = Free (n^"'", T) |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
528 |
| prime t = t; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
529 |
fun iff_disj (t, []) = mk_not t |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
530 |
| iff_disj (t, ts) = mk_eq (t, foldr1 mk_disj ts); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
531 |
fun iff_disj2 (t, [], us) = mk_not t |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
532 |
| iff_disj2 (t, ts, []) = mk_not t |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
533 |
| iff_disj2 (t, ts, us) = |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
534 |
mk_eq (t, mk_conj (foldr1 mk_disj ts, foldr1 mk_disj us)); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
535 |
fun dist_le (con1, args1) (con2, args2) = |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
536 |
let |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
537 |
val vs1 = vars_of args1; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
538 |
val vs2 = map prime (vars_of args2); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
539 |
val zs1 = map snd (filter_out (fst o fst) (args1 ~~ vs1)); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
540 |
val lhs = mk_below (list_ccomb (con1, vs1), list_ccomb (con2, vs2)); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
541 |
val rhss = map mk_undef zs1; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
542 |
val goal = mk_trp (iff_disj (lhs, rhss)); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
543 |
val rule1 = iso_locale RS @{thm iso.abs_below}; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
544 |
val rules = rule1 :: @{thms con_below_iff_rules}; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
545 |
val tacs = [simp_tac (HOL_ss addsimps rules) 1]; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
546 |
in prove thy con_betas goal (K tacs) end; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
547 |
fun dist_eq (con1, args1) (con2, args2) = |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
548 |
let |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
549 |
val vs1 = vars_of args1; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
550 |
val vs2 = map prime (vars_of args2); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
551 |
val zs1 = map snd (filter_out (fst o fst) (args1 ~~ vs1)); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
552 |
val zs2 = map snd (filter_out (fst o fst) (args2 ~~ vs2)); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
553 |
val lhs = mk_eq (list_ccomb (con1, vs1), list_ccomb (con2, vs2)); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
554 |
val rhss1 = map mk_undef zs1; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
555 |
val rhss2 = map mk_undef zs2; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
556 |
val goal = mk_trp (iff_disj2 (lhs, rhss1, rhss2)); |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
557 |
val rule1 = iso_locale RS @{thm iso.abs_eq}; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
558 |
val rules = rule1 :: @{thms con_eq_iff_rules}; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
559 |
val tacs = [simp_tac (HOL_ss addsimps rules) 1]; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
560 |
in prove thy con_betas goal (K tacs) end; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
561 |
in |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
562 |
val dist_les = map_dist dist_le spec'; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
563 |
val dist_eqs = map_dist dist_eq spec'; |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
564 |
end; |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
565 |
|
35453 | 566 |
val result = |
567 |
{ |
|
568 |
con_consts = con_consts, |
|
569 |
con_betas = con_betas, |
|
35457
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
570 |
exhaust = exhaust, |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
571 |
casedist = casedist, |
35453 | 572 |
con_compacts = con_compacts, |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
573 |
con_rews = con_rews, |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
574 |
inverts = inverts, |
35458
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
575 |
injects = injects, |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
576 |
dist_les = dist_les, |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
577 |
dist_eqs = dist_eqs |
35453 | 578 |
}; |
579 |
in |
|
580 |
(result, thy) |
|
581 |
end; |
|
582 |
||
583 |
(******************************************************************************) |
|
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
584 |
(**************** definition and theorems for case combinator *****************) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
585 |
(******************************************************************************) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
586 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
587 |
fun add_case_combinator |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
588 |
(spec : (term * (bool * typ) list) list) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
589 |
(lhsT : typ) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
590 |
(dname : string) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
591 |
(case_def : thm) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
592 |
(con_betas : thm list) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
593 |
(casedist : thm) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
594 |
(iso_locale : thm) |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
595 |
(thy : theory) |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
596 |
: ((typ -> term) * thm list) * theory = |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
597 |
let |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
598 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
599 |
(* prove rep/abs rules *) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
600 |
val rep_strict = iso_locale RS @{thm iso.rep_strict}; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
601 |
val abs_inverse = iso_locale RS @{thm iso.abs_iso}; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
602 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
603 |
(* calculate function arguments of case combinator *) |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
604 |
val resultT = TVar (("'t",0), @{sort pcpo}); |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
605 |
fun fTs T = map (fn (_, args) => map snd args -->> T) spec; |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
606 |
val fns = Datatype_Prop.indexify_names (map (K "f") spec); |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
607 |
val fs = map Free (fns ~~ fTs resultT); |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
608 |
fun caseT T = fTs T -->> (lhsT ->> T); |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
609 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
610 |
(* TODO: move definition of case combinator here *) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
611 |
val case_bind = Binding.name (dname ^ "_when"); |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
612 |
val case_name = Sign.full_name thy case_bind; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
613 |
fun case_const T = Const (case_name, caseT T); |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
614 |
val case_app = list_ccomb (case_const resultT, fs); |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
615 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
616 |
(* prove beta reduction rule for case combinator *) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
617 |
val case_beta = beta_of_def thy case_def; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
618 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
619 |
(* prove strictness of case combinator *) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
620 |
val case_strict = |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
621 |
let |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
622 |
val defs = [case_beta, mk_meta_eq rep_strict]; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
623 |
val lhs = case_app ` mk_bottom lhsT; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
624 |
val goal = mk_trp (mk_eq (lhs, mk_bottom resultT)); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
625 |
val tacs = [resolve_tac @{thms sscase1 ssplit1 strictify1} 1]; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
626 |
in prove thy defs goal (K tacs) end; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
627 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
628 |
(* prove rewrites for case combinator *) |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
629 |
local |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
630 |
fun one_case (con, args) f = |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
631 |
let |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
632 |
val Ts = map snd args; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
633 |
val ns = Name.variant_list fns (Datatype_Prop.make_tnames Ts); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
634 |
val vs = map Free (ns ~~ Ts); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
635 |
val nonlazy = map snd (filter_out (fst o fst) (args ~~ vs)); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
636 |
val assms = map (mk_trp o mk_defined) nonlazy; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
637 |
val lhs = case_app ` list_ccomb (con, vs); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
638 |
val rhs = list_ccomb (f, vs); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
639 |
val concl = mk_trp (mk_eq (lhs, rhs)); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
640 |
val goal = Logic.list_implies (assms, concl); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
641 |
val defs = case_beta :: con_betas; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
642 |
val rules1 = @{thms sscase2 sscase3 ssplit2 fup2 ID1}; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
643 |
val rules2 = @{thms con_defined_iff_rules}; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
644 |
val rules = abs_inverse :: rules1 @ rules2; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
645 |
val tacs = [asm_simp_tac (beta_ss addsimps rules) 1]; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
646 |
in prove thy defs goal (K tacs) end; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
647 |
in |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
648 |
val case_apps = map2 one_case spec fs; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
649 |
end |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
650 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
651 |
in |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
652 |
((case_const, case_strict :: case_apps), thy) |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
653 |
end |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
654 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
655 |
(******************************************************************************) |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
656 |
(************** definitions and theorems for selector functions ***************) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
657 |
(******************************************************************************) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
658 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
659 |
fun add_selectors |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
660 |
(spec : (term * (bool * binding option * typ) list) list) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
661 |
(rep_const : term) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
662 |
(abs_inv : thm) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
663 |
(rep_strict : thm) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
664 |
(rep_strict_iff : thm) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
665 |
(con_betas : thm list) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
666 |
(thy : theory) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
667 |
: thm list * theory = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
668 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
669 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
670 |
(* define selector functions *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
671 |
val ((sel_consts, sel_defs), thy) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
672 |
let |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
673 |
fun rangeT s = snd (dest_cfunT (fastype_of s)); |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
674 |
fun mk_outl s = mk_cfcomp (from_sinl (dest_ssumT (rangeT s)), s); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
675 |
fun mk_outr s = mk_cfcomp (from_sinr (dest_ssumT (rangeT s)), s); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
676 |
fun mk_sfst s = mk_cfcomp (sfst_const (dest_sprodT (rangeT s)), s); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
677 |
fun mk_ssnd s = mk_cfcomp (ssnd_const (dest_sprodT (rangeT s)), s); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
678 |
fun mk_down s = mk_cfcomp (from_up (dest_upT (rangeT s)), s); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
679 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
680 |
fun sels_of_arg s (lazy, NONE, T) = [] |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
681 |
| sels_of_arg s (lazy, SOME b, T) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
682 |
[(b, if lazy then mk_down s else s, NoSyn)]; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
683 |
fun sels_of_args s [] = [] |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
684 |
| sels_of_args s (v :: []) = sels_of_arg s v |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
685 |
| sels_of_args s (v :: vs) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
686 |
sels_of_arg (mk_sfst s) v @ sels_of_args (mk_ssnd s) vs; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
687 |
fun sels_of_cons s [] = [] |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
688 |
| sels_of_cons s ((con, args) :: []) = sels_of_args s args |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
689 |
| sels_of_cons s ((con, args) :: cs) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
690 |
sels_of_args (mk_outl s) args @ sels_of_cons (mk_outr s) cs; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
691 |
val sel_eqns : (binding * term * mixfix) list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
692 |
sels_of_cons rep_const spec; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
693 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
694 |
define_consts sel_eqns thy |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
695 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
696 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
697 |
(* replace bindings with terms in constructor spec *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
698 |
val spec2 : (term * (bool * term option * typ) list) list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
699 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
700 |
fun prep_arg (lazy, NONE, T) sels = ((lazy, NONE, T), sels) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
701 |
| prep_arg (lazy, SOME _, T) sels = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
702 |
((lazy, SOME (hd sels), T), tl sels); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
703 |
fun prep_con (con, args) sels = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
704 |
apfst (pair con) (fold_map prep_arg args sels); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
705 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
706 |
fst (fold_map prep_con spec sel_consts) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
707 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
708 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
709 |
(* prove selector strictness rules *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
710 |
val sel_stricts : thm list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
711 |
let |
35449 | 712 |
val rules = rep_strict :: @{thms sel_strict_rules}; |
713 |
val tacs = [simp_tac (HOL_basic_ss addsimps rules) 1]; |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
714 |
fun sel_strict sel = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
715 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
716 |
val goal = mk_trp (mk_strict sel); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
717 |
in |
35449 | 718 |
prove thy sel_defs goal (K tacs) |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
719 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
720 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
721 |
map sel_strict sel_consts |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
722 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
723 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
724 |
(* prove selector application rules *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
725 |
val sel_apps : thm list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
726 |
let |
35449 | 727 |
val defs = con_betas @ sel_defs; |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
728 |
val rules = abs_inv :: @{thms sel_app_rules}; |
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
729 |
val tacs = [asm_simp_tac (simple_ss addsimps rules) 1]; |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
730 |
fun sel_apps_of (i, (con, args)) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
731 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
732 |
val Ts : typ list = map #3 args; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
733 |
val ns : string list = Datatype_Prop.make_tnames Ts; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
734 |
val vs : term list = map Free (ns ~~ Ts); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
735 |
val con_app : term = list_ccomb (con, vs); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
736 |
val vs' : (bool * term) list = map #1 args ~~ vs; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
737 |
fun one_same (n, sel, T) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
738 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
739 |
val xs = map snd (filter_out fst (nth_drop n vs')); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
740 |
val assms = map (mk_trp o mk_defined) xs; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
741 |
val concl = mk_trp (mk_eq (sel ` con_app, nth vs n)); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
742 |
val goal = Logic.list_implies (assms, concl); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
743 |
in |
35449 | 744 |
prove thy defs goal (K tacs) |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
745 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
746 |
fun one_diff (n, sel, T) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
747 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
748 |
val goal = mk_trp (mk_eq (sel ` con_app, mk_bottom T)); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
749 |
in |
35449 | 750 |
prove thy defs goal (K tacs) |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
751 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
752 |
fun one_con (j, (_, args')) : thm list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
753 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
754 |
fun prep (i, (lazy, NONE, T)) = NONE |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
755 |
| prep (i, (lazy, SOME sel, T)) = SOME (i, sel, T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
756 |
val sels : (int * term * typ) list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
757 |
map_filter prep (map_index I args'); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
758 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
759 |
if i = j |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
760 |
then map one_same sels |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
761 |
else map one_diff sels |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
762 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
763 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
764 |
flat (map_index one_con spec2) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
765 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
766 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
767 |
flat (map_index sel_apps_of spec2) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
768 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
769 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
770 |
(* prove selector definedness rules *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
771 |
val sel_defins : thm list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
772 |
let |
35449 | 773 |
val rules = rep_strict_iff :: @{thms sel_defined_iff_rules}; |
774 |
val tacs = [simp_tac (HOL_basic_ss addsimps rules) 1]; |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
775 |
fun sel_defin sel = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
776 |
let |
35456
5356534f880e
move proofs of injects and inverts to domain_constructors.ML
huffman
parents:
35455
diff
changeset
|
777 |
val (T, U) = dest_cfunT (fastype_of sel); |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
778 |
val x = Free ("x", T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
779 |
val lhs = mk_eq (sel ` x, mk_bottom U); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
780 |
val rhs = mk_eq (x, mk_bottom T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
781 |
val goal = mk_trp (mk_eq (lhs, rhs)); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
782 |
in |
35449 | 783 |
prove thy sel_defs goal (K tacs) |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
784 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
785 |
fun one_arg (false, SOME sel, T) = SOME (sel_defin sel) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
786 |
| one_arg _ = NONE; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
787 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
788 |
case spec2 of |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
789 |
[(con, args)] => map_filter one_arg args |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
790 |
| _ => [] |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
791 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
792 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
793 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
794 |
(sel_stricts @ sel_defins @ sel_apps, thy) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
795 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
796 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
797 |
(******************************************************************************) |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
798 |
(************ definitions and theorems for discriminator functions ************) |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
799 |
(******************************************************************************) |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
800 |
|
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
801 |
fun add_discriminators |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
802 |
(bindings : binding list) |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
803 |
(spec : (term * (bool * typ) list) list) |
35461
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
804 |
(lhsT : typ) |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
805 |
(casedist : thm) |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
806 |
(case_const : typ -> term) |
35461
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
807 |
(case_rews : thm list) |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
808 |
(thy : theory) = |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
809 |
let |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
810 |
|
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
811 |
fun vars_of args = |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
812 |
let |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
813 |
val Ts = map snd args; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
814 |
val ns = Datatype_Prop.make_tnames Ts; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
815 |
in |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
816 |
map Free (ns ~~ Ts) |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
817 |
end; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
818 |
|
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
819 |
(* define discriminator functions *) |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
820 |
local |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
821 |
fun dis_fun i (j, (con, args)) = |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
822 |
let |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
823 |
val Ts = map snd args; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
824 |
val ns = Datatype_Prop.make_tnames Ts; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
825 |
val vs = map Free (ns ~~ Ts); |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
826 |
val tr = if i = j then @{term TT} else @{term FF}; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
827 |
in |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
828 |
big_lambdas vs tr |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
829 |
end; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
830 |
fun dis_eqn (i, bind) : binding * term * mixfix = |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
831 |
let |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
832 |
val dis_bind = Binding.prefix_name "is_" bind; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
833 |
val rhs = list_ccomb (case_const trT, map_index (dis_fun i) spec); |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
834 |
in |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
835 |
(dis_bind, rhs, NoSyn) |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
836 |
end; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
837 |
in |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
838 |
val ((dis_consts, dis_defs), thy) = |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
839 |
define_consts (map_index dis_eqn bindings) thy |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
840 |
end; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
841 |
|
35461
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
842 |
(* prove discriminator strictness rules *) |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
843 |
local |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
844 |
fun dis_strict dis = |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
845 |
let val goal = mk_trp (mk_strict dis); |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
846 |
in prove thy dis_defs goal (K [rtac (hd case_rews) 1]) end; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
847 |
in |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
848 |
val dis_stricts = map dis_strict dis_consts; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
849 |
end; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
850 |
|
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
851 |
(* prove discriminator/constructor rules *) |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
852 |
local |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
853 |
fun dis_app (i, dis) (j, (con, args)) = |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
854 |
let |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
855 |
val Ts = map snd args; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
856 |
val ns = Datatype_Prop.make_tnames Ts; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
857 |
val vs = map Free (ns ~~ Ts); |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
858 |
val nonlazy = map snd (filter_out (fst o fst) (args ~~ vs)); |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
859 |
val lhs = dis ` list_ccomb (con, vs); |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
860 |
val rhs = if i = j then @{term TT} else @{term FF}; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
861 |
val assms = map (mk_trp o mk_defined) nonlazy; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
862 |
val concl = mk_trp (mk_eq (lhs, rhs)); |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
863 |
val goal = Logic.list_implies (assms, concl); |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
864 |
val tacs = [asm_simp_tac (beta_ss addsimps case_rews) 1]; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
865 |
in prove thy dis_defs goal (K tacs) end; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
866 |
fun one_dis (i, dis) = |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
867 |
map_index (dis_app (i, dis)) spec; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
868 |
in |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
869 |
val dis_apps = flat (map_index one_dis dis_consts); |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
870 |
end; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
871 |
|
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
872 |
(* prove discriminator definedness rules *) |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
873 |
local |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
874 |
fun dis_defin dis = |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
875 |
let |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
876 |
val x = Free ("x", lhsT); |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
877 |
val simps = dis_apps @ @{thms dist_eq_tr}; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
878 |
val tacs = |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
879 |
[rtac @{thm iffI} 1, |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
880 |
asm_simp_tac (HOL_basic_ss addsimps dis_stricts) 2, |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
881 |
rtac casedist 1, atac 1, |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
882 |
DETERM_UNTIL_SOLVED (CHANGED |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
883 |
(asm_full_simp_tac (simple_ss addsimps simps) 1))]; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
884 |
val goal = mk_trp (mk_eq (mk_undef (dis ` x), mk_undef x)); |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
885 |
in prove thy [] goal (K tacs) end; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
886 |
in |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
887 |
val dis_defins = map dis_defin dis_consts; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
888 |
end; |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
889 |
|
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
890 |
in |
35461
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
891 |
(dis_stricts @ dis_defins @ dis_apps, thy) |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
892 |
end; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
893 |
|
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
894 |
(******************************************************************************) |
35450
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
895 |
(******************************* main function ********************************) |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
896 |
(******************************************************************************) |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
897 |
|
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
898 |
fun add_domain_constructors |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
899 |
(dname : string) |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
900 |
(lhsT : typ, |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
901 |
spec : (binding * (bool * binding option * typ) list * mixfix) list) |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
902 |
(rep_const : term, abs_const : term) |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
903 |
(rep_iso_thm : thm, abs_iso_thm : thm) |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
904 |
(case_def : thm) |
35450
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
905 |
(thy : theory) = |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
906 |
let |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
907 |
|
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
908 |
(* prove rep/abs strictness rules *) |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
909 |
val iso_locale = @{thm iso.intro} OF [abs_iso_thm, rep_iso_thm]; |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
910 |
val rep_strict = iso_locale RS @{thm iso.rep_strict}; |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
911 |
val abs_strict = iso_locale RS @{thm iso.abs_strict}; |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
912 |
val rep_defined_iff = iso_locale RS @{thm iso.rep_defined_iff}; |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
913 |
val abs_defined_iff = iso_locale RS @{thm iso.abs_defined_iff}; |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
914 |
|
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
915 |
(* define constructor functions *) |
35457
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
916 |
val (con_result, thy) = |
35454
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
917 |
let |
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
918 |
fun prep_arg (lazy, sel, T) = (lazy, T); |
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
919 |
fun prep_con (b, args, mx) = (b, map prep_arg args, mx); |
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
920 |
val con_spec = map prep_con spec; |
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
921 |
in |
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
922 |
add_constructors con_spec abs_const iso_locale thy |
cf6ba350b7ca
remove unnecessary stuff from argument to add_constructors function
huffman
parents:
35453
diff
changeset
|
923 |
end; |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
924 |
val {con_consts, con_betas, casedist, ...} = con_result; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
925 |
|
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
926 |
(* define case combinator *) |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
927 |
val ((case_const : typ -> term, cases : thm list), thy) = |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
928 |
let |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
929 |
fun prep_arg (lazy, sel, T) = (lazy, T); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
930 |
fun prep_con c (b, args, mx) = (c, map prep_arg args); |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
931 |
val case_spec = map2 prep_con con_consts spec; |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
932 |
in |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
933 |
add_case_combinator case_spec lhsT dname |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
934 |
case_def con_betas casedist iso_locale thy |
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
935 |
end; |
35450
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
936 |
|
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
937 |
(* TODO: enable this earlier *) |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
938 |
val thy = Sign.add_path dname thy; |
e9ef2b50ac59
move constructor-specific stuff to a separate function
huffman
parents:
35449
diff
changeset
|
939 |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
940 |
(* define and prove theorems for selector functions *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
941 |
val (sel_thms : thm list, thy : theory) = |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
942 |
let |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
943 |
val sel_spec : (term * (bool * binding option * typ) list) list = |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
944 |
map2 (fn con => fn (b, args, mx) => (con, args)) con_consts spec; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
945 |
in |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
946 |
add_selectors sel_spec rep_const |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
947 |
abs_iso_thm rep_strict rep_defined_iff con_betas thy |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
948 |
end; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
949 |
|
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
950 |
(* define and prove theorems for discriminator functions *) |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
951 |
val (dis_thms : thm list, thy : theory) = |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
952 |
let |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
953 |
val bindings = map #1 spec; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
954 |
fun prep_arg (lazy, sel, T) = (lazy, T); |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
955 |
fun prep_con c (b, args, mx) = (c, map prep_arg args); |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
956 |
val dis_spec = map2 prep_con con_consts spec; |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
957 |
in |
35461
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
958 |
add_discriminators bindings dis_spec lhsT |
34360a1e3537
move proofs of dis_rews to domain_constructors.ML; change dis_defins to iff-style
huffman
parents:
35460
diff
changeset
|
959 |
casedist case_const cases thy |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
960 |
end |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
961 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
962 |
(* restore original signature path *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
963 |
val thy = Sign.parent_path thy; |
35444 | 964 |
|
965 |
val result = |
|
966 |
{ con_consts = con_consts, |
|
35451 | 967 |
con_betas = con_betas, |
35457
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
968 |
exhaust = #exhaust con_result, |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
969 |
casedist = casedist, |
35457
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
970 |
con_compacts = #con_compacts con_result, |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
971 |
con_rews = #con_rews con_result, |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
972 |
inverts = #inverts con_result, |
d63655b88369
move proofs of casedist into domain_constructors.ML
huffman
parents:
35456
diff
changeset
|
973 |
injects = #injects con_result, |
35458
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
974 |
dist_les = #dist_les con_result, |
deaf221c4a59
moved proofs of dist_les and dist_eqs to domain_constructors.ML
huffman
parents:
35457
diff
changeset
|
975 |
dist_eqs = #dist_eqs con_result, |
35459
3d8acfae6fb8
move proofs of when_rews intro domain_constructors.ML
huffman
parents:
35458
diff
changeset
|
976 |
cases = cases, |
35460
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
977 |
sel_rews = sel_thms, |
8cb42aa19358
move definition of discriminators to domain_constructors.ML
huffman
parents:
35459
diff
changeset
|
978 |
dis_rews = dis_thms }; |
35444 | 979 |
in |
980 |
(result, thy) |
|
981 |
end; |
|
982 |
||
983 |
end; |