equal
deleted
inserted
replaced
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 |