| author | huffman | 
| Sat, 13 Mar 2010 15:51:12 -0800 | |
| changeset 35775 | 9b7e2e17be69 | 
| parent 35262 | 9ea4445d2ccf | 
| child 35845 | e5980f0ad025 | 
| permissions | -rw-r--r-- | 
| 11522 | 1  | 
(* Title: Pure/Proof/proof_syntax.ML  | 
| 11539 | 2  | 
Author: Stefan Berghofer, TU Muenchen  | 
| 11522 | 3  | 
|
4  | 
Function for parsing and printing proof terms.  | 
|
5  | 
*)  | 
|
6  | 
||
7  | 
signature PROOF_SYNTAX =  | 
|
8  | 
sig  | 
|
| 17078 | 9  | 
val proofT: typ  | 
10  | 
val add_proof_syntax: theory -> theory  | 
|
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
11  | 
val proof_of_term: theory -> bool -> term -> Proofterm.proof  | 
| 17078 | 12  | 
val term_of_proof: Proofterm.proof -> term  | 
13  | 
val cterm_of_proof: theory -> Proofterm.proof -> cterm * (cterm -> Proofterm.proof)  | 
|
14  | 
val read_term: theory -> typ -> string -> term  | 
|
15  | 
val read_proof: theory -> bool -> string -> Proofterm.proof  | 
|
16  | 
val proof_syntax: Proofterm.proof -> theory -> theory  | 
|
17  | 
val proof_of: bool -> thm -> Proofterm.proof  | 
|
| 
27260
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
18  | 
val pretty_proof: Proof.context -> Proofterm.proof -> Pretty.T  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
19  | 
val pretty_proof_of: Proof.context -> bool -> thm -> Pretty.T  | 
| 11522 | 20  | 
end;  | 
21  | 
||
| 33388 | 22  | 
structure Proof_Syntax : PROOF_SYNTAX =  | 
| 11522 | 23  | 
struct  | 
24  | 
||
25  | 
open Proofterm;  | 
|
26  | 
||
27  | 
(**** add special syntax for embedding proof terms ****)  | 
|
28  | 
||
29  | 
val proofT = Type ("proof", []);
 | 
|
| 11614 | 30  | 
val paramT = Type ("param", []);
 | 
31  | 
val paramsT = Type ("params", []);
 | 
|
| 11522 | 32  | 
val idtT = Type ("idt", []);
 | 
| 24848 | 33  | 
val aT = TFree (Name.aT, []);  | 
| 11522 | 34  | 
|
35  | 
(** constants for theorems and axioms **)  | 
|
36  | 
||
| 
16425
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
37  | 
fun add_proof_atom_consts names thy =  | 
| 
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
38  | 
thy  | 
| 
30435
 
e62d6ecab6ad
explicit Binding.qualified_name -- prevents implicitly qualified bstring;
 
wenzelm 
parents: 
30364 
diff
changeset
 | 
39  | 
|> Sign.root_path  | 
| 
 
e62d6ecab6ad
explicit Binding.qualified_name -- prevents implicitly qualified bstring;
 
wenzelm 
parents: 
30364 
diff
changeset
 | 
40  | 
|> Sign.add_consts_i (map (fn name => (Binding.qualified_name name, proofT, NoSyn)) names);  | 
| 11522 | 41  | 
|
42  | 
(** constants for application and abstraction **)  | 
|
| 11614 | 43  | 
|
| 
16425
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
44  | 
fun add_proof_syntax thy =  | 
| 
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
45  | 
thy  | 
| 
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
46  | 
|> Theory.copy  | 
| 22796 | 47  | 
|> Sign.root_path  | 
48  | 
|> Sign.add_defsort_i []  | 
|
| 
30344
 
10a67c5ddddb
more uniform handling of binding in targets and derived elements;
 
wenzelm 
parents: 
29635 
diff
changeset
 | 
