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, []); |