src/Pure/term.ML
changeset 20148 8a5fa86994c7
parent 20129 95e84d2c9f2c
child 20160 550e36c6a2d1
equal deleted inserted replaced
20147:7aa076a45cb4 20148:8a5fa86994c7
   190     -> term -> term option
   190     -> term -> term option
   191   val instantiateT_option: ((indexname * sort) * typ) list -> typ -> typ option
   191   val instantiateT_option: ((indexname * sort) * typ) list -> typ -> typ option
   192   val maxidx_typ: typ -> int -> int
   192   val maxidx_typ: typ -> int -> int
   193   val maxidx_typs: typ list -> int -> int
   193   val maxidx_typs: typ list -> int -> int
   194   val maxidx_term: term -> int -> int
   194   val maxidx_term: term -> int -> int
       
   195   val declare_term_names: term -> Name.context -> Name.context
   195   val dest_abs: string * typ * term -> string * term
   196   val dest_abs: string * typ * term -> string * term
   196   val zero_var_indexesT: typ -> typ
   197   val zero_var_indexesT: typ -> typ
   197   val zero_var_indexes: term -> term
   198   val zero_var_indexes: term -> term
   198   val zero_var_indexes_inst: term ->
   199   val zero_var_indexes_inst: term ->
   199     ((indexname * sort) * typ) list * ((indexname * typ) * term) list
   200     ((indexname * sort) * typ) list * ((indexname * typ) * term) list
  1158   | add_term_names (Free(a,_), bs) = a ins_string bs
  1159   | add_term_names (Free(a,_), bs) = a ins_string bs
  1159   | add_term_names (f$u, bs) = add_term_names (f, add_term_names(u, bs))
  1160   | add_term_names (f$u, bs) = add_term_names (f, add_term_names(u, bs))
  1160   | add_term_names (Abs(_,_,t), bs) = add_term_names(t,bs)
  1161   | add_term_names (Abs(_,_,t), bs) = add_term_names(t,bs)
  1161   | add_term_names (_, bs) = bs;
  1162   | add_term_names (_, bs) = bs;
  1162 
  1163 
       
  1164 fun declare_term_names (Const (a, _)) = Name.declare (NameSpace.base a)
       
  1165   | declare_term_names (Free (a, _)) = Name.declare a
       
  1166   | declare_term_names (t $ u) = declare_term_names t #> declare_term_names u
       
  1167   | declare_term_names (Abs (_, _, t)) = declare_term_names t
       
  1168   | declare_term_names _ = I;
       
  1169 
  1163 (*Accumulates the TVars in a type, suppressing duplicates. *)
  1170 (*Accumulates the TVars in a type, suppressing duplicates. *)
  1164 fun add_typ_tvars(Type(_,Ts),vs) = foldr add_typ_tvars vs Ts
  1171 fun add_typ_tvars(Type(_,Ts),vs) = foldr add_typ_tvars vs Ts
  1165   | add_typ_tvars(TFree(_),vs) = vs
  1172   | add_typ_tvars(TFree(_),vs) = vs
  1166   | add_typ_tvars(TVar(v),vs) = insert (op =) v vs;
  1173   | add_typ_tvars(TVar(v),vs) = insert (op =) v vs;
  1167 
  1174 
  1230 
  1237 
  1231 fun term_frees t = add_term_frees(t,[]);
  1238 fun term_frees t = add_term_frees(t,[]);
  1232 
  1239 
  1233 (*Given an abstraction over P, replaces the bound variable by a Free variable
  1240 (*Given an abstraction over P, replaces the bound variable by a Free variable
  1234   having a unique name -- SLOW!*)
  1241   having a unique name -- SLOW!*)
  1235 fun variant_abs (a,T,P) =
  1242 fun variant_abs (x, T, b) =
  1236   let val b = Name.variant (add_term_names(P,[])) a
  1243   let val ([x'], _) = Name.variants [x] (declare_term_names b Name.context)
  1237   in  (b,  subst_bound (Free(b,T), P))  end;
  1244   in (x', subst_bound (Free (x', T), b))  end;
  1238 
  1245 
  1239 fun dest_abs (x, T, body) =
  1246 fun dest_abs (x, T, body) =
  1240   let
  1247   let
  1241     fun name_clash (Free (y, _)) = (x = y)
  1248     fun name_clash (Free (y, _)) = (x = y)
  1242       | name_clash (t $ u) = name_clash t orelse name_clash u
  1249       | name_clash (t $ u) = name_clash t orelse name_clash u
  1247       dest_abs (Name.variant [x] x, T, body)    (*potentially slow, but rarely happens*)
  1254       dest_abs (Name.variant [x] x, T, body)    (*potentially slow, but rarely happens*)
  1248     else (x, subst_bound (Free (x, T), body))
  1255     else (x, subst_bound (Free (x, T), body))
  1249   end;
  1256   end;
  1250 
  1257 
  1251 (* renames and reverses the strings in vars away from names *)
  1258 (* renames and reverses the strings in vars away from names *)
  1252 fun rename_aTs names vars : (string*typ)list =
  1259 fun rename_aTs names vars =
  1253   let fun rename_aT (vars,(a,T)) =
  1260   rev (fst (Name.variants (map fst vars) names) ~~ map snd vars);
  1254                 (Name.variant (map #1 vars @ names) a, T) :: vars
  1261 
  1255   in Library.foldl rename_aT ([],vars) end;
  1262 fun rename_wrt_term t = rename_aTs (declare_term_names t Name.context);
  1256 
       
  1257 fun rename_wrt_term t = rename_aTs (add_term_names(t,[]));
       
  1258 
  1263 
  1259 
  1264 
  1260 (* zero var indexes *)
  1265 (* zero var indexes *)
  1261 
  1266 
  1262 fun zero_var_inst vars =
  1267 fun zero_var_inst vars =