49  | 
|> Sign.add_types [(Binding.name "proof", 0, NoSyn)]  | 
| 35122 | 50  | 
|> fold (snd oo Sign.declare_const)  | 
51  | 
      [((Binding.name "Appt", [proofT, aT] ---> proofT), Mixfix ("(1_ %/ _)", [4, 5], 4)),
 | 
|
52  | 
       ((Binding.name "AppP", [proofT, proofT] ---> proofT), Mixfix ("(1_ %%/ _)", [4, 5], 4)),
 | 
|
53  | 
((Binding.name "Abst", (aT --> proofT) --> proofT), NoSyn),  | 
|
54  | 
((Binding.name "AbsP", [propT, proofT --> proofT] ---> proofT), NoSyn),  | 
|
55  | 
((Binding.name "Hyp", propT --> proofT), NoSyn),  | 
|
56  | 
((Binding.name "Oracle", propT --> proofT), NoSyn),  | 
|
57  | 
((Binding.name "OfClass", (Term.a_itselfT --> propT) --> proofT), NoSyn),  | 
|
58  | 
((Binding.name "MinProof", proofT), Delimfix "?")]  | 
|
| 
30344
 
10a67c5ddddb
more uniform handling of binding in targets and derived elements;
 
wenzelm 
parents: 
29635 
diff
changeset
 | 
59  | 
|> Sign.add_nonterminals [Binding.name "param", Binding.name "params"]  | 
| 22796 | 60  | 
|> Sign.add_syntax_i  | 
| 11640 | 61  | 
      [("_Lam", [paramsT, proofT] ---> proofT, Mixfix ("(1Lam _./ _)", [0, 3], 3)),
 | 
| 11614 | 62  | 
       ("_Lam0", [paramT, paramsT] ---> paramsT, Mixfix ("_/ _", [1, 0], 0)),
 | 
63  | 
       ("_Lam0", [idtT, paramsT] ---> paramsT, Mixfix ("_/ _", [1, 0], 0)),
 | 
|
64  | 
       ("_Lam1", [idtT, propT] ---> paramT, Mixfix ("_: _", [0, 0], 0)),
 | 
|
65  | 
       ("", paramT --> paramT, Delimfix "'(_')"),
 | 
|
66  | 
       ("", idtT --> paramsT, Delimfix "_"),
 | 
|
67  | 
       ("", paramT --> paramsT, Delimfix "_")]
 | 
|
| 35122 | 68  | 
|> Sign.add_modesyntax_i (Symbol.xsymbolsN, true)  | 
| 11640 | 69  | 
      [("_Lam", [paramsT, proofT] ---> proofT, Mixfix ("(1\\<Lambda>_./ _)", [0, 3], 3)),
 | 
| 
35262
 
9ea4445d2ccf
slightly more abstract syntax mark/unmark operations;
 
wenzelm 
parents: 
35122 
diff
changeset
 | 
70  | 
       (Syntax.mark_const "Appt", [proofT, aT] ---> proofT, Mixfix ("(1_ \\<cdot>/ _)", [4, 5], 4)),
 | 
| 
 
9ea4445d2ccf
slightly more abstract syntax mark/unmark operations;
 
wenzelm 
parents: 
35122 
diff
changeset
 | 
71  | 
       (Syntax.mark_const "AppP", [proofT, proofT] ---> proofT, Mixfix ("(1_ \\<bullet>/ _)", [4, 5], 4))]
 | 
| 22796 | 72  | 
  |> Sign.add_modesyntax_i ("latex", false)
 | 
| 
16425
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
73  | 
      [("_Lam", [paramsT, proofT] ---> proofT, Mixfix ("(1\\<^bold>\\<lambda>_./ _)", [0, 3], 3))]
 | 
