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