src/HOL/SMT.thy
author boehmes
Wed, 12 May 2010 23:54:02 +0200
changeset 36898 8e55aa1306c5
child 36899 bcd6fce5bf06
permissions -rw-r--r--
integrated SMT into the HOL image
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     1
(*  Title:      HOL/SMT.thy
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     2
    Author:     Sascha Boehme, TU Muenchen
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     3
*)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     4
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     5
header {* Bindings to Satisfiability Modulo Theories (SMT) solvers *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     6
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     7
theory SMT
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     8
imports List
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     9
uses
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    10
  "~~/src/Tools/cache_io.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    11
  ("Tools/SMT/smt_additional_facts.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    12
  ("Tools/SMT/smt_monomorph.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    13
  ("Tools/SMT/smt_normalize.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    14
  ("Tools/SMT/smt_translate.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    15
  ("Tools/SMT/smt_solver.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    16
  ("Tools/SMT/smtlib_interface.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    17
  ("Tools/SMT/z3_proof_parser.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    18
  ("Tools/SMT/z3_proof_tools.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    19
  ("Tools/SMT/z3_proof_literals.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    20
  ("Tools/SMT/z3_proof_reconstruction.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    21
  ("Tools/SMT/z3_model.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    22
  ("Tools/SMT/z3_interface.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    23
  ("Tools/SMT/z3_solver.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    24
  ("Tools/SMT/cvc3_solver.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    25
  ("Tools/SMT/yices_solver.ML")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    26
begin
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    27
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    28
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    29
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    30
section {* Triggers for quantifier instantiation *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    31
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    32
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    33
Some SMT solvers support triggers for quantifier instantiation.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    34
Each trigger consists of one ore more patterns.  A pattern may either
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    35
be a list of positive subterms (the first being tagged by "pat" and
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    36
the consecutive subterms tagged by "andpat"), or a list of negative
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    37
subterms (the first being tagged by "nopat" and the consecutive
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    38
subterms tagged by "andpat").
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    39
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    40
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    41
datatype pattern = Pattern
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    42
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    43
definition pat :: "'a \<Rightarrow> pattern"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    44
where "pat _ = Pattern"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    45
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    46
definition nopat :: "'a \<Rightarrow> pattern"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    47
where "nopat _ = Pattern"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    48
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    49
definition andpat :: "pattern \<Rightarrow> 'a \<Rightarrow> pattern" (infixl "andpat" 60)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    50
where "_ andpat _ = Pattern"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    51
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    52
definition trigger :: "pattern list \<Rightarrow> bool \<Rightarrow> bool"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    53
where "trigger _ P = P"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    54
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    55
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    56
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    57
section {* Higher-order encoding *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    58
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    59
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    60
Application is made explicit for constants occurring with varying
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    61
numbers of arguments.  This is achieved by the introduction of the
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    62
following constant.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    63
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    64
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    65
definition "apply" where "apply f x = f x"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    66
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    67
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    68
Some solvers support a theory of arrays which can be used to encode
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    69
higher-order functions.  The following set of lemmas specifies the
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    70
properties of such (extensional) arrays.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    71
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    72
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    73
lemmas array_rules = ext fun_upd_apply fun_upd_same fun_upd_other
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    74
  fun_upd_upd
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    75
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    76
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    77
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    78
section {* First-order logic *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    79
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    80
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    81
Some SMT solvers require a strict separation between formulas and
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    82
terms.  When translating higher-order into first-order problems,
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    83
all uninterpreted constants (those not builtin in the target solver)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    84
are treated as function symbols in the first-order sense.  Their
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    85
occurrences as head symbols in atoms (i.e., as predicate symbols) is
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    86
turned into terms by equating such atoms with @{term True} using the
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    87
following term-level equation symbol.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    88
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    89
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    90
definition term_eq :: "bool \<Rightarrow> bool \<Rightarrow> bool" (infix "term'_eq" 50)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    91
  where "(x term_eq y) = (x = y)"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    92
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    93
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    94
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    95
section {* Setup *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    96
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    97
use "Tools/SMT/smt_monomorph.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    98
use "Tools/SMT/smt_normalize.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    99
use "Tools/SMT/smt_translate.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   100
use "Tools/SMT/smt_solver.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   101
use "Tools/SMT/smtlib_interface.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   102
use "Tools/SMT/z3_interface.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   103
use "Tools/SMT/z3_proof_parser.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   104
use "Tools/SMT/z3_proof_tools.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   105
use "Tools/SMT/z3_proof_literals.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   106
use "Tools/SMT/z3_proof_reconstruction.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   107
use "Tools/SMT/z3_model.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   108
use "Tools/SMT/z3_solver.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   109
use "Tools/SMT/cvc3_solver.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   110
use "Tools/SMT/yices_solver.ML"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   111
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   112
setup {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   113
  SMT_Solver.setup #>
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   114
  Z3_Proof_Reconstruction.setup #>
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   115
  Z3_Solver.setup #>
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   116
  CVC3_Solver.setup #>
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   117
  Yices_Solver.setup
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   118
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   119
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   120
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   121
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   122
section {* Configuration *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   123
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   124
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   125
The current configuration can be printed by the following command
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   126
(which shows the values of most options):
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   127
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   128
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   129
smt_status
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   130
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   131
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   132
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   133
subsection {* General configuration options *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   134
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   135
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   136
The option @{text smt_solver} can be used to change the target SMT
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   137
solver.  The possible values are @{text cvc3}, @{text yices}, and
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   138
@{text z3}.  It is advisable to locally install the selected solver,
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   139
although this is not necessary for @{text cvc3} and @{text z3}, which
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   140
can also be used over an Internet-based service.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   141
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   142
When using local SMT solvers, the path to their binaries should be
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   143
declared by setting the following environment variables:
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   144
@{text CVC3_SOLVER}, @{text YICES_SOLVER}, and @{text Z3_SOLVER}.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   145
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   146
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   147
declare [[ smt_solver = z3 ]]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   148
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   149
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   150
Since SMT solvers are potentially non-terminating, there is a timeout
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   151
(given in seconds) to restrict their runtime.  A value greater than
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   152
120 (seconds) is in most cases not advisable.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   153
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   154
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   155
declare [[ smt_timeout = 20 ]]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   156
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   157
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   158
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   159
subsection {* Certificates *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   160
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   161
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   162
By setting the option @{text smt_certificates} to the name of a file,
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   163
all following applications of an SMT solver a cached in that file.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   164
Any further application of the same SMT solver (using the very same
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   165
configuration) re-uses the cached certificate instead of invoking the
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   166
solver.  An empty string disables caching certificates.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   167
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   168
The filename should be given as an explicit path.  It is good
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   169
practice to use the name of the current theory (with ending
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   170
@{text ".certs"} instead of @{text ".thy"}) as the certificates file.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   171
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   172
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   173
declare [[ smt_certificates = "" ]]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   174
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   175
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   176
The option @{text smt_fixed} controls whether only stored
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   177
certificates are should be used or invocation of an SMT solver is
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   178
allowed.  When set to @{text true}, no SMT solver will ever be
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   179
invoked and only the existing certificates found in the configured
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   180
cache are used;  when set to @{text false} and there is no cached
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   181
certificate for some proposition, then the configured SMT solver is
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   182
invoked.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   183
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   184
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   185
declare [[ smt_fixed = false ]]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   186
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   187
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   188
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   189
subsection {* Tracing *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   190
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   191
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   192
For tracing the generated problem file given to the SMT solver as
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   193
well as the returned result of the solver, the option
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   194
@{text smt_trace} should be set to @{text true}.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   195
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   196
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   197
declare [[ smt_trace = false ]]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   198
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   199
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   200
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   201
subsection {* Z3-specific options *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   202
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   203
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   204
Z3 is the only SMT solver whose proofs are checked (or reconstructed)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   205
in Isabelle (all other solvers are implemented as oracles).  Enabling
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   206
or disabling proof reconstruction for Z3 is controlled by the option
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   207
@{text z3_proofs}. 
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   208
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   209
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   210
declare [[ z3_proofs = true ]]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   211
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   212
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   213
From the set of assumptions given to Z3, those assumptions used in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   214
the proof are traced when the option @{text z3_trace_assms} is set to
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   215
@{term true}.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   216
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   217
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   218
declare [[ z3_trace_assms = false ]]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   219
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   220
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   221
Z3 provides several commandline options to tweak its behaviour.  They
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   222
can be configured by writing them literally as value for the option
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   223
@{text z3_options}.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   224
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   225
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   226
declare [[ z3_options = "" ]]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   227
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   228
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   229
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   230
section {* Schematic rules for Z3 proof reconstruction *}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   231
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   232
text {*
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   233
Several prof rules of Z3 are not very well documented.  There are two
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   234
lemma groups which can turn failing Z3 proof reconstruction attempts
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   235
into succeeding ones: the facts in @{text z3_rule} are tried prior to
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   236
any implemented reconstruction procedure for all uncertain Z3 proof
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   237
rules;  the facts in @{text z3_simp} are only fed to invocations of
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   238
the simplifier when reconstructing theory-specific proof steps.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   239
*}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   240
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   241
lemmas [z3_rule] =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   242
  refl eq_commute conj_commute disj_commute simp_thms nnf_simps
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   243
  ring_distribs field_simps times_divide_eq_right times_divide_eq_left
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   244
  if_True if_False not_not
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   245
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   246
lemma [z3_rule]:
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   247
  "(P \<longrightarrow> Q) = (Q \<or> \<not>P)"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   248
  "(\<not>P \<longrightarrow> Q) = (P \<or> Q)"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   249
  "(\<not>P \<longrightarrow> Q) = (Q \<or> P)"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   250
  by auto
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   251
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   252
lemma [z3_rule]:
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   253
  "((P = Q) \<longrightarrow> R) = (R | (Q = (\<not>P)))"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   254
  by auto
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   255
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   256
lemma [z3_rule]:
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   257
  "((\<not>P) = P) = False"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   258
  "(P = (\<not>P)) = False"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   259
  "(P \<noteq> Q) = (Q = (\<not>P))"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   260
  "(P = Q) = ((\<not>P \<or> Q) \<and> (P \<or> \<not>Q))"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   261
  "(P \<noteq> Q) = ((\<not>P \<or> \<not>Q) \<and> (P \<or> Q))"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   262
  by auto
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   263
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   264
lemma [z3_rule]:
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   265
  "(if P then P else \<not>P) = True"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   266
  "(if \<not>P then \<not>P else P) = True"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   267
  "(if P then True else False) = P"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   268
  "(if P then False else True) = (\<not>P)"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   269
  "(if \<not>P then x else y) = (if P then y else x)"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   270
  by auto
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   271
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   272
lemma [z3_rule]:
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   273
  "P = Q \<or> P \<or> Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   274
  "P = Q \<or> \<not>P \<or> \<not>Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   275
  "(\<not>P) = Q \<or> \<not>P \<or> Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   276
  "(\<not>P) = Q \<or> P \<or> \<not>Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   277
  "P = (\<not>Q) \<or> \<not>P \<or> Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   278
  "P = (\<not>Q) \<or> P \<or> \<not>Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   279
  "P \<noteq> Q \<or> P \<or> \<not>Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   280
  "P \<noteq> Q \<or> \<not>P \<or> Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   281
  "P \<noteq> (\<not>Q) \<or> P \<or> Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   282
  "(\<not>P) \<noteq> Q \<or> P \<or> Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   283
  "P \<or> Q \<or> P \<noteq> (\<not>Q)"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   284
  "P \<or> Q \<or> (\<not>P) \<noteq> Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   285
  "P \<or> \<not>Q \<or> P \<noteq> Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   286
  "\<not>P \<or> Q \<or> P \<noteq> Q"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   287
  by auto
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   288
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   289
lemma [z3_rule]:
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   290
  "0 + (x::int) = x"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   291
  "x + 0 = x"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   292
  "0 * x = 0"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   293
  "1 * x = x"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   294
  "x + y = y + x"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   295
  by auto
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   296
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   297
lemma [z3_rule]:
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   298
  "0 + (x::real) = x"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   299
  "x + 0 = x"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   300
  "0 * x = 0"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   301
  "1 * x = x"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   302
  "x + y = y + x"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   303
  by auto
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   304
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   305
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   306
end