src/Pure/Isar/class.ML
changeset 26167 ccc9007a7164
parent 25999 f8bcd311d501
child 26238 c30bb8182da2
equal deleted inserted replaced
26166:dbeab703a28d 26167:ccc9007a7164
   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 =