src/Pure/term_subst.ML
changeset 21607 3698319f6503
parent 21315 be2669fe8363
child 29269 5c25a2012975
equal deleted inserted replaced
21606:dc75da2cb7d1 21607:3698319f6503
    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;