src/HOL/Tools/SMT/z3_proof_reconstruction.ML
author wenzelm
Sun, 30 Jan 2011 13:02:18 +0100
changeset 41648 6d736d983d5c
parent 41426 09615ed31f04
child 41899 83dd157ec9ab
permissions -rw-r--r--
clarified example settings for Proof General;
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/Tools/SMT/z3_proof_reconstruction.ML
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
Proof reconstruction for proofs found by Z3.
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     5
*)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     6
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     7
signature Z3_PROOF_RECONSTRUCTION =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
     8
sig
36899
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
     9
  val add_z3_rule: thm -> Context.generic -> Context.generic
40162
7f58a9a843c2 joined setup of SMT solvers in one place; turned Z3-specific options into SMT options (renamed configuration options from z3_* to smt_*); more detailed SMT exception; improved SMT filter interface
boehmes
parents: 40161
diff changeset
    10
  val reconstruct: Proof.context -> SMT_Translate.recon -> string list ->
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
    11
    int list * thm
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    12
  val setup: theory -> theory
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    13
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    14
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    15
structure Z3_Proof_Reconstruction: Z3_PROOF_RECONSTRUCTION =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    16
struct
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    17
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    18
40424
7550b2cba1cb better modularization: moved SMT configuration options and diagnostics as well as SMT failure and exception into separate structures (both of which are loaded first and consequently are available to other SMT structures)
boehmes
parents: 40274
diff changeset
    19
fun z3_exn msg = raise SMT_Failure.SMT (SMT_Failure.Other_Failure
40162
7f58a9a843c2 joined setup of SMT solvers in one place; turned Z3-specific options into SMT options (renamed configuration options from z3_* to smt_*); more detailed SMT exception; improved SMT filter interface
boehmes
parents: 40161
diff changeset
    20
  ("Z3 proof reconstruction: " ^ msg))
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    21
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    22
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    23
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
    24
