230 fun unify ((x, T), (y, U)) (tyenv, max) = Sign.typ_unify thy (T, U) (tyenv, max) |
230 fun unify ((x, T), (y, U)) (tyenv, max) = Sign.typ_unify thy (T, U) (tyenv, max) |
231 handle Type.TUNIFY => |
231 handle Type.TUNIFY => |
232 err ("Failed to unify variable " ^ |
232 err ("Failed to unify variable " ^ |
233 string_of_term (Free (x, Envir.norm_type tyenv T)) ^ " against parameter " ^ |
233 string_of_term (Free (x, Envir.norm_type tyenv T)) ^ " against parameter " ^ |
234 string_of_term (Syntax.mark_boundT (y, Envir.norm_type tyenv U)) ^ " in") rule; |
234 string_of_term (Syntax.mark_boundT (y, Envir.norm_type tyenv U)) ^ " in") rule; |
235 val (tyenv, _) = fold unify (map #1 vars ~~ Library.take (m, params)) |
235 val (tyenv, _) = fold unify (map #1 vars ~~ (uncurry take) (m, params)) |
236 (Vartab.empty, Int.max (maxidx, Thm.maxidx_of rule)); |
236 (Vartab.empty, Int.max (maxidx, Thm.maxidx_of rule)); |
237 val norm_type = Envir.norm_type tyenv; |
237 val norm_type = Envir.norm_type tyenv; |
238 |
238 |
239 val xs = map (apsnd norm_type o fst) vars; |
239 val xs = map (apsnd norm_type o fst) vars; |
240 val ys = map (apsnd norm_type) (Library.drop (m, params)); |
240 val ys = map (apsnd norm_type) ((uncurry drop) (m, params)); |
241 val ys' = map Name.internal (Name.variant_list (map fst xs) (map fst ys)) ~~ map #2 ys; |
241 val ys' = map Name.internal (Name.variant_list (map fst xs) (map fst ys)) ~~ map #2 ys; |
242 val terms = map (Drule.mk_term o cert o Free) (xs @ ys'); |
242 val terms = map (Drule.mk_term o cert o Free) (xs @ ys'); |
243 |
243 |
244 val instT = |
244 val instT = |
245 fold (Term.add_tvarsT o #2) params [] |
245 fold (Term.add_tvarsT o #2) params [] |