src/HOL/Examples/Iff_Oracle.thy
author wenzelm
Mon, 08 Jun 2020 21:55:14 +0200
changeset 71926 bee83c9d3306
parent 71465 src/HOL/ex/Iff_Oracle.thy@910a081cca74
child 72029 83456d9f0ed5
permissions -rw-r--r--
clarified sessions;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71926
bee83c9d3306 clarified sessions;
wenzelm
parents: 71465
diff changeset
     1
(*  Title:      HOL/Example/Iff_Oracle.thy
1537
3f51f0945a3e Example of declaring oracles
paulson
parents:
diff changeset
     2
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
40239
c4336e45f199 moved FOL/ex/Iff_Oracle.thy to HOL/ex where it is more accessible to most readers of isar-ref;
wenzelm
parents: 36960
diff changeset
     3
    Author:     Makarius
1537
3f51f0945a3e Example of declaring oracles
paulson
parents:
diff changeset
     4
*)
3f51f0945a3e Example of declaring oracles
paulson
parents:
diff changeset
     5
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
     6
section \<open>Example of Declaring an Oracle\<close>
16063
7dd4eb2c8055 oracle example converted to Isar
paulson
parents: 3817
diff changeset
     7
29752
ad4e3a577fd3 modernized some theory names;
wenzelm
parents: 28316
diff changeset
     8
theory Iff_Oracle
71926
bee83c9d3306 clarified sessions;
wenzelm
parents: 71465
diff changeset
     9
  imports Main
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    10
begin
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    11
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    12
subsection \<open>Oracle declaration\<close>
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    13
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    14
text \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 60754
diff changeset
    15
  This oracle makes tautologies of the form \<^prop>\<open>P \<longleftrightarrow> P \<longleftrightarrow> P \<longleftrightarrow> P\<close>.
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    16
  The length is specified by an integer, which is checked to be even
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    17
  and positive.
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    18
\<close>
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    19
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    20
oracle iff_oracle = \<open>
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    21
  let
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 60754
diff changeset
    22
    fun mk_iff 1 = Var (("P", 0), \<^typ>\<open>bool\<close>)
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 60754
diff changeset
    23
      | mk_iff n = HOLogic.mk_eq (Var (("P", 0), \<^typ>\<open>bool\<close>), mk_iff (n - 1));
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    24
  in
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27809
diff changeset
    25
    fn (thy, n) =>
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    26
      if n > 0 andalso n mod 2 = 0
59621
291934bac95e Thm.cterm_of and Thm.ctyp_of operate on local context;
wenzelm
parents: 59030
diff changeset
    27
      then Thm.global_cterm_of thy (HOLogic.mk_Trueprop (mk_iff n))
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    28
      else raise Fail ("iff_oracle: " ^ string_of_int n)
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    29
  end
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    30
\<close>
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    31
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    32
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    33
subsection \<open>Oracle as low-level rule\<close>
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    34
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 60754
diff changeset
    35
ML \<open>iff_oracle (\<^theory>, 2)\<close>
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 60754
diff changeset
    36
ML \<open>iff_oracle (\<^theory>, 10)\<close>
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    37
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    38
ML \<open>
71465
910a081cca74 more position information for oracles (e.g. "skip_proof" for 'sorry'), requires Proofterm.proofs := 1;
wenzelm
parents: 70565
diff changeset
    39
  \<^assert> (map (#1 o #1) (Thm_Deps.all_oracles [iff_oracle (\<^theory>, 10)]) = [\<^oracle_name>\<open>iff_oracle\<close>]);
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    40
\<close>
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    41
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    42
text \<open>These oracle calls had better fail.\<close>
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    43
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    44
ML \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 60754
diff changeset
    45
  (iff_oracle (\<^theory>, 5); error "Bad oracle")
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    46
    handle Fail _ => writeln "Oracle failed, as expected"
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    47
\<close>
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    48
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    49
ML \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 60754
diff changeset
    50
  (iff_oracle (\<^theory>, 1); error "Bad oracle")
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    51
    handle Fail _ => writeln "Oracle failed, as expected"
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    52
\<close>
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    53
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    54
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    55
subsection \<open>Oracle as proof method\<close>
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    56
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    57
method_setup iff =
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    58
  \<open>Scan.lift Parse.nat >> (fn n => fn ctxt =>
30510
4120fc59dd85 unified type Proof.method and pervasive METHOD combinators;
wenzelm
parents: 29752
diff changeset
    59
    SIMPLE_METHOD
60754
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 59621
diff changeset
    60
      (HEADGOAL (resolve_tac ctxt [iff_oracle (Proof_Context.theory_of ctxt, n)])
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    61
        handle Fail _ => no_tac))\<close>
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    62
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    63
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    64
lemma "A \<longleftrightarrow> A"
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    65
  by (iff 2)
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    66
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    67
lemma "A \<longleftrightarrow> A \<longleftrightarrow> A \<longleftrightarrow> A \<longleftrightarrow> A \<longleftrightarrow> A \<longleftrightarrow> A \<longleftrightarrow> A \<longleftrightarrow> A \<longleftrightarrow> A"
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    68
  by (iff 10)
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    69
59030
67baff6f697c misc tuning and modernization;
wenzelm
parents: 58889
diff changeset
    70
lemma "A \<longleftrightarrow> A \<longleftrightarrow> A \<longleftrightarrow> A \<longleftrightarrow> A"
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    71
  apply (iff 5)?
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    72
  oops
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    73
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    74
lemma A
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    75
  apply (iff 1)?
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    76
  oops
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    77
16063
7dd4eb2c8055 oracle example converted to Isar
paulson
parents: 3817
diff changeset
    78
end