54 val close_form: term -> term |
54 val close_form: term -> term |
55 val combound: term * int * int -> term |
55 val combound: term * int * int -> term |
56 val rlist_abs: (string * typ) list * term -> term |
56 val rlist_abs: (string * typ) list * term -> term |
57 val incr_tvar_same: int -> typ Same.operation |
57 val incr_tvar_same: int -> typ Same.operation |
58 val incr_tvar: int -> typ -> typ |
58 val incr_tvar: int -> typ -> typ |
|
59 val incr_indexes_same: typ list * int -> term Same.operation |
59 val incr_indexes: typ list * int -> term -> term |
60 val incr_indexes: typ list * int -> term -> term |
60 val lift_abs: int -> term -> term -> term |
61 val lift_abs: int -> term -> term -> term |
61 val lift_all: int -> term -> term -> term |
62 val lift_all: int -> term -> term -> term |
62 val strip_assums_hyp: term -> term list |
63 val strip_assums_hyp: term -> term list |
63 val strip_assums_concl: term -> term |
64 val strip_assums_concl: term -> term |
302 |
303 |
303 (* ([xn,...,x1], t) ======> (x1,...,xn)t *) |
304 (* ([xn,...,x1], t) ======> (x1,...,xn)t *) |
304 fun rlist_abs ([], body) = body |
305 fun rlist_abs ([], body) = body |
305 | rlist_abs ((a,T)::pairs, body) = rlist_abs(pairs, Abs(a, T, body)); |
306 | rlist_abs ((a,T)::pairs, body) = rlist_abs(pairs, Abs(a, T, body)); |
306 |
307 |
307 fun incr_tvar_same k = Term_Subst.map_atypsT_same |
308 fun incr_tvar_same 0 = Same.same |
308 (fn TVar ((a, i), S) => TVar ((a, i + k), S) |
309 | incr_tvar_same k = Term_Subst.map_atypsT_same |
309 | _ => raise Same.SAME); |
310 (fn TVar ((a, i), S) => TVar ((a, i + k), S) |
310 |
311 | _ => raise Same.SAME); |
311 fun incr_tvar 0 T = T |
312 |
312 | incr_tvar k T = incr_tvar_same k T handle Same.SAME => T; |
313 fun incr_tvar k T = incr_tvar_same k T handle Same.SAME => T; |
313 |
314 |
314 (*For all variables in the term, increment indexnames and lift over the Us |
315 (*For all variables in the term, increment indexnames and lift over the Us |
315 result is ?Gidx(B.(lev+n-1),...,B.lev) where lev is abstraction level *) |
316 result is ?Gidx(B.(lev+n-1),...,B.lev) where lev is abstraction level *) |
316 fun incr_indexes ([], 0) t = t |
317 fun incr_indexes_same ([], 0) = Same.same |
317 | incr_indexes (Ts, k) t = |
318 | incr_indexes_same (Ts, k) = |
318 let |
319 let |
319 val n = length Ts; |
320 val n = length Ts; |
320 val incrT = if k = 0 then I else incr_tvar_same k; |
321 val incrT = incr_tvar_same k; |
321 |
322 |
322 fun incr lev (Var ((x, i), T)) = |
323 fun incr lev (Var ((x, i), T)) = |
323 combound (Var ((x, i + k), Ts ---> Same.commit incrT T), lev, n) |
324 combound (Var ((x, i + k), Ts ---> Same.commit incrT T), lev, n) |
324 | incr lev (Abs (x, T, body)) = |
325 | incr lev (Abs (x, T, body)) = |
325 (Abs (x, incrT T, incr (lev + 1) body handle Same.SAME => body) |
326 (Abs (x, incrT T, incr (lev + 1) body handle Same.SAME => body) |
327 | incr lev (t $ u) = |
328 | incr lev (t $ u) = |
328 (incr lev t $ (incr lev u handle Same.SAME => u) |
329 (incr lev t $ (incr lev u handle Same.SAME => u) |
329 handle Same.SAME => t $ incr lev u) |
330 handle Same.SAME => t $ incr lev u) |
330 | incr _ (Const (c, T)) = Const (c, incrT T) |
331 | incr _ (Const (c, T)) = Const (c, incrT T) |
331 | incr _ (Free (x, T)) = Free (x, incrT T) |
332 | incr _ (Free (x, T)) = Free (x, incrT T) |
332 | incr _ (t as Bound _) = t; |
333 | incr _ (Bound _) = raise Same.SAME; |
333 in incr 0 t handle Same.SAME => t end; |
334 in incr 0 end; |
|
335 |
|
336 fun incr_indexes arg t = incr_indexes_same arg t handle Same.SAME => t; |
334 |
337 |
335 |
338 |
336 (* Lifting functions from subgoal and increment: |
339 (* Lifting functions from subgoal and increment: |
337 lift_abs operates on terms |
340 lift_abs operates on terms |
338 lift_all operates on propositions *) |
341 lift_all operates on propositions *) |