src/FOL/ex/IffOracle.thy
author haftmann
Tue, 22 Jan 2008 11:37:28 +0100
changeset 25940 6942f3c5dec8
parent 23153 3cc4a80c4d30
child 25946 8ceff6c1f2a8
permissions -rw-r--r--
avoid 'it' in ML expressions
wenzelm@3817
     1
(*  Title:      FOL/ex/IffOracle.thy
paulson@1537
     2
    ID:         $Id$
paulson@1537
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
paulson@1537
     4
    Copyright   1996  University of Cambridge
paulson@1537
     5
*)
paulson@1537
     6
wenzelm@16832
     7
header {* Example of Declaring an Oracle *}
wenzelm@3817
     8
wenzelm@16832
     9
theory IffOracle
wenzelm@16832
    10
imports FOL
wenzelm@16832
    11
begin
wenzelm@3817
    12
wenzelm@16832
    13
subsection {* Oracle declaration *}
wenzelm@3817
    14
wenzelm@16832
    15
text {*
wenzelm@16832
    16
  This oracle makes tautologies of the form @{text "P <-> P <-> P <-> P"}.
wenzelm@16832
    17
  The length is specified by an integer, which is checked to be even
wenzelm@16832
    18
  and positive.
wenzelm@16832
    19
*}
wenzelm@3817
    20
wenzelm@16832
    21
oracle iff_oracle (int) = {*
wenzelm@16832
    22
  let
wenzelm@23153
    23
    fun mk_iff 1 = Var (("P", 0), @{typ o})
wenzelm@23153
    24
      | mk_iff n = FOLogic.iff $ Var (("P", 0), @{typ o}) $ mk_iff (n - 1);
wenzelm@16832
    25
  in
wenzelm@16832
    26
    fn thy => fn n =>
wenzelm@16832
    27
      if n > 0 andalso n mod 2 = 0
wenzelm@16832
    28
      then FOLogic.mk_Trueprop (mk_iff n)
wenzelm@16832
    29
      else raise Fail ("iff_oracle: " ^ string_of_int n)
wenzelm@16832
    30
  end
wenzelm@16832
    31
*}
wenzelm@3817
    32
wenzelm@3817
    33
wenzelm@16832
    34
subsection {* Oracle as low-level rule *}
wenzelm@3817
    35
wenzelm@23153
    36
ML {* iff_oracle @{theory} 2 *}
wenzelm@23153
    37
ML {* iff_oracle @{theory} 10 *}
wenzelm@3817
    38
webertj@21863
    39
text {* These oracle calls had better fail. *}
wenzelm@3817
    40
wenzelm@16832
    41
ML {*
wenzelm@23153
    42
  (iff_oracle @{theory} 5; error "?")
wenzelm@23153
    43
    handle Fail _ => warning "Oracle failed, as expected"
wenzelm@16832
    44
*}
wenzelm@3817
    45
wenzelm@16832
    46
ML {*
wenzelm@23153
    47
  (iff_oracle @{theory} 1; error "?")
wenzelm@23153
    48
    handle Fail _ => warning "Oracle failed, as expected"
wenzelm@16832
    49
*}
wenzelm@3817
    50
wenzelm@16832
    51
wenzelm@16832
    52
subsection {* Oracle as proof method *}
wenzelm@16832
    53
wenzelm@16832
    54
method_setup iff = {*
wenzelm@16832
    55
  Method.simple_args Args.nat (fn n => fn ctxt =>
wenzelm@16832
    56
    Method.SIMPLE_METHOD
wenzelm@16832
    57
      (HEADGOAL (Tactic.rtac (iff_oracle (ProofContext.theory_of ctxt) n))
wenzelm@16832
    58
        handle Fail _ => no_tac))
wenzelm@16832
    59
*} "iff oracle"
wenzelm@16832
    60
wenzelm@16832
    61
wenzelm@16832
    62
lemma "A <-> A"
wenzelm@16832
    63
  by (iff 2)
wenzelm@16832
    64
wenzelm@16832
    65
lemma "A <-> A <-> A <-> A <-> A <-> A <-> A <-> A <-> A <-> A"
wenzelm@16832
    66
  by (iff 10)
wenzelm@16832
    67
wenzelm@16832
    68
lemma "A <-> A <-> A <-> A <-> A"
wenzelm@16832
    69
  apply (iff 5)?
wenzelm@16832
    70
  oops
wenzelm@16832
    71
wenzelm@16832
    72
lemma A
wenzelm@16832
    73
  apply (iff 1)?
wenzelm@16832
    74
  oops
wenzelm@3817
    75
paulson@16063
    76
end