src/Pure/variable.ML
changeset 71316 3fc2def62547
parent 70843 cc987440d776
child 71317 e58bc223f46c
equal deleted inserted replaced
71315:64ec254d901d 71316:3fc2def62547
   427           Name_Space.alias_table Name_Space.global_naming (Binding.make (x, pos)) x')
   427           Name_Space.alias_table Name_Space.global_naming (Binding.make (x, pos)) x')
   428       |> declare_fixed x
   428       |> declare_fixed x
   429       |> declare_constraints (Syntax.free x')
   429       |> declare_constraints (Syntax.free x')
   430   end;
   430   end;
   431 
   431 
   432 fun new_fixes names' xs xs' ps =
   432 fun new_fixes names' args =
   433   map_names (K names') #>
   433   map_names (K names') #>
   434   fold new_fixed ((xs ~~ xs') ~~ ps) #>
   434   fold new_fixed args #>
   435   pair xs';
   435   pair (map (#2 o #1) args);
   436 
   436 
   437 in
   437 in
   438 
   438 
   439 fun add_fixes_binding bs ctxt =
   439 fun add_fixes_binding bs ctxt =
   440   let
   440   let
   450     val xs = map check_name bs;
   450     val xs = map check_name bs;
   451     val names = names_of ctxt;
   451     val names = names_of ctxt;
   452     val (xs', names') =
   452     val (xs', names') =
   453       if is_body ctxt then fold_map Name.variant xs names |>> map Name.skolem
   453       if is_body ctxt then fold_map Name.variant xs names |>> map Name.skolem
   454       else (xs, fold Name.declare xs names);
   454       else (xs, fold Name.declare xs names);
   455   in ctxt |> new_fixes names' xs xs' (map Binding.pos_of bs) end;
   455   in ctxt |> new_fixes names' ((xs ~~ xs') ~~ map Binding.pos_of bs) end;
   456 
   456 
   457 fun bound_fixes xs ctxt =
   457 fun bound_fixes xs ctxt =
   458   let
   458   let
   459     val (xs', ctxt') = fold_map next_bound xs ctxt;
   459     val (xs', ctxt') = fold_map next_bound xs ctxt;
       
   460     val names' = names_of ctxt';
   460     val no_ps = replicate (length xs) Position.none;
   461     val no_ps = replicate (length xs) Position.none;
   461   in ctxt' |> new_fixes (names_of ctxt') (map #1 xs) (map (#1 o dest_Free) xs') no_ps end;
   462   in ctxt' |> new_fixes names' ((map #1 xs ~~ map (#1 o dest_Free) xs') ~~ no_ps) end;
   462 
   463 
   463 fun variant_fixes raw_xs ctxt =
   464 fun variant_fixes raw_xs ctxt =
   464   let
   465   let
   465     val names = names_of ctxt;
   466     val names = names_of ctxt;
   466     val xs = map (fn x => Name.clean x |> Name.is_internal x ? Name.internal) raw_xs;
   467     val xs = map (fn x => Name.clean x |> Name.is_internal x ? Name.internal) raw_xs;
   467     val (xs', names') = fold_map Name.variant xs names |>> (is_body ctxt ? map Name.skolem);
   468     val (xs', names') = fold_map Name.variant xs names |>> (is_body ctxt ? map Name.skolem);
   468     val no_ps = replicate (length xs) Position.none;
   469     val no_ps = replicate (length xs) Position.none;
   469   in ctxt |> new_fixes names' xs xs' no_ps end;
   470   in ctxt |> new_fixes names' ((xs ~~ xs') ~~ no_ps) end;
   470 
   471 
   471 end;
   472 end;
   472 
   473 
   473 val add_fixes = add_fixes_binding o map Binding.name;
   474 val add_fixes = add_fixes_binding o map Binding.name;
   474 
   475