src/Pure/logic.ML
changeset 32026 9898880061df
parent 32023 2d071ac5032f
child 32765 3032c0308019
equal deleted inserted replaced
32025:e8fbfa84c23f 32026:9898880061df
    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 *)