src/HOL/ex/Iff_Oracle.thy
author haftmann
Fri, 01 Nov 2013 18:51:14 +0100
changeset 54230 b1d955791529
parent 50126 3dec88149176
child 58889 5b7a9633cfa8
permissions -rw-r--r--
more simplification rules on unary and binary minus
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
     1
(*  Title:      HOL/ex/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
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
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
     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
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 {*
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
    15
  This oracle makes tautologies of the form @{prop "P <-> P <-> P <-> P"}.
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.
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
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
    22
    fun mk_iff 1 = Var (("P", 0), @{typ bool})
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
    23
      | mk_iff n = HOLogic.mk_eq (Var (("P", 0), @{typ bool}), 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
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
    27
      then Thm.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
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) *}
50126
3dec88149176 theorem status about oracles/futures is no longer printed by default;
wenzelm
parents: 42814
diff changeset
    37
ML {* Thm.peek_status (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 {*
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
    42
  (iff_oracle (@{theory}, 5); error "Bad oracle")
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 {*
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
    47
  (iff_oracle (@{theory}, 1); error "Bad oracle")
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 = {*
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 30719
diff changeset
    55
  Scan.lift Parse.nat >> (fn n => fn ctxt =>
30510
4120fc59dd85 unified type Proof.method and pervasive METHOD combinators;
wenzelm
parents: 29752
diff changeset
    56
    SIMPLE_METHOD
42361
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 40239
diff changeset
    57
      (HEADGOAL (rtac (iff_oracle (Proof_Context.theory_of ctxt, n)))
16832
f220d1df0f4e new type-safe interface;
wenzelm
parents: 16417
diff changeset
    58
        handle Fail _ => no_tac))
42814
5af15f1e2ef6 simplified/unified method_setup/attribute_setup;
wenzelm
parents: 42361
diff changeset
    59
*}
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