| 22796 | 74  | 
|> Sign.add_trrules_i (map Syntax.ParsePrintRule  | 
| 11522 | 75  | 
[(Syntax.mk_appl (Constant "_Lam")  | 
| 11614 | 76  | 
[Syntax.mk_appl (Constant "_Lam0") [Variable "l", Variable "m"], Variable "A"],  | 
77  | 
Syntax.mk_appl (Constant "_Lam")  | 
|
78  | 
[Variable "l", Syntax.mk_appl (Constant "_Lam") [Variable "m", Variable "A"]]),  | 
|
79  | 
(Syntax.mk_appl (Constant "_Lam")  | 
|
| 11522 | 80  | 
[Syntax.mk_appl (Constant "_Lam1") [Variable "x", Variable "A"], Variable "B"],  | 
| 
35262
 
9ea4445d2ccf
slightly more abstract syntax mark/unmark operations;
 
wenzelm 
parents: 
35122 
diff
changeset
 | 
81  | 
Syntax.mk_appl (Constant (Syntax.mark_const "AbsP")) [Variable "A",  | 
| 11522 | 82  | 
(Syntax.mk_appl (Constant "_abs") [Variable "x", Variable "B"])]),  | 
| 11614 | 83  | 
(Syntax.mk_appl (Constant "_Lam") [Variable "x", Variable "A"],  | 
| 
35262
 
9ea4445d2ccf
slightly more abstract syntax mark/unmark operations;
 
wenzelm 
parents: 
35122 
diff
changeset
 | 
84  | 
Syntax.mk_appl (Constant (Syntax.mark_const "Abst"))  | 
| 11614 | 85  | 
[(Syntax.mk_appl (Constant "_abs") [Variable "x", Variable "A"])])]);  | 
| 11522 | 86  | 
|
87  | 
||
88  | 
(**** translation between proof terms and pure terms ****)  | 
|
89  | 
||
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
90  | 
fun proof_of_term thy ty =  | 
| 11522 | 91  | 
let  | 
| 16350 | 92  | 
val thms = PureThy.all_thms_of thy;  | 
93  | 
val axms = Theory.all_axioms_of thy;  | 
|
| 11522 | 94  | 
|
| 
20548
 
8ef25fe585a8
renamed Term.map_term_types to Term.map_types (cf. Term.fold_types);
 
wenzelm 
parents: 
19618 
diff
changeset
 | 
95  | 
fun mk_term t = (if ty then I else map_types (K dummyT))  | 
| 11614 | 96  | 
(Term.no_dummy_patterns t);  | 
97  | 
||
| 11522 | 98  | 
fun prf_of [] (Bound i) = PBound i  | 
99  | 
      | prf_of Ts (Const (s, Type ("proof", _))) =
 | 
|
| 15531 | 100  | 
change_type (if ty then SOME Ts else NONE)  | 
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
101  | 
(case Long_Name.explode s of  | 
| 11614 | 102  | 
"axm" :: xs =>  | 
| 11522 | 103  | 
let  | 
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
104  | 
val name = Long_Name.implode xs;  | 
| 17223 | 105  | 
val prop = (case AList.lookup (op =) axms name of  | 
| 15531 | 106  | 
SOME prop => prop  | 
107  | 
                     | NONE => error ("Unknown axiom " ^ quote name))
 | 
|
108  | 
in PAxm (name, prop, NONE) end  | 
|
| 11614 | 109  | 
| "thm" :: xs =>  | 
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
110  | 
let val name = Long_Name.implode xs;  | 
| 17223 | 111  | 
in (case AList.lookup (op =) thms name of  | 
| 28814 | 112  | 
SOME thm => fst (strip_combt (Thm.proof_of thm))  | 
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
113  | 
                   | NONE => error ("Unknown theorem " ^ quote name))
 | 
| 11522 | 114  | 
end  | 
115  | 
             | _ => error ("Illegal proof constant name: " ^ quote s))
 | 
|
| 
31943
 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 
wenzelm 
parents: 
31903 
diff
changeset
 | 
116  | 
      | prf_of Ts (Const ("OfClass", _) $ Const (c_class, _)) =
 | 
| 31903 | 117  | 
(case try Logic.class_of_const c_class of  | 
118  | 
SOME c =>  | 
|
119  | 
change_type (if ty then SOME Ts else NONE)  | 
|
| 
31943
 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 
wenzelm 
parents: 
31903 
diff
changeset
 | 
120  | 
(OfClass (TVar ((Name.aT, 0), []), c))  | 
| 31903 | 121  | 
          | NONE => error ("Bad class constant: " ^ quote c_class))
 | 
