src/HOL/Proofs/ex/Proof_Terms.thy
author haftmann
Wed, 21 Dec 2016 21:26:26 +0100
changeset 64633 5ebcf6c525f1
parent 64572 cec07f7249cd
child 64986 b81a048960a3
permissions -rw-r--r--
prefer existing logical constant over abbreviation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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>
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    23
  (*proof body with digest*)
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    24
  val body = Proofterm.strip_thm (Thm.proof_body_of @{thm ex});
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    25
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    26
  (*proof term only*)
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    27
  val prf = Proofterm.proof_of body;
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    28
  Pretty.writeln (Proof_Syntax.pretty_proof @{context} prf);
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    29
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    30
  (*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
    31
  val all_thms =
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    32
    Proofterm.fold_body_thms
64572
cec07f7249cd tuned signature;
wenzelm
parents: 62922
diff changeset
    33
      (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
    34
\<close>
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    35
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    36
text \<open>
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    37
  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
    38
  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
    39
  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
    40
  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
    41
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    42
  \<^medskip>
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    43
  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
    44
  theorem as follows:
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    45
\<close>
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
ML_val \<open>
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    48
  val thy = @{theory};
62922
96691631c1eb clarified context;
wenzelm
parents: 62363
diff changeset
    49
  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
    50
  val prf =
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    51
    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
    52
      "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
    53
      \   (\<^bold>\<lambda>H: _. \
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    54
      \     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
    55
      \       (\<^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
    56
  val thm =
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    57
    prf
62922
96691631c1eb clarified context;
wenzelm
parents: 62363
diff changeset
    58
    |> 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
    59
    |> 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
    60
    |> 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
    61
\<close>
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    62
7b5468422352 moved examples to avoid dependency on bulky HOL-Proofs session, e.g. relevant for "isabelle makedist";
wenzelm
parents:
diff changeset
    63
end