613 |
613 |
614 |
614 |
615 (*Left-to-right replacements: tpairs = [...,(vi,ti),...]. |
615 (*Left-to-right replacements: tpairs = [...,(vi,ti),...]. |
616 Instantiates distinct Vars by terms, inferring type instantiations. *) |
616 Instantiates distinct Vars by terms, inferring type instantiations. *) |
617 local |
617 local |
618 fun add_types ((ct,cu), (sign,tye)) = |
618 fun add_types ((ct,cu), (sign,tye,maxidx)) = |
619 let val {sign=signt, t=t, T= T, ...} = rep_cterm ct |
619 let val {sign=signt, t=t, T= T, maxidx=maxidxt,...} = rep_cterm ct |
620 and {sign=signu, t=u, T= U, ...} = rep_cterm cu |
620 and {sign=signu, t=u, T= U, maxidx=maxidxu,...} = rep_cterm cu; |
|
621 val maxi = max[maxidx,maxidxt,maxidxu]; |
621 val sign' = Sign.merge(sign, Sign.merge(signt, signu)) |
622 val sign' = Sign.merge(sign, Sign.merge(signt, signu)) |
622 val tye' = Type.unify (#tsig(Sign.rep_sg sign')) ((T,U), tye) |
623 val (tye',maxi') = Type.unify (#tsig(Sign.rep_sg sign')) maxi tye (T,U) |
623 handle Type.TUNIFY => raise TYPE("add_types", [T,U], [t,u]) |
624 handle Type.TUNIFY => raise TYPE("add_types", [T,U], [t,u]) |
624 in (sign', tye') end; |
625 in (sign', tye', maxi') end; |
625 in |
626 in |
626 fun cterm_instantiate ctpairs0 th = |
627 fun cterm_instantiate ctpairs0 th = |
627 let val (sign,tye) = foldr add_types (ctpairs0, (#sign(rep_thm th),[])) |
628 let val (sign,tye,_) = foldr add_types (ctpairs0, (#sign(rep_thm th),[],0)) |
628 val tsig = #tsig(Sign.rep_sg sign); |
629 val tsig = #tsig(Sign.rep_sg sign); |
629 fun instT(ct,cu) = let val inst = subst_TVars tye |
630 fun instT(ct,cu) = let val inst = subst_TVars tye |
630 in (cterm_fun inst ct, cterm_fun inst cu) end |
631 in (cterm_fun inst ct, cterm_fun inst cu) end |
631 fun ctyp2 (ix,T) = (ix, ctyp_of sign T) |
632 fun ctyp2 (ix,T) = (ix, ctyp_of sign T) |
632 in instantiate (map ctyp2 tye, map instT ctpairs0) th end |
633 in instantiate (map ctyp2 tye, map instT ctpairs0) th end |