author | wenzelm |
Wed, 04 Oct 2017 12:00:53 +0200 | |
changeset 66787 | 64b47495676d |
parent 64986 | b81a048960a3 |
child 67399 | eab6ce8368fa |
permissions | -rw-r--r-- |
62363
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
1 |
(* Title: HOL/Proofs/ex/Proof_Terms.thy |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
2 |
Author: Makarius |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
3 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
4 |
Basic examples involving proof terms. |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
5 |
*) |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
6 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
7 |
theory Proof_Terms |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
8 |
imports Main |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
9 |
begin |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
10 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
11 |
text \<open> |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
12 |
Detailed proof information of a theorem may be retrieved as follows: |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
13 |
\<close> |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
14 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
15 |
lemma ex: "A \<and> B \<longrightarrow> B \<and> A" |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
16 |
proof |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
17 |
assume "A \<and> B" |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
18 |
then obtain B and A .. |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
19 |
then show "B \<and> A" .. |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
20 |
qed |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
21 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
22 |
ML_val \<open> |
64986 | 23 |
val thm = @{thm ex}; |
24 |
||
62363
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
25 |
(*proof body with digest*) |
64986 | 26 |
val body = Proofterm.strip_thm (Thm.proof_body_of thm); |
62363
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
27 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
28 |
(*proof term only*) |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
29 |
val prf = Proofterm.proof_of body; |
64986 | 30 |
|
31 |
(*clean output*) |
|
32 |
Pretty.writeln (Proof_Syntax.pretty_clean_proof_of @{context} false thm); |
|
33 |
Pretty.writeln (Proof_Syntax.pretty_clean_proof_of @{context} true thm); |
|
62363
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
34 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
35 |
(*all theorems used in the graph of nested proofs*) |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
36 |
val all_thms = |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
37 |
Proofterm.fold_body_thms |
64572 | 38 |
(fn {name, ...} => insert (op =) name) [body] []; |
62363
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
39 |
\<close> |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
40 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
41 |
text \<open> |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
42 |
The result refers to various basic facts of Isabelle/HOL: @{thm [source] |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
43 |
HOL.impI}, @{thm [source] HOL.conjE}, @{thm [source] HOL.conjI} etc. The |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
44 |
combinator @{ML Proofterm.fold_body_thms} recursively explores the graph of |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
45 |
the proofs of all theorems being used here. |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
46 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
47 |
\<^medskip> |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
48 |
Alternatively, we may produce a proof term manually, and turn it into a |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
49 |
theorem as follows: |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
50 |
\<close> |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
51 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
52 |
ML_val \<open> |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
53 |
val thy = @{theory}; |
62922 | 54 |
val ctxt = @{context}; |
62363
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
55 |
val prf = |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
56 |
Proof_Syntax.read_proof thy true false |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
57 |
"impI \<cdot> _ \<cdot> _ \<bullet> \ |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
58 |
\ (\<^bold>\<lambda>H: _. \ |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
59 |
\ conjE \<cdot> _ \<cdot> _ \<cdot> _ \<bullet> H \<bullet> \ |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
60 |
\ (\<^bold>\<lambda>(H: _) Ha: _. conjI \<cdot> _ \<cdot> _ \<bullet> Ha \<bullet> H))"; |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
61 |
val thm = |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
62 |
prf |
62922 | 63 |
|> Reconstruct.reconstruct_proof ctxt @{prop "A \<and> B \<longrightarrow> B \<and> A"} |
62363
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
64 |
|> Proof_Checker.thm_of_proof thy |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
65 |
|> Drule.export_without_context; |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
66 |
\<close> |
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
67 |
|
7b5468422352
moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff
changeset
|
68 |
end |