src/Pure/term.ML
changeset 20160 550e36c6a2d1
parent 20148 8a5fa86994c7
child 20199 3170fea83ae7
equal deleted inserted replaced
20159:93a561cf000c 20160:550e36c6a2d1
   144   val add_term_vars: term * term list -> term list
   144   val add_term_vars: term * term list -> term list
   145   val term_vars: term -> term list
   145   val term_vars: term -> term list
   146   val add_term_frees: term * term list -> term list
   146   val add_term_frees: term * term list -> term list
   147   val term_frees: term -> term list
   147   val term_frees: term -> term list
   148   val variant_abs: string * typ * term -> string * term
   148   val variant_abs: string * typ * term -> string * term
   149   val rename_wrt_term: term -> (string * typ) list -> (string * typ) list
   149   val rename_wrt_term: term -> (string * 'a) list -> (string * 'a) list
   150   val show_question_marks: bool ref
   150   val show_question_marks: bool ref
   151 end;
   151 end;
   152 
   152 
   153 signature TERM =
   153 signature TERM =
   154 sig
   154 sig
   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 declare_term_names: term -> Name.context -> Name.context
   196   val dest_abs: string * typ * term -> string * term
   196   val dest_abs: string * typ * term -> string * term
       
   197   val variant_frees: term -> (string * 'a) list -> (string * 'a) list
   197   val zero_var_indexesT: typ -> typ
   198   val zero_var_indexesT: typ -> typ
   198   val zero_var_indexes: term -> term
   199   val zero_var_indexes: term -> term
   199   val zero_var_indexes_inst: term ->
   200   val zero_var_indexes_inst: term ->
   200     ((indexname * sort) * typ) list * ((indexname * typ) * term) list
   201     ((indexname * sort) * typ) list * ((indexname * typ) * term) list
   201   val dummy_patternN: string
   202   val dummy_patternN: string
  1159   | add_term_names (Free(a,_), bs) = a ins_string bs
  1160   | add_term_names (Free(a,_), bs) = a ins_string bs
  1160   | add_term_names (f$u, bs) = add_term_names (f, add_term_names(u, bs))
  1161   | add_term_names (f$u, bs) = add_term_names (f, add_term_names(u, bs))
  1161   | add_term_names (Abs(_,_,t), bs) = add_term_names(t,bs)
  1162   | add_term_names (Abs(_,_,t), bs) = add_term_names(t,bs)
  1162   | add_term_names (_, bs) = bs;
  1163   | add_term_names (_, bs) = bs;
  1163 
  1164 
  1164 fun declare_term_names (Const (a, _)) = Name.declare (NameSpace.base a)
  1165 val declare_term_names = fold_aterms
  1165   | declare_term_names (Free (a, _)) = Name.declare a
  1166   (fn Const (a, _) => Name.declare (NameSpace.base a)     (*expensive*)
  1166   | declare_term_names (t $ u) = declare_term_names t #> declare_term_names u
  1167     | Free (a, _) => Name.declare a
  1167   | declare_term_names (Abs (_, _, t)) = declare_term_names t
  1168     | _ => I);
  1168   | declare_term_names _ = I;
       
  1169 
  1169 
  1170 (*Accumulates the TVars in a type, suppressing duplicates. *)
  1170 (*Accumulates the TVars in a type, suppressing duplicates. *)
  1171 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
  1172   | add_typ_tvars(TFree(_),vs) = vs
  1172   | add_typ_tvars(TFree(_),vs) = vs
  1173   | add_typ_tvars(TVar(v),vs) = insert (op =) v vs;
  1173   | add_typ_tvars(TVar(v),vs) = insert (op =) v vs;
  1253     if name_clash body then
  1253     if name_clash body then
  1254       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*)
  1255     else (x, subst_bound (Free (x, T), body))
  1255     else (x, subst_bound (Free (x, T), body))
  1256   end;
  1256   end;
  1257 
  1257 
  1258 (* renames and reverses the strings in vars away from names *)
  1258 
  1259 fun rename_aTs names vars =
  1259 (* renaming variables *)
  1260   rev (fst (Name.variants (map fst vars) names) ~~ map snd vars);
  1260 
  1261 
  1261 fun variant_frees t frees =
  1262 fun rename_wrt_term t = rename_aTs (declare_term_names t Name.context);
  1262   fst (Name.variants (map fst frees) (declare_term_names t Name.context)) ~~ map snd frees;
       
  1263 
       
  1264 fun rename_wrt_term t frees = rev (variant_frees t frees);  (*reversed result!*)
  1263 
  1265 
  1264 
  1266 
  1265 (* zero var indexes *)
  1267 (* zero var indexes *)
  1266 
  1268 
  1267 fun zero_var_inst vars =
  1269 fun zero_var_inst vars =