| 13199 | 122  | 
      | prf_of Ts (Const ("Hyp", _) $ prop) = Hyp prop
 | 
| 11522 | 123  | 
      | prf_of Ts (v as Var ((_, Type ("proof", _)))) = Hyp v
 | 
124  | 
      | prf_of [] (Const ("Abst", _) $ Abs (s, T, prf)) =
 | 
|
| 
25245
 
1fcfcdcba53c
Added well-formedness check to Abst case in function prf_of.
 
berghofe 
parents: 
24848 
diff
changeset
 | 
125  | 
if T = proofT then  | 
| 
 
1fcfcdcba53c
Added well-formedness check to Abst case in function prf_of.
 
berghofe 
parents: 
24848 
diff
changeset
 | 
126  | 
            error ("Term variable abstraction may not bind proof variable " ^ quote s)
 | 
| 
 
1fcfcdcba53c
Added well-formedness check to Abst case in function prf_of.
 
berghofe 
parents: 
24848 
diff
changeset
 | 
127  | 
else Abst (s, if ty then SOME T else NONE,  | 
| 11522 | 128  | 
incr_pboundvars (~1) 0 (prf_of [] prf))  | 
129  | 
      | prf_of [] (Const ("AbsP", _) $ t $ Abs (s, _, prf)) =
 | 
|
| 11614 | 130  | 
AbsP (s, case t of  | 
| 15531 | 131  | 
                Const ("dummy_pattern", _) => NONE
 | 
132  | 
              | _ $ Const ("dummy_pattern", _) => NONE
 | 
|
133  | 
| _ => SOME (mk_term t),  | 
|
| 11522 | 134  | 
incr_pboundvars 0 (~1) (prf_of [] prf))  | 
135  | 
      | prf_of [] (Const ("AppP", _) $ prf1 $ prf2) =
 | 
|
| 11614 | 136  | 
prf_of [] prf1 %% prf_of [] prf2  | 
| 11522 | 137  | 
      | prf_of Ts (Const ("Appt", _) $ prf $ Const ("TYPE", Type (_, [T]))) =
 | 
138  | 
prf_of (T::Ts) prf  | 
|
| 11614 | 139  | 
      | prf_of [] (Const ("Appt", _) $ prf $ t) = prf_of [] prf %
 | 
| 15531 | 140  | 
          (case t of Const ("dummy_pattern", _) => NONE | _ => SOME (mk_term t))
 | 
| 11522 | 141  | 
      | prf_of _ t = error ("Not a proof term:\n" ^
 | 
| 
26939
 
1035c89b4c02
moved global pretty/string_of functions from Sign to Syntax;
 
wenzelm 
parents: 
26626 
diff
changeset
 | 
142  | 
Syntax.string_of_term_global thy t)  | 
| 11522 | 143  | 
|
144  | 
in prf_of [] end;  | 
|
145  | 
||
146  | 
||
147  | 
val AbsPt = Const ("AbsP", [propT, proofT --> proofT] ---> proofT);
 | 
|
148  | 
val AppPt = Const ("AppP", [proofT, proofT] ---> proofT);
 | 
|
| 13199 | 149  | 
val Hypt = Const ("Hyp", propT --> proofT);
 | 
150  | 
val Oraclet = Const ("Oracle", propT --> proofT);
 | 
|
| 
31943
 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 
wenzelm 
parents: 
31903 
diff
changeset
 | 
151  | 
val OfClasst = Const ("OfClass", (Term.itselfT dummyT --> propT) --> proofT);
 | 
| 13199 | 152  | 
val MinProoft = Const ("MinProof", proofT);
 | 
