| author | haftmann | 
| Thu, 14 Jul 2011 00:21:56 +0200 | |
| changeset 43819 | 89082fd9e32d | 
| parent 43326 | 47cf4bc789aa | 
| child 44057 | fda143b5c2f5 | 
| permissions | -rw-r--r-- | 
| 11522 | 1 | (* Title: Pure/Proof/proofchecker.ML | 
| 11539 | 2 | Author: Stefan Berghofer, TU Muenchen | 
| 11522 | 3 | |
| 4 | Simple proof checker based only on the core inference rules | |
| 5 | of Isabelle/Pure. | |
| 6 | *) | |
| 7 | ||
| 8 | signature PROOF_CHECKER = | |
| 9 | sig | |
| 10 | val thm_of_proof : theory -> Proofterm.proof -> thm | |
| 11 | end; | |
| 12 | ||
| 11612 | 13 | structure ProofChecker : PROOF_CHECKER = | 
| 11522 | 14 | struct | 
| 15 | ||
| 16 | (***** construct a theorem out of a proof term *****) | |
| 17 | ||
| 18 | fun lookup_thm thy = | |
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
37310diff
changeset | 19 | let val tab = fold_rev Symtab.update (Global_Theory.all_thms_of thy) Symtab.empty | 
| 11522 | 20 | in | 
| 17412 | 21 | (fn s => case Symtab.lookup tab s of | 
| 15531 | 22 |        NONE => error ("Unknown theorem " ^ quote s)
 | 
| 23 | | SOME thm => thm) | |
| 11522 | 24 | end; | 
| 25 | ||
| 13733 | 26 | val beta_eta_convert = | 
| 22910 | 27 | Conv.fconv_rule Drule.beta_eta_conversion; | 
| 11522 | 28 | |
| 37229 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 29 | (* equality modulo renaming of type variables *) | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 30 | fun is_equal t t' = | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 31 | let | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 32 | val atoms = fold_types (fold_atyps (insert (op =))) t []; | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 33 | val atoms' = fold_types (fold_atyps (insert (op =))) t' [] | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 34 | in | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 35 | length atoms = length atoms' andalso | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 36 | map_types (map_atyps (the o AList.lookup (op =) (atoms ~~ atoms'))) t aconv t' | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 37 | end; | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 38 | |
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 39 | fun pretty_prf thy vs Hs prf = | 
| 37310 | 40 | let val prf' = prf |> Proofterm.prf_subst_bounds (map Free vs) |> | 
| 41 | Proofterm.prf_subst_pbounds (map (Hyp o prop_of) Hs) | |
| 37229 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 42 | in | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 43 | (Proof_Syntax.pretty_proof (Syntax.init_pretty_global thy) prf', | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 44 | Syntax.pretty_term_global thy (Reconstruct.prop_of prf')) | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 45 | end; | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 46 | |
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 47 | fun pretty_term thy vs _ t = | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 48 | let val t' = subst_bounds (map Free vs, t) | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 49 | in | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 50 | (Syntax.pretty_term_global thy t', | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 51 | Syntax.pretty_typ_global thy (fastype_of t')) | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 52 | end; | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 53 | |
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 54 | fun appl_error thy prt vs Hs s f a = | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 55 | let | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 56 | val (pp_f, pp_fT) = pretty_prf thy vs Hs f; | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 57 | val (pp_a, pp_aT) = prt thy vs Hs a | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 58 | in | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 59 | error (cat_lines | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 60 | [s, | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 61 | "", | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 62 | Pretty.string_of (Pretty.block | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 63 | [Pretty.str "Operator:", Pretty.brk 2, pp_f, | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 64 | Pretty.str " ::", Pretty.brk 1, pp_fT]), | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 65 | Pretty.string_of (Pretty.block | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 66 | [Pretty.str "Operand:", Pretty.brk 3, pp_a, | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 67 | Pretty.str " ::", Pretty.brk 1, pp_aT]), | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 68 | ""]) | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 69 | end; | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 70 | |
| 11522 | 71 | fun thm_of_proof thy prf = | 
| 72 | let | |
| 29277 | 73 | val prf_names = Proofterm.fold_proof_terms Term.declare_term_frees (K I) prf Name.context; | 
| 11522 | 74 | val lookup = lookup_thm thy; | 
| 75 | ||
| 13670 | 76 | fun thm_of_atom thm Ts = | 
| 77 | let | |
| 36042 
85efdadee8ae
switched PThm/PAxm etc. to use canonical order of type variables (term variables unchanged)
 krauss parents: 
35985diff
changeset | 78 | val tvars = Term.add_tvars (Thm.full_prop_of thm) [] |> rev; | 
| 35845 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
30146diff
changeset | 79 | val (fmap, thm') = Thm.varifyT_global' [] thm; | 
| 20151 | 80 | val ctye = map (pairself (Thm.ctyp_of thy)) | 
| 15798 
016f3be5a5ec
Adapted to new interface of instantiation and unification / matching functions.
 berghofe parents: 
15574diff
changeset | 81 | (map TVar tvars @ map (fn ((_, S), ixn) => TVar (ixn, S)) fmap ~~ Ts) | 
| 13670 | 82 | in | 
| 35985 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35845diff
changeset | 83 | Thm.instantiate (ctye, []) (forall_intr_vars (Thm.forall_intr_frees thm')) | 
| 13670 | 84 | end; | 
| 85 | ||
| 28808 | 86 | fun thm_of _ _ (PThm (_, ((name, prop', SOME Ts), _))) = | 
| 11522 | 87 | let | 
| 37229 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 88 | val thm = Thm.unconstrainT (Drule.implies_intr_hyps (lookup name)); | 
| 11522 | 89 |             val {prop, ...} = rep_thm thm;
 | 
| 37229 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 90 | val _ = if is_equal prop prop' then () else | 
| 12238 | 91 |               error ("Duplicate use of theorem name " ^ quote name ^ "\n" ^
 | 
| 26939 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
22910diff
changeset | 92 | Syntax.string_of_term_global thy prop ^ "\n\n" ^ | 
| 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 wenzelm parents: 
22910diff
changeset | 93 | Syntax.string_of_term_global thy prop'); | 
| 13670 | 94 | in thm_of_atom thm Ts end | 
| 11522 | 95 | |
| 15531 | 96 | | thm_of _ _ (PAxm (name, _, SOME Ts)) = | 
| 28674 | 97 | thm_of_atom (Thm.axiom thy name) Ts | 
| 11522 | 98 | |
| 30146 | 99 | | thm_of _ Hs (PBound i) = nth Hs i | 
| 11522 | 100 | |
| 20164 | 101 | | thm_of (vs, names) Hs (Abst (s, SOME T, prf)) = | 
| 11522 | 102 | let | 
| 43326 
47cf4bc789aa
simplified Name.variant -- discontinued builtin fold_map;
 wenzelm parents: 
39557diff
changeset | 103 | val (x, names') = Name.variant s names; | 
| 20164 | 104 | val thm = thm_of ((x, T) :: vs, names') Hs prf | 
| 11522 | 105 | in | 
| 20151 | 106 | Thm.forall_intr (Thm.cterm_of thy (Free (x, T))) thm | 
| 11522 | 107 | end | 
| 108 | ||
| 20164 | 109 | | thm_of (vs, names) Hs (prf % SOME t) = | 
| 11522 | 110 | let | 
| 20164 | 111 | val thm = thm_of (vs, names) Hs prf; | 
| 112 | val ct = Thm.cterm_of thy (Term.subst_bounds (map Free vs, t)); | |
| 37229 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 113 | in | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 114 | Thm.forall_elim ct thm | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 115 | handle THM (s, _, _) => appl_error thy pretty_term vs Hs s prf t | 
| 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 116 | end | 
| 11522 | 117 | |
| 20164 | 118 | | thm_of (vs, names) Hs (AbsP (s, SOME t, prf)) = | 
| 11522 | 119 | let | 
| 20151 | 120 | val ct = Thm.cterm_of thy (Term.subst_bounds (map Free vs, t)); | 
| 20164 | 121 | val thm = thm_of (vs, names) (Thm.assume ct :: Hs) prf; | 
| 11522 | 122 | in | 
| 123 | Thm.implies_intr ct thm | |
| 124 | end | |
| 125 | ||
| 20164 | 126 | | thm_of vars Hs (prf %% prf') = | 
| 20151 | 127 | let | 
| 20164 | 128 | val thm = beta_eta_convert (thm_of vars Hs prf); | 
| 129 | val thm' = beta_eta_convert (thm_of vars Hs prf'); | |
| 11522 | 130 | in | 
| 131 | Thm.implies_elim thm thm' | |
| 37229 
47eb565796f4
- Equality check on propositions after lookup of theorem now takes type variable
 berghofe parents: 
36042diff
changeset | 132 | handle THM (s, _, _) => appl_error thy pretty_prf (fst vars) Hs s prf prf' | 
| 11522 | 133 | end | 
| 134 | ||
| 20151 | 135 | | thm_of _ _ (Hyp t) = Thm.assume (Thm.cterm_of thy t) | 
| 11522 | 136 | |
| 137 | | thm_of _ _ _ = error "thm_of_proof: partial proof term"; | |
| 138 | ||
| 20164 | 139 | in beta_eta_convert (thm_of ([], prf_names) [] prf) end; | 
| 11522 | 140 | |
| 141 | end; |