src/HOL/ex/svc_funcs.ML
author haftmann
Thu, 17 May 2007 19:49:40 +0200
changeset 22997 d4f3b015b50b
parent 21962 279b129498b6
child 23881 851c74f1bb69
permissions -rw-r--r--
canonical prefixing of class constants
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Tools/svc_funcs.ML
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
     3
    Author:     Lawrence C Paulson
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
     4
    Copyright   1999  University of Cambridge
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
     5
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
     6
Translation functions for the interface to SVC
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
     7
19336
fb5e19d26d5e removed some illegal characters: they were crashing SML/NJ
paulson
parents: 19277
diff changeset
     8
Based upon the work of Soren T. Heilmann
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
     9
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    10
Integers and naturals are translated as follows:
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    11
  In a positive context, replace x<y by x+1<=y
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    12
  In a negative context, replace x<=y by x<y+1
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    13
  In a negative context, replace x=y by x<y+1 & y<x+1
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    14
Biconditionals (if-and-only-iff) are expanded if they require such translations
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    15
  in either operand.
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    16
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    17
For each variable of type nat, an assumption is added that it is non-negative.
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    18
*)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    19
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    20
structure Svc =
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    21
struct
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    22
 val trace = ref false;
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    23
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    24
 datatype expr =
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    25
     Buildin of string * expr list
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    26
   | Interp of string * expr list
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    27
   | UnInterp of string * expr list
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    28
   | FalseExpr
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    29
   | TrueExpr
15965
f422f8283491 Use of IntInf.int instead of int in most numeric simprocs; avoids
paulson
parents: 15574
diff changeset
    30
   | Int of IntInf.int
f422f8283491 Use of IntInf.int instead of int in most numeric simprocs; avoids
paulson
parents: 15574
diff changeset
    31
   | Rat of IntInf.int * IntInf.int;
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    32
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    33
 fun signedInt i =
15965
f422f8283491 Use of IntInf.int instead of int in most numeric simprocs; avoids
paulson
parents: 15574
diff changeset
    34
     if i < 0 then "-" ^ IntInf.toString (~i)
f422f8283491 Use of IntInf.int instead of int in most numeric simprocs; avoids
paulson
parents: 15574
diff changeset
    35
     else IntInf.toString i;
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    36
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    37
 fun is_intnat T = T = HOLogic.intT orelse T = HOLogic.natT;
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    38
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    39
 fun is_numeric T = is_intnat T orelse T = HOLogic.realT;
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    40
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    41
 fun is_numeric_op T = is_numeric (domain_type T);
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    42
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    43
 fun toString t =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    44
     let fun ue (Buildin(s, l)) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    45
             "(" ^ s ^ (Library.foldl (fn (a, b) => a ^ " " ^ (ue b)) ("", l)) ^ ") "
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    46
           | ue (Interp(s, l)) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    47
             "{" ^ s ^ (Library.foldl (fn (a, b) => a ^ " " ^ (ue b)) ("", l)) ^ "} "
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    48
           | ue (UnInterp(s, l)) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    49
             "(" ^ s ^ (Library.foldl (fn (a, b) => a ^ " " ^ (ue b)) ("", l)) ^ ") "
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    50
           | ue (FalseExpr) = "FALSE "
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    51
           | ue (TrueExpr)  = "TRUE "
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    52
           | ue (Int i)     = (signedInt i) ^ " "
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    53
           | ue (Rat(i, j)) = (signedInt i) ^ "|" ^ (signedInt j) ^ " "
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    54
     in
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    55
         ue t
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    56
     end;
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    57
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    58
 fun valid e =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    59
  let val svc_home = getenv "SVC_HOME"
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    60
      val svc_machine = getenv "SVC_MACHINE"
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    61
      val check_valid = if svc_home = ""
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    62
                        then error "Environment variable SVC_HOME not set"
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    63
                        else if svc_machine = ""
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    64
                        then error "Environment variable SVC_MACHINE not set"
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    65
                        else svc_home ^ "/" ^ svc_machine ^ "/bin/check_valid"
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    66
      val svc_input = toString e
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    67
      val _ = if !trace then tracing ("Calling SVC:\n" ^ svc_input) else ()
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    68
      val svc_input_file  = File.tmp_path (Path.basic "SVM_in");
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    69
      val svc_output_file = File.tmp_path (Path.basic "SVM_out");
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    70
      val _ = (File.write svc_input_file svc_input;
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    71
               execute (check_valid ^ " -dump-result " ^
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    72
                        File.shell_path svc_output_file ^
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    73
                        " " ^ File.shell_path svc_input_file ^
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    74
                        ">/dev/null 2>&1"))
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    75
      val svc_output =
