24 val term_of : cterm -> term |
24 val term_of : cterm -> term |
25 val cterm_of : Sign.sg -> term -> cterm |
25 val cterm_of : Sign.sg -> term -> cterm |
26 val read_cterm : Sign.sg -> string * typ -> cterm |
26 val read_cterm : Sign.sg -> string * typ -> cterm |
27 val read_cterms : Sign.sg -> string list * typ list -> cterm list |
27 val read_cterms : Sign.sg -> string list * typ list -> cterm list |
28 val cterm_fun : (term -> term) -> (cterm -> cterm) |
28 val cterm_fun : (term -> term) -> (cterm -> cterm) |
29 val dest_cimplies : cterm -> cterm * cterm |
|
30 val dest_comb : cterm -> cterm * cterm |
29 val dest_comb : cterm -> cterm * cterm |
31 val dest_abs : cterm -> cterm * cterm |
30 val dest_abs : cterm -> cterm * cterm |
|
31 val adjust_maxidx : cterm -> cterm |
32 val capply : cterm -> cterm -> cterm |
32 val capply : cterm -> cterm -> cterm |
33 val cabs : cterm -> cterm -> cterm |
33 val cabs : cterm -> cterm -> cterm |
34 val read_def_cterm : |
34 val read_def_cterm : |
35 Sign.sg * (indexname -> typ option) * (indexname -> sort option) -> |
35 Sign.sg * (indexname -> typ option) * (indexname -> sort option) -> |
36 string list -> bool -> string * typ -> cterm * (indexname * typ) list |
36 string list -> bool -> string * typ -> cterm * (indexname * typ) list |
193 end; |
193 end; |
194 |
194 |
195 fun cterm_fun f (Cterm {sign, t, ...}) = cterm_of sign (f t); |
195 fun cterm_fun f (Cterm {sign, t, ...}) = cterm_of sign (f t); |
196 |
196 |
197 |
197 |
198 (*dest_implies for cterms. Note T=prop below*) |
|
199 fun dest_cimplies (Cterm{sign, T, maxidx, t=Const("==>", _) $ A $ B}) = |
|
200 (Cterm{sign=sign, T=T, maxidx=maxidx, t=A}, |
|
201 Cterm{sign=sign, T=T, maxidx=maxidx, t=B}) |
|
202 | dest_cimplies ct = raise TERM ("dest_cimplies", [term_of ct]); |
|
203 |
|
204 exception CTERM of string; |
198 exception CTERM of string; |
205 |
199 |
206 (*Destruct application in cterms*) |
200 (*Destruct application in cterms*) |
207 fun dest_comb (Cterm{sign, T, maxidx, t = A $ B}) = |
201 fun dest_comb (Cterm{sign, T, maxidx, t = A $ B}) = |
208 let val typeA = fastype_of A; |
202 let val typeA = fastype_of A; |
220 let val (y,N) = variant_abs (x,ty,M) |
214 let val (y,N) = variant_abs (x,ty,M) |
221 in (Cterm {sign = sign, T = ty, maxidx = 0, t = Free(y,ty)}, |
215 in (Cterm {sign = sign, T = ty, maxidx = 0, t = Free(y,ty)}, |
222 Cterm {sign = sign, T = S, maxidx = maxidx, t = N}) |
216 Cterm {sign = sign, T = S, maxidx = maxidx, t = N}) |
223 end |
217 end |
224 | dest_abs _ = raise CTERM "dest_abs"; |
218 | dest_abs _ = raise CTERM "dest_abs"; |
|
219 |
|
220 fun adjust_maxidx (Cterm {sign, T, t, ...}) = |
|
221 Cterm {sign = sign, T = T, maxidx = maxidx_of_term t, t = t} |
225 |
222 |
226 (*Form cterm out of a function and an argument*) |
223 (*Form cterm out of a function and an argument*) |
227 fun capply (Cterm {t=f, sign=sign1, T=Type("fun",[dty,rty]), maxidx=maxidx1}) |
224 fun capply (Cterm {t=f, sign=sign1, T=Type("fun",[dty,rty]), maxidx=maxidx1}) |
228 (Cterm {t=x, sign=sign2, T, maxidx=maxidx2}) = |
225 (Cterm {t=x, sign=sign2, T, maxidx=maxidx2}) = |
229 if T = dty then Cterm{t=f$x, sign=Sign.merge(sign1,sign2), T=rty, |
226 if T = dty then Cterm{t=f$x, sign=Sign.merge(sign1,sign2), T=rty, |