(* net of schematic rules *)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    25
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    26
val z3_ruleN = "z3_rule"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    27
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    28
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    29
  val description = "declaration of Z3 proof rules"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    30
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    31
  val eq = Thm.eq_thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    32
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    33
  structure Z3_Rules = Generic_Data
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    34
  (
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    35
    type T = thm Net.net
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    36
    val empty = Net.empty
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    37
    val extend = I
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    38
    val merge = Net.merge eq
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    39
  )
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    40
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
    41
  val prep =
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
    42
    `Thm.prop_of o Simplifier.rewrite_rule [Z3_Proof_Literals.rewrite_true]
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    43
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    44
  fun ins thm net = Net.insert_term eq (prep thm) net handle Net.INSERT => net
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    45
  fun del thm net = Net.delete_term eq (prep thm) net handle Net.DELETE => net
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    46
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    47
  val add = Thm.declaration_attribute (Z3_Rules.map o ins)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    48
  val del = Thm.declaration_attribute (Z3_Rules.map o del)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    49
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    50
36899
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
    51
val add_z3_rule = Z3_Rules.map o ins
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    52
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    53
fun by_schematic_rule ctxt ct =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
    54
  the (Z3_Proof_Tools.net_instance (Z3_Rules.get (Context.Proof ctxt)) ct)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    55
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    56
val z3_rules_setup =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    57
  Attrib.setup (Binding.name z3_ruleN) (Attrib.add_del add del) description #>
39557
fe5722fce758 renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
wenzelm
parents: 39020
diff changeset
    58
  Global_Theory.add_thms_dynamic (Binding.name z3_ruleN, Net.content o Z3_Rules.get)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    59
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    60
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    61
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    62
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    63
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
    64
(* proof tools *)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    65
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    66
fun named ctxt name prover ct =
40424
7550b2cba1cb better modularization: moved SMT configuration options and diagnostics as well as SMT failure and exception into separate structures (both of which are loaded first and consequently are available to other SMT structures)
boehmes
parents: 40274
diff changeset
    67
  let val _ = SMT_Config.trace_msg ctxt I ("Z3: trying " ^ name ^ " ...")
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    68
  in prover ct end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    69
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    70
fun NAMED ctxt name tac i st =
40424
7550b2cba1cb better modularization: moved SMT configuration options and diagnostics as well as SMT failure and exception into separate structures (both of which are loaded first and consequently are available to other SMT structures)
boehmes
parents: 40274
diff changeset
    71
  let val _ = SMT_Config.trace_msg ctxt I ("Z3: trying " ^ name ^ " ...")
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    72
  in tac i st end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    73
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    74
fun pretty_goal ctxt thms t =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    75
  [Pretty.block [Pretty.str "proposition: ", Syntax.pretty_term ctxt t]]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    76
  |> not (null thms) ? cons (Pretty.big_list "assumptions:"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    77
       (map (Display.pretty_thm ctxt) thms))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    78
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    79
fun try_apply ctxt thms =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    80
  let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    81
    fun try_apply_err ct = Pretty.string_of (Pretty.chunks [
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    82
      Pretty.big_list ("Z3 found a proof," ^
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    83
        " but proof reconstruction failed at the following subgoal:")
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    84
        (pretty_goal ctxt thms (Thm.term_of ct)),
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    85
      Pretty.str ("Adding a rule to the lemma group " ^ quote z3_ruleN ^
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    86
        " might solve this problem.")])
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    87
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    88
    fun apply [] ct = error (try_apply_err ct)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    89
      | apply (prover :: provers) ct =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    90
          (case try prover ct of
40424
7550b2cba1cb better modularization: moved SMT configuration options and diagnostics as well as SMT failure and exception into separate structures (both of which are loaded first and consequently are available to other SMT structures)
boehmes
parents: 40274
diff changeset
    91
            SOME thm => (SMT_Config.trace_msg ctxt I "Z3: succeeded"; thm)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    92
          | NONE => apply provers ct)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    93
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    94
  in apply o cons (named ctxt "schematic rules" (by_schematic_rule ctxt)) end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
    95
36899
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
    96
local
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
    97
  val rewr_if =
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
    98
    @{lemma "(if P then Q1 else Q2) = ((P --> Q1) & (~P --> Q2))" by simp}
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
    99
in
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
   100
val simp_fast_tac =
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
   101
  Simplifier.simp_tac (HOL_ss addsimps [rewr_if])
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
   102
  THEN_ALL_NEW Classical.fast_tac HOL_cs
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
   103
end
bcd6fce5bf06 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable
boehmes
parents: 36898
diff changeset
   104
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   105
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   106
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   107
(* theorems and proofs *)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   108
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   109
(** theorem incarnations **)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   110
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   111
datatype theorem =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   112
  Thm of thm | (* theorem without special features *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   113
  MetaEq of thm | (* meta equality "t == s" *)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   114
  Literals of thm * Z3_Proof_Literals.littab
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   115
    (* "P1 & ... & Pn" and table of all literals P1, ..., Pn *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   116
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   117
fun thm_of (Thm thm) = thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   118
  | thm_of (MetaEq thm) = thm COMP @{thm meta_eq_to_obj_eq}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   119
  | thm_of (Literals (thm, _)) = thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   120
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   121
fun meta_eq_of (MetaEq thm) = thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   122
  | meta_eq_of p = mk_meta_eq (thm_of p)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   123
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   124
fun literals_of (Literals (_, lits)) = lits
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   125
  | literals_of p = Z3_Proof_Literals.make_littab [thm_of p]
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   126
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
(** core proof rules **)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   130
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   131
(* assumption *)
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   132
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   133
local
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   134
  val remove_trigger = mk_meta_eq @{thm SMT.trigger_def}
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   135
  val remove_weight = mk_meta_eq @{thm SMT.weight_def}
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   136
  val remove_fun_app = mk_meta_eq @{thm SMT.fun_app_def}
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   137
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   138
  fun rewrite_conv ctxt eqs = Simplifier.full_rewrite
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   139
    (Simplifier.context ctxt Simplifier.empty_ss addsimps eqs)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   140
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   141
  val prep_rules = [@{thm Let_def}, remove_trigger, remove_weight,
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   142
    remove_fun_app, Z3_Proof_Literals.rewrite_true]
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   143
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   144
  fun rewrite ctxt eqs = Conv.fconv_rule (rewrite_conv ctxt eqs)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   145
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   146
  fun burrow_snd_option f (i, thm) = Option.map (pair i) (f thm)
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   147
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   148
  fun lookup_assm assms_net ct =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   149
    Z3_Proof_Tools.net_instance' burrow_snd_option assms_net ct
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   150
    |> Option.map (fn ithm as (_, thm) => (ithm, Thm.cprop_of thm aconvc ct))
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   151
in
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   152
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   153
fun add_asserted outer_ctxt rewrite_rules assms asserted ctxt =
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   154
  let
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   155
    val eqs = map (rewrite ctxt [Z3_Proof_Literals.rewrite_true]) rewrite_rules
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   156
    val eqs' = union Thm.eq_thm eqs prep_rules
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   157
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   158
    val assms_net =
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   159
      assms
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   160
      |> map (apsnd (rewrite ctxt eqs'))
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   161
      |> map (apsnd (Conv.fconv_rule Thm.eta_conversion))
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   162
      |> Z3_Proof_Tools.thm_net_of snd 
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   163
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   164
    fun revert_conv ctxt = rewrite_conv ctxt eqs' then_conv Thm.eta_conversion
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   165
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   166
    fun assume thm ctxt =
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   167
      let
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   168
        val ct = Thm.cprem_of thm 1
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   169
        val (thm', ctxt') = yield_singleton Assumption.add_assumes ct ctxt
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   170
      in (Thm.implies_elim thm thm', ctxt') end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   171
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   172
    fun add (idx, ct) ((is, thms), (ctxt, ptab)) =
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   173
      let
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   174
        val thm1 = 
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   175
          Thm.trivial ct
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   176
          |> Conv.fconv_rule (Conv.arg1_conv (revert_conv outer_ctxt))
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   177
        val thm2 = singleton (Variable.export ctxt outer_ctxt) thm1
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   178
      in
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   179
        (case lookup_assm assms_net (Thm.cprem_of thm2 1) of
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   180
          NONE =>
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   181
            let val (thm, ctxt') = assume thm1 ctxt
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   182
            in ((is, thms), (ctxt', Inttab.update (idx, Thm thm) ptab)) end
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   183
        | SOME ((i, th), exact) =>
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   184
            let
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   185
              val (thm, ctxt') =
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   186
                if exact then (Thm.implies_elim thm1 th, ctxt)
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   187
                else assume thm1 ctxt
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   188
              val thms' = if exact then thms else th :: thms
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   189
            in 
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   190
              ((insert (op =) i is, thms'),
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   191
                (ctxt', Inttab.update (idx, Thm thm) ptab))
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   192
            end)
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   193
      end
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   194
  in fold add asserted (([], []), (ctxt, Inttab.empty)) end
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   195
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   196
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   197
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   198
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   199
(* P = Q ==> P ==> Q   or   P --> Q ==> P ==> Q *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   200
local
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   201
  val precomp = Z3_Proof_Tools.precompose2
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   202
  val comp = Z3_Proof_Tools.compose
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   203
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   204
  val meta_iffD1 = @{lemma "P == Q ==> P ==> (Q::bool)" by simp}
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   205
  val meta_iffD1_c = precomp Thm.dest_binop meta_iffD1
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   206
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   207
  val iffD1_c = precomp (Thm.dest_binop o Thm.dest_arg) @{thm iffD1}
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   208
  val mp_c = precomp (Thm.dest_binop o Thm.dest_arg) @{thm mp}
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   209
in
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   210
fun mp (MetaEq thm) p = Thm (Thm.implies_elim (comp meta_iffD1_c thm) p)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   211
  | mp p_q p = 
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   212
      let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   213
        val pq = thm_of p_q
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   214
        val thm = comp iffD1_c pq handle THM _ => comp mp_c pq
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   215
      in Thm (Thm.implies_elim thm p) end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   216
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   217
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   218
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   219
(* and_elim:     P1 & ... & Pn ==> Pi *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   220
(* not_or_elim:  ~(P1 | ... | Pn) ==> ~Pi *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   221
local
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   222
  fun is_sublit conj t = Z3_Proof_Literals.exists_lit conj (fn u => u aconv t)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   223
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   224
  fun derive conj t lits idx ptab =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   225
    let
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   226
      val lit = the (Z3_Proof_Literals.get_first_lit (is_sublit conj t) lits)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   227
      val ls = Z3_Proof_Literals.explode conj false false [t] lit
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   228
      val lits' = fold Z3_Proof_Literals.insert_lit ls
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   229
        (Z3_Proof_Literals.delete_lit lit lits)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   230
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   231
      fun upd thm = Literals (thm_of thm, lits')
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   232
      val ptab' = Inttab.map_entry idx upd ptab
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   233
    in (the (Z3_Proof_Literals.lookup_lit lits' t), ptab') end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   234
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   235
  fun lit_elim conj (p, idx) ct ptab =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   236
    let val lits = literals_of p
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   237
    in
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   238
      (case Z3_Proof_Literals.lookup_lit lits (SMT_Utils.term_of ct) of
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   239
        SOME lit => (Thm lit, ptab)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   240
      | NONE => apfst Thm (derive conj (SMT_Utils.term_of ct) lits idx ptab))
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   241
    end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   242
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   243
val and_elim = lit_elim true
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   244
val not_or_elim = lit_elim false
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   245
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   246
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   247
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   248
(* P1, ..., Pn |- False ==> |- ~P1 | ... | ~Pn *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   249
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   250
  fun step lit thm =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   251
    Thm.implies_elim (Thm.implies_intr (Thm.cprop_of lit) thm) lit
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   252
  val explode_disj = Z3_Proof_Literals.explode false false false
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   253
  fun intro hyps thm th = fold step (explode_disj hyps th) thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   254
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   255
  fun dest_ccontr ct = [Thm.dest_arg (Thm.dest_arg (Thm.dest_arg1 ct))]
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   256
  val ccontr = Z3_Proof_Tools.precompose dest_ccontr @{thm ccontr}
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   257
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   258
fun lemma thm ct =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   259
  let
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   260
    val cu = Z3_Proof_Literals.negate (Thm.dest_arg ct)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   261
    val hyps = map_filter (try HOLogic.dest_Trueprop) (#hyps (Thm.rep_thm thm))
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   262
    val th = Z3_Proof_Tools.under_assumption (intro hyps thm) cu
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   263
  in Thm (Z3_Proof_Tools.compose ccontr th) end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   264
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   265
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   266
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   267
(* \/{P1, ..., Pn, Q1, ..., Qn}, ~P1, ..., ~Pn ==> \/{Q1, ..., Qn} *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   268
local
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   269
  val explode_disj = Z3_Proof_Literals.explode false true false
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   270
  val join_disj = Z3_Proof_Literals.join false
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   271
  fun unit thm thms th =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   272
    let
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   273
      val t = @{const Not} $ SMT_Utils.prop_of thm
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   274
      val ts = map SMT_Utils.prop_of thms
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   275
    in
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   276
      join_disj (Z3_Proof_Literals.make_littab (thms @ explode_disj ts th)) t
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   277
    end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   278
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   279
  fun dest_arg2 ct = Thm.dest_arg (Thm.dest_arg ct)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   280
  fun dest ct = pairself dest_arg2 (Thm.dest_binop ct)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   281
  val contrapos =
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   282
    Z3_Proof_Tools.precompose2 dest @{lemma "(~P ==> ~Q) ==> Q ==> P" by fast}
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   283
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   284
fun unit_resolution thm thms ct =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   285
  Z3_Proof_Literals.negate (Thm.dest_arg ct)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   286
  |> Z3_Proof_Tools.under_assumption (unit thm thms)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   287
  |> Thm o Z3_Proof_Tools.discharge thm o Z3_Proof_Tools.compose contrapos
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   288
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   289
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   290
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   291
(* P ==> P == True   or   P ==> P == False *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   292
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   293
  val iff1 = @{lemma "P ==> P == (~ False)" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   294
  val iff2 = @{lemma "~P ==> P == False" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   295
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   296
fun iff_true thm = MetaEq (thm COMP iff1)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   297
fun iff_false thm = MetaEq (thm COMP iff2)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   298
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   299
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   300
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   301
(* distributivity of | over & *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   302
fun distributivity ctxt = Thm o try_apply ctxt [] [
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   303
  named ctxt "fast" (Z3_Proof_Tools.by_tac (Classical.fast_tac HOL_cs))]
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   304
    (* FIXME: not very well tested *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   305
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   306
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   307
(* Tseitin-like axioms *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   308
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   309
  val disjI1 = @{lemma "(P ==> Q) ==> ~P | Q" by fast}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   310
  val disjI2 = @{lemma "(~P ==> Q) ==> P | Q" by fast}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   311
  val disjI3 = @{lemma "(~Q ==> P) ==> P | Q" by fast}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   312
  val disjI4 = @{lemma "(Q ==> P) ==> P | ~Q" by fast}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   313
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   314
  fun prove' conj1 conj2 ct2 thm =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   315
    let
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   316
      val littab =
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   317
        Z3_Proof_Literals.explode conj1 true (conj1 <> conj2) [] thm
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   318
        |> cons Z3_Proof_Literals.true_thm
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   319
        |> Z3_Proof_Literals.make_littab
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   320
    in Z3_Proof_Literals.join conj2 littab (Thm.term_of ct2) end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   321
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   322
  fun prove rule (ct1, conj1) (ct2, conj2) =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   323
    Z3_Proof_Tools.under_assumption (prove' conj1 conj2 ct2) ct1 COMP rule
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   324
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   325
  fun prove_def_axiom ct =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   326
    let val (ct1, ct2) = Thm.dest_binop (Thm.dest_arg ct)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   327
    in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   328
      (case Thm.term_of ct1 of
40579
98ebd2300823 use the const antiquotation for constants (this checks that the constant is declared, whereas the more general term antiquotation treats undeclared names as free variable)
boehmes
parents: 40516
diff changeset
   329
        @{const Not} $ (@{const HOL.conj} $ _ $ _) =>
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   330
          prove disjI1 (Thm.dest_arg ct1, true) (ct2, true)
40579
98ebd2300823 use the const antiquotation for constants (this checks that the constant is declared, whereas the more general term antiquotation treats undeclared names as free variable)
boehmes
parents: 40516
diff changeset
   331
      | @{const HOL.conj} $ _ $ _ =>
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   332
          prove disjI3 (Z3_Proof_Literals.negate ct2, false) (ct1, true)
40579
98ebd2300823 use the const antiquotation for constants (this checks that the constant is declared, whereas the more general term antiquotation treats undeclared names as free variable)
boehmes
parents: 40516
diff changeset
   333
      | @{const Not} $ (@{const HOL.disj} $ _ $ _) =>
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   334
          prove disjI3 (Z3_Proof_Literals.negate ct2, false) (ct1, false)
40579
98ebd2300823 use the const antiquotation for constants (this checks that the constant is declared, whereas the more general term antiquotation treats undeclared names as free variable)
boehmes
parents: 40516
diff changeset
   335
      | @{const HOL.disj} $ _ $ _ =>
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   336
          prove disjI2 (Z3_Proof_Literals.negate ct1, false) (ct2, true)
40681
872b08416fb4 be more precise: only treat constant 'distinct' applied to an explicit list as built-in
boehmes
parents: 40680
diff changeset
   337
      | Const (@{const_name distinct}, _) $ _ =>
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   338
          let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   339
            fun dis_conv cv = Conv.arg_conv (Conv.arg1_conv cv)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   340
            val unfold_dis_conv = dis_conv Z3_Proof_Tools.unfold_distinct_conv
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   341
            fun prv cu =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   342
              let val (cu1, cu2) = Thm.dest_binop (Thm.dest_arg cu)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   343
              in prove disjI4 (Thm.dest_arg cu2, true) (cu1, true) end
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   344
          in Z3_Proof_Tools.with_conv unfold_dis_conv prv ct end
40681
872b08416fb4 be more precise: only treat constant 'distinct' applied to an explicit list as built-in
boehmes
parents: 40680
diff changeset
   345
      | @{const Not} $ (Const (@{const_name distinct}, _) $ _) =>
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   346
          let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   347
            fun dis_conv cv = Conv.arg_conv (Conv.arg1_conv (Conv.arg_conv cv))
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   348
            val unfold_dis_conv = dis_conv Z3_Proof_Tools.unfold_distinct_conv
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   349
            fun prv cu =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   350
              let val (cu1, cu2) = Thm.dest_binop (Thm.dest_arg cu)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   351
              in prove disjI1 (Thm.dest_arg cu1, true) (cu2, true) end
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   352
          in Z3_Proof_Tools.with_conv unfold_dis_conv prv ct end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   353
      | _ => raise CTERM ("prove_def_axiom", [ct]))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   354
    end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   355
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   356
fun def_axiom ctxt = Thm o try_apply ctxt [] [
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   357
  named ctxt "conj/disj/distinct" prove_def_axiom,
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   358
  Z3_Proof_Tools.by_abstraction (true, false) ctxt [] (fn ctxt' =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   359
    named ctxt' "simp+fast" (Z3_Proof_Tools.by_tac simp_fast_tac))]
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   360
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   361
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   362
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   363
(* local definitions *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   364
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   365
  val intro_rules = [
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   366
    @{lemma "n == P ==> (~n | P) & (n | ~P)" by simp},
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   367
    @{lemma "n == (if P then s else t) ==> (~P | n = s) & (P | n = t)"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   368
      by simp},
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   369
    @{lemma "n == P ==> n = P" by (rule meta_eq_to_obj_eq)} ]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   370
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   371
  val apply_rules = [
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   372
    @{lemma "(~n | P) & (n | ~P) ==> P == n" by (atomize(full)) fast},
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   373
    @{lemma "(~P | n = s) & (P | n = t) ==> (if P then s else t) == n"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   374
      by (atomize(full)) fastsimp} ]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   375
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   376
  val inst_rule = Z3_Proof_Tools.match_instantiate Thm.dest_arg
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   377
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   378
  fun apply_rule ct =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   379
    (case get_first (try (inst_rule ct)) intro_rules of
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   380
      SOME thm => thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   381
    | NONE => raise CTERM ("intro_def", [ct]))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   382
in
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   383
fun intro_def ct = Z3_Proof_Tools.make_hyp_def (apply_rule ct) #>> Thm
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   384
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   385
fun apply_def thm =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   386
  get_first (try (fn rule => MetaEq (thm COMP rule))) apply_rules
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   387
  |> the_default (Thm thm)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   388
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   389
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   390
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   391
(* negation normal form *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   392
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   393
  val quant_rules1 = ([
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   394
    @{lemma "(!!x. P x == Q) ==> ALL x. P x == Q" by simp},
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   395
    @{lemma "(!!x. P x == Q) ==> EX x. P x == Q" by simp}], [
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   396
    @{lemma "(!!x. P x == Q x) ==> ALL x. P x == ALL x. Q x" by simp},
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   397
    @{lemma "(!!x. P x == Q x) ==> EX x. P x == EX x. Q x" by simp}])
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   398
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   399
  val quant_rules2 = ([
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   400
    @{lemma "(!!x. ~P x == Q) ==> ~(ALL x. P x) == Q" by simp},
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   401
    @{lemma "(!!x. ~P x == Q) ==> ~(EX x. P x) == Q" by simp}], [
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   402
    @{lemma "(!!x. ~P x == Q x) ==> ~(ALL x. P x) == EX x. Q x" by simp},
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   403
    @{lemma "(!!x. ~P x == Q x) ==> ~(EX x. P x) == ALL x. Q x" by simp}])
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   404
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   405
  fun nnf_quant_tac thm (qs as (qs1, qs2)) i st = (
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   406
    Tactic.rtac thm ORELSE'
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   407
    (Tactic.match_tac qs1 THEN' nnf_quant_tac thm qs) ORELSE'
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   408
    (Tactic.match_tac qs2 THEN' nnf_quant_tac thm qs)) i st
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   409
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   410
  fun nnf_quant_tac_varified vars eq =
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   411
    nnf_quant_tac (Z3_Proof_Tools.varify vars eq)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   412
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   413
  fun nnf_quant vars qs p ct =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   414
    Z3_Proof_Tools.as_meta_eq ct
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   415
    |> Z3_Proof_Tools.by_tac (nnf_quant_tac_varified vars (meta_eq_of p) qs)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   416
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   417
  fun prove_nnf ctxt = try_apply ctxt [] [
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   418
    named ctxt "conj/disj" Z3_Proof_Literals.prove_conj_disj_eq,
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   419
    Z3_Proof_Tools.by_abstraction (true, false) ctxt [] (fn ctxt' =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   420
      named ctxt' "simp+fast" (Z3_Proof_Tools.by_tac simp_fast_tac))]
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   421
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   422
fun nnf ctxt vars ps ct =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   423
  (case SMT_Utils.term_of ct of
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   424
    _ $ (l as Const _ $ Abs _) $ (r as Const _ $ Abs _) =>
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   425
      if l aconv r
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   426
      then MetaEq (Thm.reflexive (Thm.dest_arg (Thm.dest_arg ct)))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   427
      else MetaEq (nnf_quant vars quant_rules1 (hd ps) ct)
40579
98ebd2300823 use the const antiquotation for constants (this checks that the constant is declared, whereas the more general term antiquotation treats undeclared names as free variable)
boehmes
parents: 40516
diff changeset
   428
  | _ $ (@{const Not} $ (Const _ $ Abs _)) $ (Const _ $ Abs _) =>
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   429
      MetaEq (nnf_quant vars quant_rules2 (hd ps) ct)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   430
  | _ =>
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   431
      let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   432
        val nnf_rewr_conv = Conv.arg_conv (Conv.arg_conv
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   433
          (Z3_Proof_Tools.unfold_eqs ctxt
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   434
            (map (Thm.symmetric o meta_eq_of) ps)))
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   435
      in Thm (Z3_Proof_Tools.with_conv nnf_rewr_conv (prove_nnf ctxt) ct) end)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   436
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   437
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   438
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   439
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   440
(** equality proof rules **)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   441
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   442
(* |- t = t *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   443
fun refl ct = MetaEq (Thm.reflexive (Thm.dest_arg (Thm.dest_arg ct)))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   444
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   445
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   446
(* s = t ==> t = s *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   447
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   448
  val symm_rule = @{lemma "s = t ==> t == s" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   449
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   450
fun symm (MetaEq thm) = MetaEq (Thm.symmetric thm)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   451
  | symm p = MetaEq (thm_of p COMP symm_rule)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   452
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   453
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   454
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   455
(* s = t ==> t = u ==> s = u *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   456
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   457
  val trans1 = @{lemma "s == t ==> t =  u ==> s == u" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   458
  val trans2 = @{lemma "s =  t ==> t == u ==> s == u" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   459
  val trans3 = @{lemma "s =  t ==> t =  u ==> s == u" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   460
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   461
fun trans (MetaEq thm1) (MetaEq thm2) = MetaEq (Thm.transitive thm1 thm2)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   462
  | trans (MetaEq thm) q = MetaEq (thm_of q COMP (thm COMP trans1))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   463
  | trans p (MetaEq thm) = MetaEq (thm COMP (thm_of p COMP trans2))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   464
  | trans p q = MetaEq (thm_of q COMP (thm_of p COMP trans3))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   465
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   466
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   467
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   468
(* t1 = s1 ==> ... ==> tn = sn ==> f t1 ... tn = f s1 .. sn
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   469
   (reflexive antecendents are droppped) *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   470
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   471
  exception MONO
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   472
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   473
  fun prove_refl (ct, _) = Thm.reflexive ct
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   474
  fun prove_comb f g cp =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   475
    let val ((ct1, ct2), (cu1, cu2)) = pairself Thm.dest_comb cp
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   476
    in Thm.combination (f (ct1, cu1)) (g (ct2, cu2)) end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   477
  fun prove_arg f = prove_comb prove_refl f
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   478
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   479
  fun prove f cp = prove_comb (prove f) f cp handle CTERM _ => prove_refl cp
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   480
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   481
  fun prove_nary is_comb f =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   482
    let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   483
      fun prove (cp as (ct, _)) = f cp handle MONO =>
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   484
        if is_comb (Thm.term_of ct)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   485
        then prove_comb (prove_arg prove) prove cp
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   486
        else prove_refl cp
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   487
    in prove end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   488
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   489
  fun prove_list f n cp =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   490
    if n = 0 then prove_refl cp
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   491
    else prove_comb (prove_arg f) (prove_list f (n-1)) cp
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   492
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   493
  fun with_length f (cp as (cl, _)) =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   494
    f (length (HOLogic.dest_list (Thm.term_of cl))) cp
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   495
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   496
  fun prove_distinct f = prove_arg (with_length (prove_list f))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   497
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   498
  fun prove_eq exn lookup cp =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   499
    (case lookup (Logic.mk_equals (pairself Thm.term_of cp)) of
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   500
      SOME eq => eq
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   501
    | NONE => if exn then raise MONO else prove_refl cp)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   502
  
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   503
  val prove_exn = prove_eq true
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   504
  and prove_safe = prove_eq false
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   505
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   506
  fun mono f (cp as (cl, _)) =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   507
    (case Term.head_of (Thm.term_of cl) of
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   508
      @{const HOL.conj} => prove_nary Z3_Proof_Literals.is_conj (prove_exn f)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   509
    | @{const HOL.disj} => prove_nary Z3_Proof_Literals.is_disj (prove_exn f)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   510
    | Const (@{const_name distinct}, _) => prove_distinct (prove_safe f)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   511
    | _ => prove (prove_safe f)) cp
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   512
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   513
fun monotonicity eqs ct =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   514
  let
40680
02caa72cb950 be more liberal in reconstructing congruences from Z3 (sometimes the symmetric version of a premise is needed)
boehmes
parents: 40664
diff changeset
   515
    fun and_symmetric (t, thm) = [(t, thm), (t, Thm.symmetric thm)]
02caa72cb950 be more liberal in reconstructing congruences from Z3 (sometimes the symmetric version of a premise is needed)
boehmes
parents: 40664
diff changeset
   516
    val teqs = maps (and_symmetric o `Thm.prop_of o meta_eq_of) eqs
