equal
deleted
inserted
replaced
20 val instantiateT: ((indexname * sort) * typ) list -> typ -> typ |
20 val instantiateT: ((indexname * sort) * typ) list -> typ -> typ |
21 val instantiate_option: ((indexname * sort) * typ) list * ((indexname * typ) * term) list -> |
21 val instantiate_option: ((indexname * sort) * typ) list * ((indexname * typ) * term) list -> |
22 term -> term option |
22 term -> term option |
23 val instantiateT_option: ((indexname * sort) * typ) list -> typ -> typ option |
23 val instantiateT_option: ((indexname * sort) * typ) list -> typ -> typ option |
24 val zero_var_indexes: term -> term |
24 val zero_var_indexes: term -> term |
25 val zero_var_indexes_inst: term -> |
25 val zero_var_indexes_inst: term list -> |
26 ((indexname * sort) * typ) list * ((indexname * typ) * term) list |
26 ((indexname * sort) * typ) list * ((indexname * typ) * term) list |
27 end; |
27 end; |
28 |
28 |
29 structure TermSubst: TERM_SUBST = |
29 structure TermSubst: TERM_SUBST = |
30 struct |
30 struct |
159 let |
159 let |
160 val ([x'], used') = Name.variants [if Name.is_bound x then "u" else x] used; |
160 val ([x'], used') = Name.variants [if Name.is_bound x then "u" else x] used; |
161 in if x = x' andalso i = 0 then (inst, used') else ((v, ((x', 0), X)) :: inst, used') end) |
161 in if x = x' andalso i = 0 then (inst, used') else ((v, ((x', 0), X)) :: inst, used') end) |
162 vars ([], Name.context) |> #1; |
162 vars ([], Name.context) |> #1; |
163 |
163 |
164 fun zero_var_indexes_inst tm = |
164 fun zero_var_indexes_inst ts = |
165 let |
165 let |
166 val instT = zero_var_inst (sort Term.tvar_ord (Term.add_tvars tm [])) |> map (apsnd TVar); |
166 val tvars = sort Term.tvar_ord (fold Term.add_tvars ts []); |
167 val inst = |
167 val instT = map (apsnd TVar) (zero_var_inst tvars); |
168 zero_var_inst (sort Term.var_ord (map (apsnd (instantiateT instT)) (Term.add_vars tm []))) |
168 val vars = sort Term.var_ord (map (apsnd (instantiateT instT)) (fold Term.add_vars ts [])); |
169 |> map (apsnd Var); |
169 val inst = map (apsnd Var) (zero_var_inst vars); |
170 in (instT, inst) end; |
170 in (instT, inst) end; |
171 |
171 |
172 fun zero_var_indexes tm = instantiate (zero_var_indexes_inst tm) tm; |
172 fun zero_var_indexes t = instantiate (zero_var_indexes_inst [t]) t; |
173 |
173 |
174 end; |
174 end; |