21395
f34ac19659ae moved some fundamental concepts to General/basics.ML;
wenzelm
parents: 21078
diff changeset
    76
        (case try File.read svc_output_file of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14982
diff changeset
    77
          SOME out => out
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14982
diff changeset
    78
        | NONE => error "SVC returned no output");
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    79
  in
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    80
      if ! trace then tracing ("SVC Returns:\n" ^ svc_output)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    81
      else (File.rm svc_input_file; File.rm svc_output_file);
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    82
      String.isPrefix "VALID" svc_output
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    83
  end
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    84
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    85
 fun fail t = raise TERM ("SVC oracle", [t]);
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    86
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    87
 fun apply c args =
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    88
     let val (ts, bs) = ListPair.unzip args
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    89
     in  (list_comb(c,ts), exists I bs)  end;
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    90
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    91
 (*Determining whether the biconditionals must be unfolded: if there are
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    92
   int or nat comparisons below*)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    93
 val iff_tag =
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
    94
   let fun tag t =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    95
         let val (c,ts) = strip_comb t
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    96
         in  case c of
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    97
             Const("op &", _)   => apply c (map tag ts)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    98
           | Const("op |", _)   => apply c (map tag ts)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
    99
           | Const("op -->", _) => apply c (map tag ts)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   100
           | Const("Not", _)    => apply c (map tag ts)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   101
           | Const("True", _)   => (c, false)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   102
           | Const("False", _)  => (c, false)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   103
           | Const("op =", Type ("fun", [T,_])) =>
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   104
                 if T = HOLogic.boolT then
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   105
                     (*biconditional: with int/nat comparisons below?*)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   106
                     let val [t1,t2] = ts
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   107
                         val (u1,b1) = tag t1
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   108
                         and (u2,b2) = tag t2
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   109
                         val cname = if b1 orelse b2 then "unfold" else "keep"
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   110
                     in
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   111
                        (Const ("SVC_Oracle.iff_" ^ cname, dummyT) $ u1 $ u2,
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   112
                         b1 orelse b2)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   113
                     end
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   114
                 else (*might be numeric equality*) (t, is_intnat T)
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   115
           | Const(@{const_name Orderings.less}, Type ("fun", [T,_]))  => (t, is_intnat T)
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   116
           | Const(@{const_name Orderings.less_eq}, Type ("fun", [T,_])) => (t, is_intnat T)
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   117
           | _ => (t, false)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   118
         end
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   119
   in #1 o tag end;
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   120
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   121
 (*Map expression e to 0<=a --> e, where "a" is the name of a nat variable*)
21078
101aefd61aac slight cleanup
haftmann
parents: 20853
diff changeset
   122
 fun add_nat_var a e =
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   123
     Buildin("=>", [Buildin("<=", [Int 0, UnInterp (a, [])]),
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   124
                    e]);
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   125
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   126
 fun param_string [] = ""
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   127
   | param_string is = "_" ^ space_implode "_" (map string_of_int is)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   128
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   129
 (*Translate an Isabelle formula into an SVC expression
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   130
   pos ["positive"]: true if an assumption, false if a goal*)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   131
 fun expr_of pos t =
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   132
  let
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   133
    val params = rev (rename_wrt_term t (Term.strip_all_vars t))
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   134
    and body   = Term.strip_all_body t
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   135
    val nat_vars = ref ([] : string list)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   136
    (*translation of a variable: record all natural numbers*)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   137
    fun trans_var (a,T,is) =
