src/FOL/ex/Iff_Oracle.thy
author wenzelm
Wed, 25 Mar 2009 17:23:44 +0100
changeset 30719 21c20c7d1932
parent 30549 d2d7874648bd
child 36960 01594f816e3a
permissions -rw-r--r--
use more informative Thm.proof_body_of for oracle demo;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29752
ad4e3a577fd3 modernized some theory names;
wenzelm
parents: 28316
diff changeset
     1
(*  Title:      FOL/ex/Iff_Oracle.thy
1537
3f51f0945a3e Example of declaring oracles
paulson
parents:
diff changeset
     2
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
3f51f0945a3e Example of declaring oracles
paulson
parents:
diff changeset
     3
    Copyright   1996  University of Cambridge
3f51f0945a3e Example of declaring oracles
paulson
parents:
diff changeset
     4
*)
3f51f0945a3e Example of declaring oracles
paulson
parents:
diff changeset
     5
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
     6
header {* Example of Declaring an Oracle *}
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
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
     9
imports FOL
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    10
begin
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    11
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    12
subsection {* Oracle declaration *}
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    13
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    14
text {*
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    15
  This oracle makes tautologies of the form @{text "P <-> P <-> P <-> P"}.
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.
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    18
*}
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    19
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27809
diff changeset
    20
oracle iff_oracle = {*
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    21
  let
23153
3cc4a80c4d30 tuned oracle setup;
wenzelm
parents: 21863
diff changeset
    22
    fun mk_iff 1 = Var (("P", 0), @{typ o})
3cc4a80c4d30 tuned oracle setup;
wenzelm
parents: 21863
diff changeset
    23
      | mk_iff n = FOLogic.iff $ Var (("P", 0), @{typ o}) $ 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
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27809
diff changeset
    27
      then Thm.cterm_of thy (FOLogic.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
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    30
*}
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    31
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    32
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    33
subsection {* Oracle as low-level rule *}
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    34
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27809
diff changeset
    35
ML {* iff_oracle (@{theory}, 2) *}
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27809
diff changeset
    36
ML {* iff_oracle (@{theory}, 10) *}
30719
21c20c7d1932 use more informative Thm.proof_body_of for oracle demo;
wenzelm
parents: 30549
diff changeset
    37
ML {* Thm.proof_body_of (iff_oracle (@{theory}, 10)) *}
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    38
21863
2cfc838297ff tracing instead of warning
webertj
parents: 18678
diff changeset
    39
text {* These oracle calls had better fail. *}
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    40
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    41
ML {*
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27809
diff changeset
    42
  (iff_oracle (@{theory}, 5); error "?")
23153
3cc4a80c4d30 tuned oracle setup;
wenzelm
parents: 21863
diff changeset
    43
    handle Fail _ => warning "Oracle failed, as expected"
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    44
*}
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    45
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    46
ML {*
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27809
diff changeset
    47
  (iff_oracle (@{theory}, 1); error "?")
23153
3cc4a80c4d30 tuned oracle setup;
wenzelm
parents: 21863
diff changeset
    48
    handle Fail _ => warning "Oracle failed, as expected"
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    49
*}
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    50
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    51
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    52
subsection {* Oracle as proof method *}
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    53
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    54
method_setup iff = {*
30549
d2d7874648bd simplified method setup;
wenzelm
parents: 30510
diff changeset
    55
  Scan.lift OuterParse.nat >> (fn n => fn ctxt =>
30510
4120fc59dd85 unified type Proof.method and pervasive METHOD combinators;
wenzelm
parents: 29752
diff changeset
    56
    SIMPLE_METHOD
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27809
diff changeset
    57
      (HEADGOAL (Tactic.rtac (iff_oracle (ProofContext.theory_of ctxt, n)))
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    58
        handle Fail _ => no_tac))
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    59
*} "iff oracle"
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    60
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    61
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    62
lemma "A <-> A"
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    63
  by (iff 2)
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    64
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    65
lemma "A <-> A <-> A <-> A <-> A <-> A <-> A <-> A <-> A <-> A"
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    66
  by (iff 10)
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    67
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    68
lemma "A <-> A <-> A <-> A <-> A"
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    69
  apply (iff 5)?
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    70
  oops
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    71
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    72
lemma A
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    73
  apply (iff 1)?
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    74
  oops
3817
f20f193d42b4 removed declIffOracle;
wenzelm
parents: 1537
diff changeset
    75
16063
7dd4eb2c8055 oracle example converted to Isar
paulson
parents: 3817
diff changeset
    76
end