28 val read_cterms : Sign.sg -> string list * typ list -> cterm list |
28 val read_cterms : Sign.sg -> string list * typ list -> cterm list |
29 val cterm_fun : (term -> term) -> (cterm -> cterm) |
29 val cterm_fun : (term -> term) -> (cterm -> cterm) |
30 val dest_cimplies : cterm -> cterm * cterm |
30 val dest_cimplies : cterm -> cterm * cterm |
31 val dest_comb : cterm -> cterm * cterm |
31 val dest_comb : cterm -> cterm * cterm |
32 val dest_abs : cterm -> cterm * cterm |
32 val dest_abs : cterm -> cterm * cterm |
33 val mk_prop : cterm -> cterm |
33 val capply : 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 |
37 |
37 |
38 (*meta theorems*) |
38 (*meta theorems*) |
210 Cterm {sign=sign, maxidx=maxidx, t=B, T=typeB}) |
210 Cterm {sign=sign, maxidx=maxidx, t=B, T=typeB}) |
211 end |
211 end |
212 | dest_comb _ = raise CTERM "dest_comb"; |
212 | dest_comb _ = raise CTERM "dest_comb"; |
213 |
213 |
214 (*Destruct abstraction in cterms*) |
214 (*Destruct abstraction in cterms*) |
215 fun dest_abs (Cterm{sign, T, maxidx, t = tm as Abs(s,ty,M)}) = |
215 fun dest_abs (Cterm {sign, T as Type("fun",[_,S]), maxidx, t=Abs(x,ty,M)}) = |
216 let fun mk_var{Name,Ty} = Free(Name,Ty); |
216 let val (y,N) = variant_abs (x,ty,M) |
217 val v = mk_var{Name = s, Ty = ty}; |
217 in (Cterm {sign = sign, T = ty, maxidx = 0, t = Free(y,ty)}, |
218 val ty2 = |
218 Cterm {sign = sign, T = S, maxidx = maxidx, t = N}) |
219 case T of Type("fun",[_,S]) => S |
|
220 | _ => error "Function type expected in dest_abs"; |
|
221 in (Cterm{sign = sign, T = ty, maxidx = maxidx, t = v}, |
|
222 Cterm{sign = sign, T = ty2, maxidx = maxidx, t = betapply (tm,v)}) |
|
223 end |
219 end |
224 | dest_abs _ = raise CTERM "dest_abs"; |
220 | dest_abs _ = raise CTERM "dest_abs"; |
225 |
221 |
226 (*Convert cterm of type "o" to "prop" by using Trueprop*) |
222 (*Form cterm out of a function and an argument*) |
227 fun mk_prop (ct as Cterm{sign, T, maxidx, t = Const("Trueprop",_) $ _}) = ct |
223 fun capply (Cterm {t=f, sign=sign1, T=Type("fun",[dty,rty]), maxidx=maxidx1}) |
228 | mk_prop (Cterm{sign, T, maxidx, t}) = |
224 (Cterm {t=x, sign=sign2, T, maxidx=maxidx2}) = |
229 if T = Type("o",[]) then |
225 if T = dty then Cterm{t=f$x, sign=Sign.merge(sign1,sign2), T=rty, |
230 Cterm{sign = sign, T = Type("prop",[]), maxidx = maxidx, |
226 maxidx=max[maxidx1, maxidx2]} |
231 t = Const("Trueprop", Type("o",[]) --> Type("prop",[])) $ t} |
227 else raise CTERM "capply: types don't agree" |
232 else error "Type o expected in mk_prop"; |
228 | capply _ _ = raise CTERM "capply: first arg is not a function" |
233 |
229 |
234 |
230 |
235 (** read cterms **) (*exception ERROR*) |
231 (** read cterms **) (*exception ERROR*) |
236 |
232 |
237 (*read term, infer types, certify term*) |
233 (*read term, infer types, certify term*) |