src/Pure/Isar/obtain.ML
changeset 33955 fff6f11b1f09
parent 33389 bb3a5fa94a91
child 33957 e9afca2118d4
equal deleted inserted replaced
33954:1bc3b688548c 33955:fff6f11b1f09
   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 []