src/Pure/drule.ML
changeset 1435 aefcd255ed4a
parent 1412 2ab32768c996
child 1439 1f5949a43e82
equal deleted inserted replaced
1434:834da5152421 1435:aefcd255ed4a
   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