| 11522 | 153  | 
|
| 19473 | 154  | 
val mk_tyapp = fold (fn T => fn prf => Const ("Appt",
 | 
| 19391 | 155  | 
[proofT, Term.itselfT T] ---> proofT) $ prf $ Logic.mk_type T);  | 
| 11522 | 156  | 
|
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
157  | 
fun term_of _ (PThm (_, ((name, _, NONE), _))) =  | 
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
158  | 
Const (Long_Name.append "thm" name, proofT)  | 
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
159  | 
| term_of _ (PThm (_, ((name, _, SOME Ts), _))) =  | 
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
160  | 
mk_tyapp Ts (Const (Long_Name.append "thm" name, proofT))  | 
| 
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
161  | 
| term_of _ (PAxm (name, _, NONE)) = Const (Long_Name.append "axm" name, proofT)  | 
| 15531 | 162  | 
| term_of _ (PAxm (name, _, SOME Ts)) =  | 
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
163  | 
mk_tyapp Ts (Const (Long_Name.append "axm" name, proofT))  | 
| 
31943
 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 
wenzelm 
parents: 
31903 
diff
changeset
 | 
164  | 
| term_of _ (OfClass (T, c)) =  | 
| 
 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 
wenzelm 
parents: 
31903 
diff
changeset
 | 
165  | 
mk_tyapp [T] (OfClasst $ Const (Logic.const_of_class c, Term.itselfT dummyT --> propT))  | 
| 11522 | 166  | 
| term_of _ (PBound i) = Bound i  | 
| 
27260
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
167  | 
| term_of Ts (Abst (s, opT, prf)) =  | 
| 18939 | 168  | 
let val T = the_default dummyT opT  | 
| 11522 | 169  | 
      in Const ("Abst", (T --> proofT) --> proofT) $
 | 
