src/Pure/Isar/class_declaration.ML
changeset 58319 9228350683d0
parent 58294 7f990b3d5189
child 58837 e84d900cd287
equal deleted inserted replaced
58318:f95754ca7082 58319:9228350683d0
   144     fun singleton_fixate _ ts = burrow_types singleton_fixateT ts;
   144     fun singleton_fixate _ ts = burrow_types singleton_fixateT ts;
   145     fun unify_params ctxt ts =
   145     fun unify_params ctxt ts =
   146       let
   146       let
   147         val param_Ts = (fold o fold_aterms)
   147         val param_Ts = (fold o fold_aterms)
   148           (fn Free (v, T) => if is_param v then fold_atyps (insert (op =)) T else I | _ => I) ts [];
   148           (fn Free (v, T) => if is_param v then fold_atyps (insert (op =)) T else I | _ => I) ts [];
   149         val param_Ts_subst = map_filter (try dest_TVar) param_Ts;
   149         val param_namesT = map_filter (try (fst o dest_TVar)) param_Ts;
   150         val param_T = if null param_Ts_subst then NONE
   150         val param_T = if null param_namesT then NONE
   151           else SOME (case get_first (try dest_TFree) param_Ts of
   151           else SOME (case get_first (try dest_TFree) param_Ts of
   152             SOME v_sort => TFree v_sort |
   152             SOME v_sort => TFree v_sort |
   153             NONE => TVar ((fst o hd) param_Ts_subst, fold (inter_sort o snd) param_Ts_subst []));
   153             NONE => TVar (hd param_namesT, proto_base_sort));
   154       in case param_T of
   154       in case param_T of
   155         NONE => ts |
   155         NONE => ts |
   156         SOME T => map (subst_TVars (map (rpair T o fst) param_Ts_subst)) ts
   156         SOME T => map (subst_TVars (map (rpair T) param_namesT)) ts
   157       end;
   157       end;
   158 
   158 
   159     (* preprocessing elements, retrieving base sort from type-checked elements *)
   159     (* preprocessing elements, retrieving base sort from type-checked elements *)
   160     val raw_supexpr =
   160     val raw_supexpr =
   161       (map (fn sup => (sup, (("", false), Expression.Positional []))) sups, []);
   161       (map (fn sup => (sup, (("", false), Expression.Positional []))) sups, []);