author | huffman |
Thu, 25 Feb 2010 13:16:28 -0800 | |
changeset 35446 | b719dad322fa |
parent 35445 | 593c184977a4 |
child 35447 | 82af95d998e0 |
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 |
|
15 |
-> theory |
|
16 |
-> { con_consts : term list, |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
17 |
con_defs : thm list, |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
18 |
sel_rews : thm list } |
35444 | 19 |
* theory; |
20 |
end; |
|
21 |
||
22 |
||
23 |
structure Domain_Constructors :> DOMAIN_CONSTRUCTORS = |
|
24 |
struct |
|
25 |
||
26 |
(******************************************************************************) |
|
27 |
(************************** building types and terms **************************) |
|
28 |
(******************************************************************************) |
|
29 |
||
30 |
||
31 |
(*** Continuous function space ***) |
|
32 |
||
33 |
(* ->> is taken from holcf_logic.ML *) |
|
34 |
fun mk_cfunT (T, U) = Type(@{type_name "->"}, [T, U]); |
|
35 |
||
36 |
infixr 6 ->>; val (op ->>) = mk_cfunT; |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
37 |
infix -->>; val (op -->>) = Library.foldr mk_cfunT; |
35444 | 38 |
|
39 |
fun dest_cfunT (Type(@{type_name "->"}, [T, U])) = (T, U) |
|
40 |
| dest_cfunT T = raise TYPE ("dest_cfunT", [T], []); |
|
41 |
||
42 |
fun capply_const (S, T) = |
|
43 |
Const(@{const_name Rep_CFun}, (S ->> T) --> (S --> T)); |
|
44 |
||
45 |
fun cabs_const (S, T) = |
|
46 |
Const(@{const_name Abs_CFun}, (S --> T) --> (S ->> T)); |
|
47 |
||
48 |
fun mk_cabs t = |
|
49 |
let val T = Term.fastype_of t |
|
50 |
in cabs_const (Term.domain_type T, Term.range_type T) $ t end |
|
51 |
||
52 |
(* builds the expression (LAM v. rhs) *) |
|
53 |
fun big_lambda v rhs = |
|
54 |
cabs_const (Term.fastype_of v, Term.fastype_of rhs) $ Term.lambda v rhs; |
|
55 |
||
56 |
(* builds the expression (LAM v1 v2 .. vn. rhs) *) |
|
57 |
fun big_lambdas [] rhs = rhs |
|
58 |
| big_lambdas (v::vs) rhs = big_lambda v (big_lambdas vs rhs); |
|
59 |
||
60 |
fun mk_capply (t, u) = |
|
61 |
let val (S, T) = |
|
62 |
case Term.fastype_of t of |
|
63 |
Type(@{type_name "->"}, [S, T]) => (S, T) |
|
64 |
| _ => raise TERM ("mk_capply " ^ ML_Syntax.print_list ML_Syntax.print_term [t, u], [t, u]); |
|
65 |
in capply_const (S, T) $ t $ u end; |
|
66 |
||
67 |
infix 9 ` ; val (op `) = mk_capply; |
|
68 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
69 |
val list_ccomb : term * term list -> term = Library.foldl mk_capply; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
70 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
71 |
fun mk_ID T = Const (@{const_name ID}, T ->> T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
72 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
73 |
fun cfcomp_const (T, U, V) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
74 |
Const (@{const_name cfcomp}, (U ->> V) ->> (T ->> U) ->> (T ->> V)); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
75 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
76 |
fun mk_cfcomp (f, g) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
77 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
78 |
val (U, V) = dest_cfunT (Term.fastype_of f); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
79 |
val (T, U') = dest_cfunT (Term.fastype_of g); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
80 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
81 |
if U = U' |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
82 |
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
|
83 |
else raise TYPE ("mk_cfcomp", [U, U'], [f, g]) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
84 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
85 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
86 |
fun mk_bottom T = Const (@{const_name UU}, T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
87 |
|
35444 | 88 |
|
89 |
(*** Product type ***) |
|
90 |
||
91 |
fun mk_tupleT [] = HOLogic.unitT |
|
92 |
| mk_tupleT [T] = T |
|
93 |
| mk_tupleT (T :: Ts) = HOLogic.mk_prodT (T, mk_tupleT Ts); |
|
94 |
||
95 |
(* builds the expression (v1,v2,..,vn) *) |
|
96 |
fun mk_tuple [] = HOLogic.unit |
|
97 |
| mk_tuple (t::[]) = t |
|
98 |
| mk_tuple (t::ts) = HOLogic.mk_prod (t, mk_tuple ts); |
|
99 |
||
100 |
(* builds the expression (%(v1,v2,..,vn). rhs) *) |
|
101 |
fun lambda_tuple [] rhs = Term.lambda (Free("unit", HOLogic.unitT)) rhs |
|
102 |
| lambda_tuple (v::[]) rhs = Term.lambda v rhs |
|
103 |
| lambda_tuple (v::vs) rhs = |
|
104 |
HOLogic.mk_split (Term.lambda v (lambda_tuple vs rhs)); |
|
105 |
||
106 |
||
107 |
(*** Lifted cpo type ***) |
|
108 |
||
109 |
fun mk_upT T = Type(@{type_name "u"}, [T]); |
|
110 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
111 |
fun dest_upT (Type(@{type_name "u"}, [T])) = T |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
112 |
| dest_upT T = raise TYPE ("dest_upT", [T], []); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
113 |
|
35444 | 114 |
fun up_const T = Const(@{const_name up}, T ->> mk_upT T); |
115 |
||
116 |
fun mk_up t = up_const (Term.fastype_of t) ` t; |
|
117 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
118 |
fun fup_const (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
119 |
Const(@{const_name fup}, (T ->> U) ->> mk_upT T ->> U); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
120 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
121 |
fun from_up T = fup_const (T, T) ` mk_ID T; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
122 |
|
35444 | 123 |
|
124 |
(*** Strict product type ***) |
|
125 |
||
126 |
val oneT = @{typ "one"}; |
|
127 |
||
128 |
fun mk_sprodT (T, U) = Type(@{type_name "**"}, [T, U]); |
|
129 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
130 |
fun dest_sprodT (Type(@{type_name "**"}, [T, U])) = (T, U) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
131 |
| dest_sprodT T = raise TYPE ("dest_sprodT", [T], []); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
132 |
|
35444 | 133 |
fun spair_const (T, U) = |
134 |
Const(@{const_name spair}, T ->> U ->> mk_sprodT (T, U)); |
|
135 |
||
136 |
(* builds the expression (:t, u:) *) |
|
137 |
fun mk_spair (t, u) = |
|
138 |
spair_const (Term.fastype_of t, Term.fastype_of u) ` t ` u; |
|
139 |
||
140 |
(* builds the expression (:t1,t2,..,tn:) *) |
|
141 |
fun mk_stuple [] = @{term "ONE"} |
|
142 |
| mk_stuple (t::[]) = t |
|
143 |
| mk_stuple (t::ts) = mk_spair (t, mk_stuple ts); |
|
144 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
145 |
fun sfst_const (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
146 |
Const(@{const_name sfst}, mk_sprodT (T, U) ->> T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
147 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
148 |
fun ssnd_const (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
149 |
Const(@{const_name ssnd}, mk_sprodT (T, U) ->> U); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
150 |
|
35444 | 151 |
|
152 |
(*** Strict sum type ***) |
|
153 |
||
154 |
fun mk_ssumT (T, U) = Type(@{type_name "++"}, [T, U]); |
|
155 |
||
156 |
fun dest_ssumT (Type(@{type_name "++"}, [T, U])) = (T, U) |
|
157 |
| dest_ssumT T = raise TYPE ("dest_ssumT", [T], []); |
|
158 |
||
159 |
fun sinl_const (T, U) = Const(@{const_name sinl}, T ->> mk_ssumT (T, U)); |
|
160 |
fun sinr_const (T, U) = Const(@{const_name sinr}, U ->> mk_ssumT (T, U)); |
|
161 |
||
162 |
(* builds the list [sinl(t1), sinl(sinr(t2)), ... sinr(...sinr(tn))] *) |
|
163 |
fun mk_sinjects ts = |
|
164 |
let |
|
165 |
val Ts = map Term.fastype_of ts; |
|
166 |
fun combine (t, T) (us, U) = |
|
167 |
let |
|
168 |
val v = sinl_const (T, U) ` t; |
|
169 |
val vs = map (fn u => sinr_const (T, U) ` u) us; |
|
170 |
in |
|
171 |
(v::vs, mk_ssumT (T, U)) |
|
172 |
end |
|
173 |
fun inj [] = error "mk_sinjects: empty list" |
|
174 |
| inj ((t, T)::[]) = ([t], T) |
|
175 |
| inj ((t, T)::ts) = combine (t, T) (inj ts); |
|
176 |
in |
|
177 |
fst (inj (ts ~~ Ts)) |
|
178 |
end; |
|
179 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
180 |
fun sscase_const (T, U, V) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
181 |
Const(@{const_name sscase}, |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
182 |
(T ->> V) ->> (U ->> V) ->> mk_ssumT (T, U) ->> V); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
183 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
184 |
fun from_sinl (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
185 |
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
|
186 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
187 |
fun from_sinr (T, U) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
188 |
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
|
189 |
|
35444 | 190 |
|
191 |
(*** miscellaneous constructions ***) |
|
192 |
||
193 |
val trT = @{typ "tr"}; |
|
194 |
||
195 |
val deflT = @{typ "udom alg_defl"}; |
|
196 |
||
197 |
fun mapT T = |
|
198 |
let |
|
199 |
fun argTs (Type (_, Ts)) = Ts | argTs _ = []; |
|
200 |
fun auto T = T ->> T; |
|
201 |
in |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
202 |
map auto (argTs T) -->> auto T |
35444 | 203 |
end; |
204 |
||
205 |
val mk_equals = Logic.mk_equals; |
|
206 |
val mk_eq = HOLogic.mk_eq; |
|
207 |
val mk_trp = HOLogic.mk_Trueprop; |
|
208 |
val mk_fst = HOLogic.mk_fst; |
|
209 |
val mk_snd = HOLogic.mk_snd; |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
210 |
val mk_not = HOLogic.mk_not; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
211 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
212 |
fun mk_strict t = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
213 |
let val (T, U) = dest_cfunT (Term.fastype_of t); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
214 |
in mk_eq (t ` mk_bottom T, mk_bottom U) end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
215 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
216 |
fun mk_defined t = mk_not (mk_eq (t, mk_bottom (Term.fastype_of t))); |
35444 | 217 |
|
218 |
fun mk_cont t = |
|
219 |
let val T = Term.fastype_of t |
|
220 |
in Const(@{const_name cont}, T --> HOLogic.boolT) $ t end; |
|
221 |
||
222 |
fun mk_fix t = |
|
223 |
let val (T, _) = dest_cfunT (Term.fastype_of t) |
|
224 |
in mk_capply (Const(@{const_name fix}, (T ->> T) ->> T), t) end; |
|
225 |
||
226 |
fun mk_Rep_of T = |
|
227 |
Const (@{const_name Rep_of}, Term.itselfT T --> deflT) $ Logic.mk_type T; |
|
228 |
||
229 |
fun coerce_const T = Const (@{const_name coerce}, T); |
|
230 |
||
231 |
fun isodefl_const T = |
|
232 |
Const (@{const_name isodefl}, (T ->> T) --> deflT --> HOLogic.boolT); |
|
233 |
||
234 |
(* splits a cterm into the right and lefthand sides of equality *) |
|
235 |
fun dest_eqs t = HOLogic.dest_eq (HOLogic.dest_Trueprop t); |
|
236 |
||
237 |
fun mk_eqs (t, u) = HOLogic.mk_Trueprop (HOLogic.mk_eq (t, u)); |
|
238 |
||
239 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
240 |
(************************** miscellaneous functions ***************************) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
241 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
242 |
(* |
35444 | 243 |
fun declare_consts |
244 |
(decls : (binding * typ * mixfix) list) |
|
245 |
(thy : theory) |
|
246 |
: term list * theory = |
|
247 |
let |
|
248 |
fun con (b, T, mx) = Const (Sign.full_name thy b, T); |
|
249 |
val thy = Cont_Consts.add_consts decls thy; |
|
250 |
in |
|
251 |
(map con decls, thy) |
|
252 |
end; |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
253 |
*) |
35444 | 254 |
|
255 |
fun define_consts |
|
256 |
(specs : (binding * term * mixfix) list) |
|
257 |
(thy : theory) |
|
258 |
: (term list * thm list) * theory = |
|
259 |
let |
|
260 |
fun mk_decl (b, t, mx) = (b, Term.fastype_of t, mx); |
|
261 |
val decls = map mk_decl specs; |
|
262 |
val thy = Cont_Consts.add_consts decls thy; |
|
263 |
fun mk_const (b, T, mx) = Const (Sign.full_name thy b, T); |
|
264 |
val consts = map mk_const decls; |
|
265 |
fun mk_def c (b, t, mx) = |
|
266 |
(Binding.suffix_name "_def" b, Logic.mk_equals (c, t)); |
|
267 |
val defs = map2 mk_def consts specs; |
|
268 |
val (def_thms, thy) = |
|
269 |
PureThy.add_defs false (map Thm.no_attributes defs) thy; |
|
270 |
in |
|
271 |
((consts, def_thms), thy) |
|
272 |
end; |
|
273 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
274 |
fun define_const |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
275 |
(spec : binding * term * mixfix) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
276 |
(thy : theory) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
277 |
: (term * thm) * theory = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
278 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
279 |
val ((consts, def_thms), thy) = define_consts [spec] thy; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
280 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
281 |
((hd consts, hd def_thms), thy) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
282 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
283 |
|
35445 | 284 |
|
285 |
(************** generating beta reduction rules from definitions **************) |
|
35444 | 286 |
|
35445 | 287 |
local |
288 |
fun arglist (Const _ $ Abs (s, T, t)) = |
|
289 |
let |
|
290 |
val arg = Free (s, T); |
|
291 |
val (args, body) = arglist (subst_bound (arg, t)); |
|
292 |
in (arg :: args, body) end |
|
293 |
| arglist t = ([], t); |
|
294 |
in |
|
295 |
fun beta_of_def thy def_thm = |
|
296 |
let |
|
297 |
val (con, lam) = Logic.dest_equals (concl_of def_thm); |
|
298 |
val (args, rhs) = arglist lam; |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
299 |
val lhs = list_ccomb (con, args); |
35445 | 300 |
val goal = mk_equals (lhs, rhs); |
301 |
val cs = ContProc.cont_thms lam; |
|
302 |
val betas = map (fn c => mk_meta_eq (c RS @{thm beta_cfun})) cs; |
|
303 |
val tac = |
|
304 |
rewrite_goals_tac (def_thm::betas) |
|
305 |
THEN rtac reflexive_thm 1; |
|
306 |
in |
|
307 |
Goal.prove_global thy [] [] goal (K tac) |
|
308 |
end; |
|
309 |
end; |
|
35444 | 310 |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
311 |
(******************************************************************************) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
312 |
(************** definitions and theorems for selector functions ***************) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
313 |
(******************************************************************************) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
314 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
315 |
fun add_selectors |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
316 |
(spec : (term * (bool * binding option * typ) list) list) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
317 |
(rep_const : term) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
318 |
(abs_inv : thm) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
319 |
(rep_strict : thm) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
320 |
(rep_strict_iff : thm) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
321 |
(con_betas : thm list) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
322 |
(thy : theory) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
323 |
: thm list * theory = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
324 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
325 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
326 |
(* define selector functions *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
327 |
val ((sel_consts, sel_defs), thy) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
328 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
329 |
fun rangeT s = snd (dest_cfunT (Term.fastype_of s)); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
330 |
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
|
331 |
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
|
332 |
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
|
333 |
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
|
334 |
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
|
335 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
336 |
fun sels_of_arg s (lazy, NONE, T) = [] |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
337 |
| sels_of_arg s (lazy, SOME b, T) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
338 |
[(b, if lazy then mk_down s else s, NoSyn)]; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
339 |
fun sels_of_args s [] = [] |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
340 |
| sels_of_args s (v :: []) = sels_of_arg s v |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
341 |
| sels_of_args s (v :: vs) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
342 |
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
|
343 |
fun sels_of_cons s [] = [] |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
344 |
| sels_of_cons s ((con, args) :: []) = sels_of_args s args |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
345 |
| sels_of_cons s ((con, args) :: cs) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
346 |
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
|
347 |
val sel_eqns : (binding * term * mixfix) list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
348 |
sels_of_cons rep_const spec; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
349 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
350 |
define_consts sel_eqns thy |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
351 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
352 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
353 |
(* replace bindings with terms in constructor spec *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
354 |
val spec2 : (term * (bool * term option * typ) list) list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
355 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
356 |
fun prep_arg (lazy, NONE, T) sels = ((lazy, NONE, T), sels) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
357 |
| prep_arg (lazy, SOME _, T) sels = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
358 |
((lazy, SOME (hd sels), T), tl sels); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
359 |
fun prep_con (con, args) sels = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
360 |
apfst (pair con) (fold_map prep_arg args sels); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
361 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
362 |
fst (fold_map prep_con spec sel_consts) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
363 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
364 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
365 |
(* prove selector strictness rules *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
366 |
val sel_stricts : thm list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
367 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
368 |
val rules = rep_strict :: sel_defs @ @{thms sel_strict_rules}; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
369 |
val tac = simp_tac (HOL_basic_ss addsimps rules) 1; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
370 |
fun sel_strict sel = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
371 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
372 |
val goal = mk_trp (mk_strict sel); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
373 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
374 |
Goal.prove_global thy [] [] goal (K tac) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
375 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
376 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
377 |
map sel_strict sel_consts |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
378 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
379 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
380 |
(* prove selector application rules *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
381 |
val sel_apps : thm list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
382 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
383 |
val rules = @{thms sel_app_rules}; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
384 |
val simps = simp_thms @ [abs_inv] @ con_betas @ sel_defs @ rules; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
385 |
val tac = asm_simp_tac (HOL_basic_ss addsimps simps) 1; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
386 |
fun sel_apps_of (i, (con, args)) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
387 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
388 |
val Ts : typ list = map #3 args; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
389 |
val ns : string list = Datatype_Prop.make_tnames Ts; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
390 |
val vs : term list = map Free (ns ~~ Ts); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
391 |
val con_app : term = list_ccomb (con, vs); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
392 |
val vs' : (bool * term) list = map #1 args ~~ vs; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
393 |
fun one_same (n, sel, T) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
394 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
395 |
val xs = map snd (filter_out fst (nth_drop n vs')); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
396 |
val assms = map (mk_trp o mk_defined) xs; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
397 |
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
|
398 |
val goal = Logic.list_implies (assms, concl); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
399 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
400 |
Goal.prove_global thy [] [] goal (K tac) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
401 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
402 |
fun one_diff (n, sel, T) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
403 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
404 |
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
|
405 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
406 |
Goal.prove_global thy [] [] goal (K tac) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
407 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
408 |
fun one_con (j, (_, args')) : thm list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
409 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
410 |
fun prep (i, (lazy, NONE, T)) = NONE |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
411 |
| prep (i, (lazy, SOME sel, T)) = SOME (i, sel, T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
412 |
val sels : (int * term * typ) list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
413 |
map_filter prep (map_index I args'); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
414 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
415 |
if i = j |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
416 |
then map one_same sels |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
417 |
else map one_diff sels |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
418 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
419 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
420 |
flat (map_index one_con spec2) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
421 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
422 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
423 |
flat (map_index sel_apps_of spec2) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
424 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
425 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
426 |
(* prove selector definedness rules *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
427 |
val sel_defins : thm list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
428 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
429 |
val rules = @{thms sel_defined_iff_rules}; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
430 |
val simps = rep_strict_iff :: sel_defs @ rules; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
431 |
val tac = simp_tac (HOL_basic_ss addsimps simps) 1; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
432 |
fun sel_defin sel = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
433 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
434 |
val (T, U) = dest_cfunT (Term.fastype_of sel); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
435 |
val x = Free ("x", T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
436 |
val lhs = mk_eq (sel ` x, mk_bottom U); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
437 |
val rhs = mk_eq (x, mk_bottom T); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
438 |
val goal = mk_trp (mk_eq (lhs, rhs)); |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
439 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
440 |
Goal.prove_global thy [] [] goal (K tac) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
441 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
442 |
fun one_arg (false, SOME sel, T) = SOME (sel_defin sel) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
443 |
| one_arg _ = NONE; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
444 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
445 |
case spec2 of |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
446 |
[(con, args)] => map_filter one_arg args |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
447 |
| _ => [] |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
448 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
449 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
450 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
451 |
(sel_stricts @ sel_defins @ sel_apps, thy) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
452 |
end |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
453 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
454 |
(******************************************************************************) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
455 |
(************* definitions and theorems for constructor functions *************) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
456 |
(******************************************************************************) |
35444 | 457 |
|
458 |
fun add_domain_constructors |
|
459 |
(dname : string) |
|
460 |
(lhsT : typ, |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
461 |
spec : (binding * (bool * binding option * typ) list * mixfix) list) |
35444 | 462 |
(rep_const : term, abs_const : term) |
463 |
(rep_iso_thm : thm, abs_iso_thm : thm) |
|
464 |
(thy : theory) = |
|
465 |
let |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
466 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
467 |
(* prove rep/abs strictness rules *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
468 |
val iso_locale = @{thm iso.intro} OF [abs_iso_thm, rep_iso_thm]; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
469 |
val rep_strict = iso_locale RS @{thm iso.rep_strict}; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
470 |
val abs_strict = iso_locale RS @{thm iso.abs_strict}; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
471 |
val rep_defined_iff = iso_locale RS @{thm iso.rep_defined_iff}; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
472 |
val abs_defined_iff = iso_locale RS @{thm iso.abs_defined_iff}; |
35444 | 473 |
|
474 |
(* define constructor functions *) |
|
475 |
val ((con_consts, con_def_thms), thy) = |
|
476 |
let |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
477 |
fun vars_of args = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
478 |
let |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
479 |
val Ts = map (fn (lazy,sel,T) => T) args; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
480 |
val ns = Datatype_Prop.make_tnames Ts; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
481 |
in |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
482 |
map Free (ns ~~ Ts) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
483 |
end; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
484 |
fun one_arg (lazy,_,_) var = if lazy then mk_up var else var; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
485 |
fun one_con (_,args,_) = mk_stuple (map2 one_arg args (vars_of args)); |
35444 | 486 |
fun mk_abs t = abs_const ` t; |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
487 |
val rhss = map mk_abs (mk_sinjects (map one_con spec)); |
35444 | 488 |
fun mk_def (bind, args, mx) rhs = |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
489 |
(bind, big_lambdas (vars_of args) rhs, mx); |
35444 | 490 |
in |
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
491 |
define_consts (map2 mk_def spec rhss) thy |
35444 | 492 |
end; |
493 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
494 |
(* prove beta reduction rules for constructors *) |
35445 | 495 |
val con_beta_thms = map (beta_of_def thy) con_def_thms; |
496 |
||
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
497 |
(* TODO: enable this earlier *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
498 |
val thy = Sign.add_path dname thy; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
499 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
500 |
(* replace bindings with terms in constructor spec *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
501 |
val spec2 : (term * (bool * binding option * typ) list) list = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
502 |
map2 (fn con => fn (b, args, mx) => (con, args)) con_consts spec; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
503 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
504 |
(* define and prove theorems for selector functions *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
505 |
val (sel_thms : thm list, thy : theory) = |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
506 |
add_selectors spec2 rep_const |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
507 |
abs_iso_thm rep_strict rep_defined_iff con_beta_thms thy; |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
508 |
|
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
509 |
(* restore original signature path *) |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
510 |
val thy = Sign.parent_path thy; |
35444 | 511 |
|
512 |
val result = |
|
513 |
{ con_consts = con_consts, |
|
35446
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
514 |
con_defs = con_def_thms, |
b719dad322fa
rewrite domain package code for selector functions
huffman
parents:
35445
diff
changeset
|
515 |
sel_rews = sel_thms }; |
35444 | 516 |
in |
517 |
(result, thy) |
|
518 |
end; |
|
519 |
||
520 |
end; |