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 |