src/Pure/thm.ML
changeset 16711 2c1f9640b744
parent 16679 abd1461fa288
child 16725 597830f91930
equal deleted inserted replaced
16710:3d6335ff3982 16711:2c1f9640b744
   350 
   350 
   351 fun terms_of_tpairs tpairs = fold_rev (fn (t, u) => cons t o cons u) tpairs [];
   351 fun terms_of_tpairs tpairs = fold_rev (fn (t, u) => cons t o cons u) tpairs [];
   352 
   352 
   353 fun eq_tpairs ((t, u), (t', u')) = t aconv t' andalso u aconv u';
   353 fun eq_tpairs ((t, u), (t', u')) = t aconv t' andalso u aconv u';
   354 val union_tpairs = gen_merge_lists eq_tpairs;
   354 val union_tpairs = gen_merge_lists eq_tpairs;
       
   355 val maxidx_tpairs = fold (fn (t, u) => Term.maxidx_term t o Term.maxidx_term u);
   355 
   356 
   356 fun attach_tpairs tpairs prop =
   357 fun attach_tpairs tpairs prop =
   357   Logic.list_implies (map Logic.mk_equals tpairs, prop);
   358   Logic.list_implies (map Logic.mk_equals tpairs, prop);
   358 
   359 
   359 fun rep_thm (Thm {thy_ref, der, maxidx, shyps, hyps, tpairs, prop}) =
   360 fun rep_thm (Thm {thy_ref, der, maxidx, shyps, hyps, tpairs, prop}) =
   895             |> List.filter (not o op aconv);
   896             |> List.filter (not o op aconv);
   896           val prop' = Envir.norm_term env prop;
   897           val prop' = Envir.norm_term env prop;
   897         in
   898         in
   898           Thm {thy_ref = thy_ref,
   899           Thm {thy_ref = thy_ref,
   899             der = Pt.infer_derivs' (Pt.norm_proof' env) der,
   900             der = Pt.infer_derivs' (Pt.norm_proof' env) der,
   900             maxidx = maxidx_of_terms (prop' :: terms_of_tpairs tpairs'),
   901             maxidx = maxidx_tpairs tpairs' (maxidx_of_term prop'),
   901             shyps = may_insert_env_sorts (Theory.deref thy_ref) env shyps,
   902             shyps = may_insert_env_sorts (Theory.deref thy_ref) env shyps,
   902             hyps = hyps,
   903             hyps = hyps,
   903             tpairs = tpairs',
   904             tpairs = tpairs',
   904             prop = prop'}
   905             prop = prop'}
   905         end);
   906         end);
   965         else if not (null (gen_duplicates eq_fst vTs)) then
   966         else if not (null (gen_duplicates eq_fst vTs)) then
   966           raise THM ("instantiate: type variables not distinct", 0, [th])
   967           raise THM ("instantiate: type variables not distinct", 0, [th])
   967         else
   968         else
   968           Thm {thy_ref = Theory.self_ref thy',
   969           Thm {thy_ref = Theory.self_ref thy',
   969             der = Pt.infer_derivs' (Pt.instantiate vTs tpairs) der,
   970             der = Pt.infer_derivs' (Pt.instantiate vTs tpairs) der,
   970             maxidx = maxidx_of_terms (prop' :: terms_of_tpairs dpairs'),
   971             maxidx = maxidx_tpairs dpairs' (maxidx_of_term prop'),
   971             shyps = shyps',
   972             shyps = shyps',
   972             hyps = hyps,
   973             hyps = hyps,
   973             tpairs = dpairs',
   974             tpairs = dpairs',
   974             prop = prop'}
   975             prop = prop'}
   975       end
   976       end