src/HOL/Proofs/ex/Proof_Terms.thy
author wenzelm
Wed, 04 Oct 2017 12:00:53 +0200
changeset 66787 64b47495676d
parent 64986 b81a048960a3
child 67399 eab6ce8368fa
permissions -rw-r--r--
obsolete;
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>
64986
b81a048960a3 more uniform use of Reconstruct.clean_proof_of;
wenzelm
parents: 64572
diff changeset
    23
  val thm = @{thm ex};
b81a048960a3 more uniform use of Reconstruct.clean_proof_of;
wenzelm
parents: 64572
diff changeset
    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
b81a048960a3 more uniform use of Reconstruct.clean_proof_of;
wenzelm
parents: 64572
diff changeset
    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
b81a048960a3 more uniform use of Reconstruct.clean_proof_of;
wenzelm
parents: 64572
diff changeset
    30
b81a048960a3 more uniform use of Reconstruct.clean_proof_of;
wenzelm
parents: 64572
diff changeset
    31
  (*clean output*)
b81a048960a3 more uniform use of Reconstruct.clean_proof_of;
wenzelm
parents: 64572
diff changeset
    32
  Pretty.writeln (Proof_Syntax.pretty_clean_proof_of @{context} false thm);
b81a048960a3 more uniform use of Reconstruct.clean_proof_of;
wenzelm
parents: 64572
diff changeset
    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
cec07f7249cd tuned signature;
wenzelm
parents: 62922
diff changeset
    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
96691631c1eb clarified context;
wenzelm
parents: 62363
diff changeset
    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
96691631c1eb clarified context;
wenzelm
parents: 62363
diff changeset
    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