519 let |
519 let |
520 val supclasses = map (prep_class thy) raw_supclasses; |
520 val supclasses = map (prep_class thy) raw_supclasses; |
521 val supsort = Sign.minimize_sort thy supclasses; |
521 val supsort = Sign.minimize_sort thy supclasses; |
522 val sups = filter (is_class thy) supsort; |
522 val sups = filter (is_class thy) supsort; |
523 val base_sort = if null sups then supsort else |
523 val base_sort = if null sups then supsort else |
524 (#base_sort o the_class_data thy o hd) sups; |
524 foldr1 (Sorts.inter_sort (Sign.classes_of thy)) |
|
525 (map (#base_sort o the_class_data thy) sups); |
525 val suplocales = map Locale.Locale sups; |
526 val suplocales = map Locale.Locale sups; |
526 val (raw_elems, includes) = fold_rev (fn Locale.Elem e => apfst (cons e) |
527 val (raw_elems, includes) = fold_rev (fn Locale.Elem e => apfst (cons e) |
527 | Locale.Expr i => apsnd (cons (prep_expr thy i))) raw_includes_elems ([], []); |
528 | Locale.Expr i => apsnd (cons (prep_expr thy i))) raw_includes_elems ([], []); |
528 val supexpr = Locale.Merge suplocales; |
529 val supexpr = Locale.Merge suplocales; |
529 val supparams = (map fst o Locale.parameters_of_expr thy) supexpr; |
530 val supparams = (map fst o Locale.parameters_of_expr thy) supexpr; |
530 val mergeexpr = Locale.Merge (suplocales @ includes); |
531 val mergeexpr = Locale.Merge (suplocales @ includes); |
531 val constrain = Element.Constrains ((map o apsnd o map_atyps) |
532 val constrain = Element.Constrains ((map o apsnd o map_atyps) |
532 (fn TFree (_, sort) => TFree (Name.aT, sort)) supparams); |
533 (K (TFree (Name.aT, base_sort))) supparams); |
533 fun fork_syn (Element.Fixes xs) = |
534 fun fork_syn (Element.Fixes xs) = |
534 fold_map (fn (c, ty, syn) => cons (c, syn) #> pair (c, ty, NoSyn)) xs |
535 fold_map (fn (c, ty, syn) => cons (c, syn) #> pair (c, ty, NoSyn)) xs |
535 #>> Element.Fixes |
536 #>> Element.Fixes |
536 | fork_syn x = pair x; |
537 | fork_syn x = pair x; |
537 fun fork_syntax elems = |
538 fun fork_syntax elems = |