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 = |