170  | 
Abs (s, T, term_of (T::Ts) (incr_pboundvars 1 0 prf))  | 
|
171  | 
end  | 
|
172  | 
| term_of Ts (AbsP (s, t, prf)) =  | 
|
| 18939 | 173  | 
AbsPt $ the_default (Term.dummy_pattern propT) t $  | 
| 11522 | 174  | 
Abs (s, proofT, term_of (proofT::Ts) (incr_pboundvars 0 1 prf))  | 
| 11614 | 175  | 
| term_of Ts (prf1 %% prf2) =  | 
| 11522 | 176  | 
AppPt $ term_of Ts prf1 $ term_of Ts prf2  | 
| 
27260
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
177  | 
| term_of Ts (prf % opt) =  | 
| 18939 | 178  | 
let val t = the_default (Term.dummy_pattern dummyT) opt  | 
| 11522 | 179  | 
      in Const ("Appt",
 | 
180  | 
[proofT, fastype_of1 (Ts, t) handle TERM _ => dummyT] ---> proofT) $  | 
|
181  | 
term_of Ts prf $ t  | 
|
182  | 
end  | 
|
183  | 
| term_of Ts (Hyp t) = Hypt $ t  | 
|
184  | 
| term_of Ts (Oracle (_, t, _)) = Oraclet $ t  | 
|
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
185  | 
| term_of Ts MinProof = MinProoft;  | 
| 11522 | 186  | 
|
187  | 
val term_of_proof = term_of [];  | 
|
188  | 
||
189  | 
fun cterm_of_proof thy prf =  | 
|
190  | 
let  | 
|
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
191  | 
val thm_names = map fst (PureThy.all_thms_of thy);  | 
| 16350 | 192  | 
val axm_names = map fst (Theory.all_axioms_of thy);  | 
| 
16425
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
193  | 
val thy' = thy  | 
| 
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
194  | 
|> add_proof_syntax  | 
| 
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
195  | 
|> add_proof_atom_consts  | 
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
196  | 
(map (Long_Name.append "axm") axm_names @ map (Long_Name.append "thm") thm_names);  | 
| 11522 | 197  | 
in  | 
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
198  | 
(cterm_of thy' (term_of_proof prf), proof_of_term thy true o Thm.term_of)  | 
| 11522 | 199  | 
end;  | 
200  | 
||
201  | 
fun read_term thy =  | 
|
202  | 
let  | 
|
| 28375 | 203  | 
val thm_names = filter_out (fn s => s = "") (map fst (PureThy.all_thms_of thy));  | 
| 16350 | 204  | 
val axm_names = map fst (Theory.all_axioms_of thy);  | 
| 
27260
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
205  | 
val ctxt = thy  | 
| 
16425
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
206  | 
|> add_proof_syntax  | 
| 
 
2427be27cc60
accomodate identification of type Sign.sg and theory;
 
wenzelm 
parents: 
16350 
diff
changeset
 | 
207  | 
|> add_proof_atom_consts  | 
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
208  | 
(map (Long_Name.append "axm") axm_names @ map (Long_Name.append "thm") thm_names)  | 
| 
27260
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
209  | 
|> ProofContext.init  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
210  | 
|> ProofContext.allow_dummies  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
211  | 
|> ProofContext.set_mode ProofContext.mode_schematic;  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
212  | 
in  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
213  | 
fn ty => fn s =>  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
214  | 
(if ty = propT then Syntax.parse_prop else Syntax.parse_term) ctxt s  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
215  | 
|> TypeInfer.constrain ty |> Syntax.check_term ctxt  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
216  | 
end;  | 
| 11522 | 217  | 
|
218  | 
fun read_proof thy =  | 
|
219  | 
let val rd = read_term thy proofT  | 
|
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
220  | 
in fn ty => fn s => proof_of_term thy ty (Logic.varify (rd s)) end;  | 
| 11522 | 221  | 
|
| 17078 | 222  | 
fun proof_syntax prf =  | 
| 11522 | 223  | 
let  | 
| 
28807
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
224  | 
val thm_names = Symtab.keys (fold_proof_atoms true  | 
| 
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
225  | 
(fn PThm (_, ((name, _, _), _)) => if name <> "" then Symtab.update (name, ()) else I  | 
| 
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
226  | 
| _ => I) [prf] Symtab.empty);  | 
| 
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
227  | 
val axm_names = Symtab.keys (fold_proof_atoms true  | 
| 
 
9f3ecb4aaac2
proof_of_term: removed obsolete disambiguisation table;
 
wenzelm 
parents: 
28375 
diff
changeset
 | 
228  | 
(fn PAxm (name, _, _) => Symtab.update (name, ()) | _ => I) [prf] Symtab.empty);  | 
| 11522 | 229  | 
in  | 
| 17078 | 230  | 
add_proof_syntax #>  | 
231  | 
add_proof_atom_consts  | 
|
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30344 
diff
changeset
 | 
232  | 
(map (Long_Name.append "thm") thm_names @ map (Long_Name.append "axm") axm_names)  | 
| 11522 | 233  | 
end;  | 
234  | 
||
| 17078 | 235  | 
fun proof_of full thm =  | 
236  | 
let  | 
|
| 
26626
 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 
wenzelm 
parents: 
25245 
diff
changeset
 | 
237  | 
val thy = Thm.theory_of_thm thm;  | 
| 17078 | 238  | 
val prop = Thm.full_prop_of thm;  | 
| 28814 | 239  | 
val prf = Thm.proof_of thm;  | 
| 17078 | 240  | 
val prf' = (case strip_combt (fst (strip_combP prf)) of  | 
| 
29635
 
31d14e9fa0da
proof_body: turned lazy into future -- ensures that body is fulfilled eventually, without explicit force;
 
wenzelm 
parents: 
29606 
diff
changeset
 | 
241  | 
(PThm (_, ((_, prop', _), body)), _) => if prop = prop' then join_proof body else prf  | 
| 17078 | 242  | 
| _ => prf)  | 
243  | 
in if full then Reconstruct.reconstruct_proof thy prop prf' else prf' end;  | 
|
244  | 
||
| 
27260
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
245  | 
fun pretty_proof ctxt prf =  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
246  | 
ProofContext.pretty_term_abbrev  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
247  | 
(ProofContext.transfer_syntax (proof_syntax prf (ProofContext.theory_of ctxt)) ctxt)  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
248  | 
(term_of_proof prf);  | 
| 17078 | 249  | 
|
| 
27260
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
250  | 
fun pretty_proof_of ctxt full th =  | 
| 
 
17d617c6b026
moved ProofContext.pretty_proof to ProofSyntax.pretty_proof;
 
wenzelm 
parents: 
26939 
diff
changeset
 | 
251  | 
pretty_proof ctxt (proof_of full th);  | 
| 11522 | 252  | 
|
253  | 
end;  |