02caa72cb950 be more liberal in reconstructing congruences from Z3 (sometimes the symmetric version of a premise is needed)
boehmes
parents: 40664
diff changeset
   517
    val lookup = AList.lookup (op aconv) teqs
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   518
    val cp = Thm.dest_binop (Thm.dest_arg ct)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   519
  in MetaEq (prove_exn lookup cp handle MONO => mono lookup cp) end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   520
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   521
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   522
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   523
(* |- f a b = f b a (where f is equality) *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   524
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   525
  val rule = @{lemma "a = b == b = a" by (atomize(full)) (rule eq_commute)}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   526
in
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   527
fun commutativity ct =
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   528
  MetaEq (Z3_Proof_Tools.match_instantiate I
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   529
    (Z3_Proof_Tools.as_meta_eq ct) rule)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   530
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   531
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   532
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   533
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   534
(** quantifier proof rules **)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   535
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   536
(* P ?x = Q ?x ==> (ALL x. P x) = (ALL x. Q x)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   537
   P ?x = Q ?x ==> (EX x. P x) = (EX x. Q x)    *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   538
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   539
  val rules = [
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   540
    @{lemma "(!!x. P x == Q x) ==> (ALL x. P x) == (ALL x. Q x)" by simp},
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   541
    @{lemma "(!!x. P x == Q x) ==> (EX x. P x) == (EX x. Q x)" by simp}]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   542
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   543
fun quant_intro vars p ct =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   544
  let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   545
    val thm = meta_eq_of p
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   546
    val rules' = Z3_Proof_Tools.varify vars thm :: rules
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   547
    val cu = Z3_Proof_Tools.as_meta_eq ct
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   548
    val tac = REPEAT_ALL_NEW (Tactic.match_tac rules')
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   549
  in MetaEq (Z3_Proof_Tools.by_tac tac cu) end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   550
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   551
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   552
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   553
(* |- ((ALL x. P x) | Q) = (ALL x. P x | Q) *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   554
fun pull_quant ctxt = Thm o try_apply ctxt [] [
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   555
  named ctxt "fast" (Z3_Proof_Tools.by_tac (Classical.fast_tac HOL_cs))]
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   556
    (* FIXME: not very well tested *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   557
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   558
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   559
(* |- (ALL x. P x & Q x) = ((ALL x. P x) & (ALL x. Q x)) *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   560
fun push_quant ctxt = Thm o try_apply ctxt [] [
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   561
  named ctxt "fast" (Z3_Proof_Tools.by_tac (Classical.fast_tac HOL_cs))]
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   562
    (* FIXME: not very well tested *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   563
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   564
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   565
(* |- (ALL x1 ... xn y1 ... yn. P x1 ... xn) = (ALL x1 ... xn. P x1 ... xn) *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   566
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   567
  val elim_all = @{lemma "(ALL x. P) == P" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   568
  val elim_ex = @{lemma "(EX x. P) == P" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   569
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   570
  fun elim_unused_conv ctxt =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   571
    Conv.params_conv ~1 (K (Conv.arg_conv (Conv.arg1_conv
36936
c52d1c130898 incorporated further conversions and conversionals, after some minor tuning;
wenzelm
parents: 36899
diff changeset
   572
      (Conv.rewrs_conv [elim_all, elim_ex])))) ctxt
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   573
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   574
  fun elim_unused_tac ctxt =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   575
    REPEAT_ALL_NEW (
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   576
      Tactic.match_tac [@{thm refl}, @{thm iff_allI}, @{thm iff_exI}]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   577
      ORELSE' CONVERSION (elim_unused_conv ctxt))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   578
in
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   579
fun elim_unused_vars ctxt = Thm o Z3_Proof_Tools.by_tac (elim_unused_tac ctxt)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   580
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   581
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   582
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   583
(* |- (ALL x1 ... xn. ~(x1 = t1 & ... xn = tn) | P x1 ... xn) = P t1 ... tn *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   584
fun dest_eq_res ctxt = Thm o try_apply ctxt [] [
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   585
  named ctxt "fast" (Z3_Proof_Tools.by_tac (Classical.fast_tac HOL_cs))]
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   586
    (* FIXME: not very well tested *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   587
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   588
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   589
(* |- ~(ALL x1...xn. P x1...xn) | P a1...an *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   590
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   591
  val rule = @{lemma "~ P x | Q ==> ~(ALL x. P x) | Q" by fast}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   592
in
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   593
val quant_inst = Thm o Z3_Proof_Tools.by_tac (
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   594
  REPEAT_ALL_NEW (Tactic.match_tac [rule])
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   595
  THEN' Tactic.rtac @{thm excluded_middle})
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   596
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   597
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   598
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   599
(* c = SOME x. P x |- (EX x. P x) = P c
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   600
   c = SOME x. ~ P x |- ~(ALL x. P x) = ~ P c *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   601
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   602
  val elim_ex = @{lemma "EX x. P == P" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   603
  val elim_all = @{lemma "~ (ALL x. P) == ~P" by simp}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   604
  val sk_ex = @{lemma "c == SOME x. P x ==> EX x. P x == P c"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   605
    by simp (intro eq_reflection some_eq_ex[symmetric])}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   606
  val sk_all = @{lemma "c == SOME x. ~ P x ==> ~(ALL x. P x) == ~ P c"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   607
    by (simp only: not_all) (intro eq_reflection some_eq_ex[symmetric])}
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   608
  val sk_ex_rule = ((sk_ex, I), elim_ex)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   609
  and sk_all_rule = ((sk_all, Thm.dest_arg), elim_all)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   610
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   611
  fun dest f sk_rule = 
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   612
    Thm.dest_comb (f (Thm.dest_arg (Thm.dest_arg (Thm.cprop_of sk_rule))))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   613
  fun type_of f sk_rule = Thm.ctyp_of_term (snd (dest f sk_rule))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   614
  fun pair2 (a, b) (c, d) = [(a, c), (b, d)]
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   615
  fun inst_sk (sk_rule, f) p c =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   616
    Thm.instantiate ([(type_of f sk_rule, Thm.ctyp_of_term c)], []) sk_rule
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   617
    |> (fn sk' => Thm.instantiate ([], (pair2 (dest f sk') (p, c))) sk')
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   618
    |> Conv.fconv_rule (Thm.beta_conversion true)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   619
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   620
  fun kind (Const (@{const_name Ex}, _) $ _) = (sk_ex_rule, I, I)
40579
98ebd2300823 use the const antiquotation for constants (this checks that the constant is declared, whereas the more general term antiquotation treats undeclared names as free variable)
boehmes
parents: 40516
diff changeset
   621
    | kind (@{const Not} $ (Const (@{const_name All}, _) $ _)) =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   622
        (sk_all_rule, Thm.dest_arg, Z3_Proof_Literals.negate)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   623
    | kind t = raise TERM ("skolemize", [t])
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   624
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   625
  fun dest_abs_type (Abs (_, T, _)) = T
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   626
    | dest_abs_type t = raise TERM ("dest_abs_type", [t])
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   627
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   628
  fun bodies_of thy lhs rhs =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   629
    let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   630
      val (rule, dest, make) = kind (Thm.term_of lhs)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   631
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   632
      fun dest_body idx cbs ct =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   633
        let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   634
          val cb = Thm.dest_arg (dest ct)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   635
          val T = dest_abs_type (Thm.term_of cb)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   636
          val cv = Thm.cterm_of thy (Var (("x", idx), T))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   637
          val cu = make (Drule.beta_conv cb cv)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   638
          val cbs' = (cv, cb) :: cbs
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   639
        in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   640
          (snd (Thm.first_order_match (cu, rhs)), rev cbs')
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   641
          handle Pattern.MATCH => dest_body (idx+1) cbs' cu
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   642
        end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   643
    in (rule, dest_body 1 [] lhs) end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   644
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   645
  fun transitive f thm = Thm.transitive thm (f (Thm.rhs_of thm))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   646
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   647
  fun sk_step (rule, elim) (cv, mct, cb) ((is, thm), ctxt) =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   648
    (case mct of
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   649
      SOME ct =>
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   650
        ctxt
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   651
        |> Z3_Proof_Tools.make_hyp_def
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   652
             (inst_sk rule (Thm.instantiate_cterm ([], is) cb) ct)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   653
        |>> pair ((cv, ct) :: is) o Thm.transitive thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   654
    | NONE => ((is, transitive (Conv.rewr_conv elim) thm), ctxt))
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   655
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   656
fun skolemize ct ctxt =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   657
  let
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   658
    val (lhs, rhs) = Thm.dest_binop (Thm.dest_arg ct)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   659
    val (rule, (ctab, cbs)) = bodies_of (ProofContext.theory_of ctxt) lhs rhs
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   660
    fun lookup_var (cv, cb) = (cv, AList.lookup (op aconvc) ctab cv, cb)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   661
  in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   662
    (([], Thm.reflexive lhs), ctxt)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   663
    |> fold (sk_step rule) (map lookup_var cbs)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   664
    |>> MetaEq o snd
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   665
  end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   666
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   667
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   668
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   669
(** theory proof rules **)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   670
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   671
(* theory lemmas: linear arithmetic, arrays *)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   672
fun th_lemma ctxt simpset thms = Thm o try_apply ctxt thms [
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   673
  Z3_Proof_Tools.by_abstraction (false, true) ctxt thms (fn ctxt' =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   674
    Z3_Proof_Tools.by_tac (
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   675
      NAMED ctxt' "arith" (Arith_Data.arith_tac ctxt')
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   676
      ORELSE' NAMED ctxt' "simp+arith" (
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   677
        Simplifier.simp_tac simpset
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   678
        THEN_ALL_NEW Arith_Data.arith_tac ctxt')))]
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   679
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   680
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   681
(* rewriting: prove equalities:
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   682
     * ACI of conjunction/disjunction
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   683
     * contradiction, excluded middle
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   684
     * logical rewriting rules (for negation, implication, equivalence,
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   685
         distinct)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   686
     * normal forms for polynoms (integer/real arithmetic)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   687
     * quantifier elimination over linear arithmetic
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   688
     * ... ? **)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   689
structure Z3_Simps = Named_Thms
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   690
(
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   691
  val name = "z3_simp"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   692
  val description = "simplification rules for Z3 proof reconstruction"
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   693
)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   694
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   695
local
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   696
  fun spec_meta_eq_of thm =
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   697
    (case try (fn th => th RS @{thm spec}) thm of
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   698
      SOME thm' => spec_meta_eq_of thm'
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   699
    | NONE => mk_meta_eq thm)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   700
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   701
  fun prep (Thm thm) = spec_meta_eq_of thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   702
    | prep (MetaEq thm) = thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   703
    | prep (Literals (thm, _)) = spec_meta_eq_of thm
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   704
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   705
  fun unfold_conv ctxt ths =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   706
    Conv.arg_conv (Conv.binop_conv (Z3_Proof_Tools.unfold_eqs ctxt
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   707
      (map prep ths)))
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   708
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   709
  fun with_conv _ [] prv = prv
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   710
    | with_conv ctxt ths prv =
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   711
        Z3_Proof_Tools.with_conv (unfold_conv ctxt ths) prv
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   712
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   713
  val unfold_conv =
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   714
    Conv.arg_conv (Conv.binop_conv
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   715
      (Conv.try_conv Z3_Proof_Tools.unfold_distinct_conv))
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   716
  val prove_conj_disj_eq =
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   717
    Z3_Proof_Tools.with_conv unfold_conv Z3_Proof_Literals.prove_conj_disj_eq
40663
e080c9e68752 share and use more utility functions;
boehmes
parents: 40662
diff changeset
   718
e080c9e68752 share and use more utility functions;
boehmes
parents: 40662
diff changeset
   719
  fun assume_prems ctxt thm =
e080c9e68752 share and use more utility functions;
boehmes
parents: 40662
diff changeset
   720
    Assumption.add_assumes (Drule.cprems_of thm) ctxt
e080c9e68752 share and use more utility functions;
boehmes
parents: 40662
diff changeset
   721
    |>> (fn thms => fold Thm.elim_implies thms thm)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   722
in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   723
40663
e080c9e68752 share and use more utility functions;
boehmes
parents: 40662
diff changeset
   724
fun rewrite simpset ths ct ctxt =
e080c9e68752 share and use more utility functions;
boehmes
parents: 40662
diff changeset
   725
  apfst Thm (assume_prems ctxt (with_conv ctxt ths (try_apply ctxt [] [
e080c9e68752 share and use more utility functions;
boehmes
parents: 40662
diff changeset
   726
    named ctxt "conj/disj/distinct" prove_conj_disj_eq,
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   727
    Z3_Proof_Tools.by_abstraction (true, false) ctxt [] (fn ctxt' =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   728
      Z3_Proof_Tools.by_tac (
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   729
        NAMED ctxt' "simp (logic)" (Simplifier.simp_tac simpset)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   730
        THEN_ALL_NEW NAMED ctxt' "fast (logic)" (Classical.fast_tac HOL_cs))),
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   731
    Z3_Proof_Tools.by_abstraction (false, true) ctxt [] (fn ctxt' =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   732
      Z3_Proof_Tools.by_tac (
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   733
        NAMED ctxt' "simp (theory)" (Simplifier.simp_tac simpset)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   734
        THEN_ALL_NEW (
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   735
          NAMED ctxt' "fast (theory)" (Classical.fast_tac HOL_cs)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   736
          ORELSE' NAMED ctxt' "arith (theory)" (Arith_Data.arith_tac ctxt')))),
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   737
    Z3_Proof_Tools.by_abstraction (true, true) ctxt [] (fn ctxt' =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   738
      Z3_Proof_Tools.by_tac (
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   739
        NAMED ctxt' "simp (full)" (Simplifier.simp_tac simpset)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   740
        THEN_ALL_NEW (
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   741
          NAMED ctxt' "fast (full)" (Classical.fast_tac HOL_cs)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   742
          ORELSE' NAMED ctxt' "arith (full)" (Arith_Data.arith_tac ctxt')))),
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   743
    named ctxt "injectivity" (Z3_Proof_Methods.prove_injectivity ctxt)]) ct))
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   744
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   745
end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   746
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   747
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   748
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   749
(* proof reconstruction *)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   750
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   751
(** tracing and checking **)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   752
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   753
fun trace_before ctxt idx = SMT_Config.trace_msg ctxt (fn r =>
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   754
  "Z3: #" ^ string_of_int idx ^ ": " ^ Z3_Proof_Parser.string_of_rule r)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   755
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   756
fun check_after idx r ps ct (p, (ctxt, _)) =
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   757
  if not (Config.get ctxt SMT_Config.trace) then ()
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   758
  else
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   759
    let val thm = thm_of p |> tap (Thm.join_proofs o single)
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   760
    in
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   761
      if (Thm.cprop_of thm) aconvc ct then ()
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   762
      else
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   763
        z3_exn (Pretty.string_of (Pretty.big_list
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   764
          ("proof step failed: " ^ quote (Z3_Proof_Parser.string_of_rule r) ^
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   765
            " (#" ^ string_of_int idx ^ ")")
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   766
          (pretty_goal ctxt (map (thm_of o fst) ps) (Thm.prop_of thm) @
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   767
            [Pretty.block [Pretty.str "expected: ",
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   768
              Syntax.pretty_term ctxt (Thm.term_of ct)]])))
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   769
    end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   770
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   771
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   772
(** overall reconstruction procedure **)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   773
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   774
local
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   775
  fun not_supported r = raise Fail ("Z3: proof rule not implemented: " ^
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   776
    quote (Z3_Proof_Parser.string_of_rule r))
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   777
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   778
  fun prove_step simpset vars r ps ct (cxp as (cx, ptab)) =
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   779
    (case (r, ps) of
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   780
      (* core rules *)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   781
      (Z3_Proof_Parser.True_Axiom, _) => (Thm Z3_Proof_Literals.true_thm, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   782
    | (Z3_Proof_Parser.Asserted, _) => raise Fail "bad assertion"
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   783
    | (Z3_Proof_Parser.Goal, _) => raise Fail "bad assertion"
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   784
    | (Z3_Proof_Parser.Modus_Ponens, [(p, _), (q, _)]) =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   785
        (mp q (thm_of p), cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   786
    | (Z3_Proof_Parser.Modus_Ponens_Oeq, [(p, _), (q, _)]) =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   787
        (mp q (thm_of p), cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   788
    | (Z3_Proof_Parser.And_Elim, [(p, i)]) =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   789
        and_elim (p, i) ct ptab ||> pair cx
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   790
    | (Z3_Proof_Parser.Not_Or_Elim, [(p, i)]) =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   791
        not_or_elim (p, i) ct ptab ||> pair cx
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   792
    | (Z3_Proof_Parser.Hypothesis, _) => (Thm (Thm.assume ct), cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   793
    | (Z3_Proof_Parser.Lemma, [(p, _)]) => (lemma (thm_of p) ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   794
    | (Z3_Proof_Parser.Unit_Resolution, (p, _) :: ps) =>
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   795
        (unit_resolution (thm_of p) (map (thm_of o fst) ps) ct, cxp)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   796
    | (Z3_Proof_Parser.Iff_True, [(p, _)]) => (iff_true (thm_of p), cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   797
    | (Z3_Proof_Parser.Iff_False, [(p, _)]) => (iff_false (thm_of p), cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   798
    | (Z3_Proof_Parser.Distributivity, _) => (distributivity cx ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   799
    | (Z3_Proof_Parser.Def_Axiom, _) => (def_axiom cx ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   800
    | (Z3_Proof_Parser.Intro_Def, _) => intro_def ct cx ||> rpair ptab
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   801
    | (Z3_Proof_Parser.Apply_Def, [(p, _)]) => (apply_def (thm_of p), cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   802
    | (Z3_Proof_Parser.Iff_Oeq, [(p, _)]) => (p, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   803
    | (Z3_Proof_Parser.Nnf_Pos, _) => (nnf cx vars (map fst ps) ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   804
    | (Z3_Proof_Parser.Nnf_Neg, _) => (nnf cx vars (map fst ps) ct, cxp)
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   805
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   806
      (* equality rules *)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   807
    | (Z3_Proof_Parser.Reflexivity, _) => (refl ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   808
    | (Z3_Proof_Parser.Symmetry, [(p, _)]) => (symm p, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   809
    | (Z3_Proof_Parser.Transitivity, [(p, _), (q, _)]) => (trans p q, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   810
    | (Z3_Proof_Parser.Monotonicity, _) => (monotonicity (map fst ps) ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   811
    | (Z3_Proof_Parser.Commutativity, _) => (commutativity ct, cxp)
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   812
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   813
      (* quantifier rules *)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   814
    | (Z3_Proof_Parser.Quant_Intro, [(p, _)]) => (quant_intro vars p ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   815
    | (Z3_Proof_Parser.Pull_Quant, _) => (pull_quant cx ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   816
    | (Z3_Proof_Parser.Push_Quant, _) => (push_quant cx ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   817
    | (Z3_Proof_Parser.Elim_Unused_Vars, _) => (elim_unused_vars cx ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   818
    | (Z3_Proof_Parser.Dest_Eq_Res, _) => (dest_eq_res cx ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   819
    | (Z3_Proof_Parser.Quant_Inst, _) => (quant_inst ct, cxp)
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   820
    | (Z3_Proof_Parser.Skolemize, _) => skolemize ct cx ||> rpair ptab
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   821
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   822
      (* theory rules *)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   823
    | (Z3_Proof_Parser.Th_Lemma _, _) =>  (* FIXME: use arguments *)
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   824
        (th_lemma cx simpset (map (thm_of o fst) ps) ct, cxp)
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   825
    | (Z3_Proof_Parser.Rewrite, _) => rewrite simpset [] ct cx ||> rpair ptab
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   826
    | (Z3_Proof_Parser.Rewrite_Star, ps) =>
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   827
        rewrite simpset (map fst ps) ct cx ||> rpair ptab
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   828
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   829
    | (Z3_Proof_Parser.Nnf_Star, _) => not_supported r
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   830
    | (Z3_Proof_Parser.Cnf_Star, _) => not_supported r
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   831
    | (Z3_Proof_Parser.Transitivity_Star, _) => not_supported r
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   832
    | (Z3_Proof_Parser.Pull_Quant_Star, _) => not_supported r
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   833
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   834
    | _ => raise Fail ("Z3: proof rule " ^
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   835
        quote (Z3_Proof_Parser.string_of_rule r) ^
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   836
        " has an unexpected number of arguments."))
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   837
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   838
  fun lookup_proof ptab idx =
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   839
    (case Inttab.lookup ptab idx of
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   840
      SOME p => (p, idx)
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   841
    | NONE => z3_exn ("unknown proof id: " ^ quote (string_of_int idx)))
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   842
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   843
  fun prove simpset vars (idx, step) (_, cxp as (ctxt, ptab)) =
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   844
    let
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   845
      val Z3_Proof_Parser.Proof_Step {rule=r, prems, prop, ...} = step
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   846
      val ps = map (lookup_proof ptab) prems
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   847
      val _ = trace_before ctxt idx r
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   848
      val (thm, (ctxt', ptab')) =
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   849
        cxp
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   850
        |> prove_step simpset vars r ps prop
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   851
        |> tap (check_after idx r ps prop)
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   852
    in (thm, (ctxt', Inttab.update (idx, thm) ptab')) end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   853
41426
09615ed31f04 re-implemented support for datatypes (including records and typedefs);
boehmes
parents: 41328
diff changeset
   854
  val disch_rules = [@{thm allI}, @{thm refl}, @{thm reflexive},
09615ed31f04 re-implemented support for datatypes (including records and typedefs);
boehmes
parents: 41328
diff changeset
   855
    Z3_Proof_Literals.true_thm]
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   856
  fun all_disch_rules rules = map (pair false) (disch_rules @ rules)
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   857
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   858
  fun disch_assm rules thm =
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   859
    if Thm.nprems_of thm = 0 then Drule.flexflex_unique thm
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   860
    else
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   861
      (case Seq.pull (Thm.biresolution false rules 1 thm) of
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   862
        SOME (thm', _) => disch_assm rules thm'
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   863
      | NONE => raise THM ("failed to discharge premise", 1, [thm]))
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   864
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   865
  fun discharge rules outer_ctxt (p, (inner_ctxt, _)) =
41130
130771a48c70 adapted the Z3 proof parser to recent changes in Z3's proof format;
boehmes
parents: 41127
diff changeset
   866
    thm_of p
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   867
    |> singleton (ProofContext.export inner_ctxt outer_ctxt)
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   868
    |> disch_assm rules
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   869
in
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   870
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   871
fun reconstruct outer_ctxt recon output =
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   872
  let
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   873
    val {context=ctxt, typs, terms, rewrite_rules, assms} = recon
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   874
    val (asserted, steps, vars, ctxt1) =
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   875
      Z3_Proof_Parser.parse ctxt typs terms output
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   876
41328
6792a5c92a58 avoid ML structure aliases (especially single-letter abbreviations)
boehmes
parents: 41172
diff changeset
   877
    val simpset = Z3_Proof_Tools.make_simpset ctxt1 (Z3_Simps.get ctxt1)
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   878
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   879
    val ((is, rules), cxp as (ctxt2, _)) =
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   880
      add_asserted outer_ctxt rewrite_rules assms asserted ctxt1
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   881
  in
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   882
    if Config.get ctxt2 SMT_Config.filter_only_facts then (is, @{thm TrueI})
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   883
    else
41131
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   884
      (Thm @{thm TrueI}, cxp)
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   885
      |> fold (prove simpset vars) steps 
fc9d503c3d67 fixed proof reconstruction for lambda-lifted problems (which broke when the lambda-lifting code was changed to operate on terms instead of on theorems)
boehmes
parents: 41130
diff changeset
   886
      |> discharge (all_disch_rules rules) outer_ctxt
41127
2ea84c8535c6 re-implemented eta-expansion, lambda-lifting, and explicit application on terms (exploiting the control over the term structure);
boehmes
parents: 40681
diff changeset
   887
      |> pair []
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   888
  end
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   889
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   890
end
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   891
40164
57f5db2a48a3 added a mode to only filter assumptions used in a Z3 proof (in which no proof reconstruction is performed)
boehmes
parents: 40162
diff changeset
   892
val setup = z3_rules_setup #> Z3_Simps.setup
36898
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   893
8e55aa1306c5 integrated SMT into the HOL image
boehmes
parents:
diff changeset
   894
end