20853
3ff5a2e05810 *** empty log message ***
haftmann
parents: 19336
diff changeset
   138
        (if T = HOLogic.natT then nat_vars := (insert (op =) a (!nat_vars))
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   139
                             else ();
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   140
         UnInterp (a ^ param_string is, []))
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   141
    (*A variable, perhaps applied to a series of parameters*)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   142
    fun var (Free(a,T), is)      = trans_var ("F_" ^ a, T, is)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   143
      | var (Var((a, 0), T), is) = trans_var (a, T, is)
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   144
      | var (Bound i, is)        =
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   145
          let val (a,T) = List.nth (params, i)
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   146
          in  trans_var ("B_" ^ a, T, is)  end
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   147
      | var (t $ Bound i, is)    = var(t,i::is)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   148
            (*removing a parameter from a Var: the bound var index will
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   149
               become part of the Var's name*)
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   150
      | var (t,_) = fail t;
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   151
    (*translation of a literal*)
21820
2f2b6a965ccc introduced mk/dest_numeral/number for mk/dest_binum etc.
haftmann
parents: 21395
diff changeset
   152
    val lit = snd o HOLogic.dest_number;
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   153
    (*translation of a literal expression [no variables]*)
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   154
    fun litExp (Const(@{const_name HOL.plus}, T) $ x $ y) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   155
          if is_numeric_op T then (litExp x) + (litExp y)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   156
          else fail t
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   157
      | litExp (Const(@{const_name HOL.minus}, T) $ x $ y) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   158
          if is_numeric_op T then (litExp x) - (litExp y)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   159
          else fail t
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   160
      | litExp (Const(@{const_name HOL.times}, T) $ x $ y) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   161
          if is_numeric_op T then (litExp x) * (litExp y)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   162
          else fail t
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   163
      | litExp (Const(@{const_name HOL.uminus}, T) $ x)   =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   164
          if is_numeric_op T then ~(litExp x)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   165
          else fail t
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   166
      | litExp t = lit t
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   167
                   handle Match => fail t
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   168
    (*translation of a real/rational expression*)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   169
    fun suc t = Interp("+", [Int 1, t])
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   170
    fun tm (Const(@{const_name Suc}, T) $ x) = suc (tm x)
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   171
      | tm (Const(@{const_name HOL.plus}, T) $ x $ y) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   172
          if is_numeric_op T then Interp("+", [tm x, tm y])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   173
          else fail t
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   174
      | tm (Const(@{const_name HOL.minus}, T) $ x $ y) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   175
          if is_numeric_op T then
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   176
              Interp("+", [tm x, Interp("*", [Int ~1, tm y])])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   177
          else fail t
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   178
      | tm (Const(@{const_name HOL.times}, T) $ x $ y) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   179
          if is_numeric_op T then Interp("*", [tm x, tm y])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   180
          else fail t
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   181
      | tm (Const(@{const_name HOL.inverse}, T) $ x) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   182
          if domain_type T = HOLogic.realT then
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   183
              Rat(1, litExp x)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   184
          else fail t
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   185
      | tm (Const(@{const_name HOL.uminus}, T) $ x) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   186
          if is_numeric_op T then Interp("*", [Int ~1, tm x])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   187
          else fail t
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   188
      | tm t = Int (lit t)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   189
               handle Match => var (t,[])
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   190
    (*translation of a formula*)
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   191
    and fm pos (Const("op &", _) $ p $ q) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   192
            Buildin("AND", [fm pos p, fm pos q])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   193
      | fm pos (Const("op |", _) $ p $ q) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   194
            Buildin("OR", [fm pos p, fm pos q])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   195
      | fm pos (Const("op -->", _) $ p $ q) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   196
            Buildin("=>", [fm (not pos) p, fm pos q])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   197
      | fm pos (Const("Not", _) $ p) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   198
            Buildin("NOT", [fm (not pos) p])
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   199
      | fm pos (Const("True", _)) = TrueExpr
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   200
      | fm pos (Const("False", _)) = FalseExpr
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   201
      | fm pos (Const("SVC_Oracle.iff_keep", _) $ p $ q) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   202
             (*polarity doesn't matter*)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   203
            Buildin("=", [fm pos p, fm pos q])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   204
      | fm pos (Const("SVC_Oracle.iff_unfold", _) $ p $ q) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   205
            Buildin("AND",   (*unfolding uses both polarities*)
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   206
                         [Buildin("=>", [fm (not pos) p, fm pos q]),
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   207
                          Buildin("=>", [fm (not pos) q, fm pos p])])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   208
      | fm pos (t as Const("op =", Type ("fun", [T,_])) $ x $ y) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   209
            let val tx = tm x and ty = tm y
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   210
                in if pos orelse T = HOLogic.realT then
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   211
                       Buildin("=", [tx, ty])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   212
                   else if is_intnat T then
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   213
                       Buildin("AND",
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   214
                                    [Buildin("<", [tx, suc ty]),
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   215
                                     Buildin("<", [ty, suc tx])])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   216
                   else fail t
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   217
            end
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   218
        (*inequalities: possible types are nat, int, real*)
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   219
      | fm pos (t as Const(@{const_name Orderings.less},  Type ("fun", [T,_])) $ x $ y) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   220
            if not pos orelse T = HOLogic.realT then
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   221
                Buildin("<", [tm x, tm y])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   222
            else if is_intnat T then
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   223
                Buildin("<=", [suc (tm x), tm y])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   224
            else fail t
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 21962
diff changeset
   225
      | fm pos (t as Const(@{const_name Orderings.less_eq},  Type ("fun", [T,_])) $ x $ y) =
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   226
            if pos orelse T = HOLogic.realT then
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   227
                Buildin("<=", [tm x, tm y])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   228
            else if is_intnat T then
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   229
                Buildin("<", [tm x, suc (tm y)])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   230
            else fail t
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   231
      | fm pos t = var(t,[]);
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   232
      (*entry point, and translation of a meta-formula*)
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   233
      fun mt pos ((c as Const("Trueprop", _)) $ p) = fm pos (iff_tag p)
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   234
        | mt pos ((c as Const("==>", _)) $ p $ q) =
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   235
            Buildin("=>", [mt (not pos) p, mt pos q])
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   236
        | mt pos t = fm pos (iff_tag t)  (*it might be a formula*)
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   237
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   238
      val body_e = mt pos body  (*evaluate now to assign into !nat_vars*)
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   239
  in
21078
101aefd61aac slight cleanup
haftmann
parents: 20853
diff changeset
   240
     fold_rev add_nat_var (!nat_vars) body_e
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   241
  end;
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   242
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   243
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   244
 (*The oracle proves the given formula t, if possible*)
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 16258
diff changeset
   245
 fun oracle thy t =
21962
279b129498b6 removed conditional combinator;
wenzelm
parents: 21820
diff changeset
   246
  (if ! trace then tracing ("SVC oracle: problem is\n" ^ Sign.string_of_term thy t) else ();
279b129498b6 removed conditional combinator;
wenzelm
parents: 21820
diff changeset
   247
   if valid (expr_of false t) then t else fail t);
12869
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   248
f362c0323d92 moved SVC stuff to ex;
wenzelm
parents:
diff changeset
   249
end;