src/HOL/Tools/SMT/verit_proof.ML
author desharna
Wed, 18 Nov 2020 13:44:34 +0100
changeset 72641 4eea17b3ac58
parent 72513 75f5c63f6cfa
child 72908 6a26a955308e
permissions -rw-r--r--
Tuned parentheses in TPTP output
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
     1
(*  Title:      HOL/Tools/SMT/Verit_Proof.ML
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
     2
    Author:     Mathias Fleury, ENS Rennes
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
     3
    Author:     Sascha Boehme, TU Muenchen
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
     4
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
     5
VeriT proofs: parsing and abstract syntax tree.
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
     6
*)
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
     7
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
     8
signature VERIT_PROOF =
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
     9
sig
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    10
  (*proofs*)
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    11
  datatype veriT_step = VeriT_Step of {
57712
3c4e6bc7455f Simplifying the labels in the proof of the SMT solver veriT.
fleury
parents: 57710
diff changeset
    12
    id: string,
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    13
    rule: string,
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    14
    prems: string list,
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    15
    proof_ctxt: term list,
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    16
    concl: term,
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    17
    fixes: string list}
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    18
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    19
  datatype veriT_replay_node = VeriT_Replay_Node of {
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    20
    id: string,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    21
    rule: string,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    22
    args: term list,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    23
    prems: string list,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    24
    proof_ctxt: term list,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    25
    concl: term,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    26
    bounds: (string * typ) list,
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    27
    declarations: (string * term) list,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    28
    insts: term Symtab.table,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    29
    subproof: (string * typ) list * term list * term list * veriT_replay_node list}
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    30
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    31
  (*proof parser*)
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    32
  val parse: typ Symtab.table -> term Symtab.table -> string list ->
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    33
    Proof.context -> veriT_step list * Proof.context
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    34
  val parse_replay: typ Symtab.table -> term Symtab.table -> string list ->
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
    35
    Proof.context -> veriT_replay_node list * Proof.context
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    36
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    37
  val step_prefix : string
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    38
  val input_rule: string
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    39
  val keep_app_symbols: string -> bool
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    40
  val keep_raw_lifting: string -> bool
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    41
  val normalized_input_rule: string
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    42
  val la_generic_rule : string
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    43
  val rewrite_rule : string
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    44
  val simp_arith_rule : string
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    45
  val veriT_deep_skolemize_rule : string
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    46
  val veriT_def : string
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    47
  val subproof_rule : string
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    48
  val local_input_rule : string
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
    49
  val not_not_rule : string
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
    50
  val contract_rule : string
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
    51
  val ite_intro_rule : string
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
    52
  val eq_congruent_rule : string
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
    53
  val eq_congruent_pred_rule : string
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
    54
  val skolemization_steps : string list
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    55
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
    56
  val is_skolemization: string -> bool
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
    57
  val is_skolemization_step: veriT_replay_node -> bool
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    58
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    59
  val number_of_steps: veriT_replay_node list -> int
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    60
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    61
  (*Strategy related*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    62
  val veriT_strategy : string Config.T
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    63
  val veriT_current_strategy : Context.generic -> string list
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    64
  val all_veriT_stgies: Context.generic -> string list;
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    65
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    66
  val select_veriT_stgy: string -> Context.generic -> Context.generic;
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    67
  val valid_veriT_stgy: string -> Context.generic -> bool;
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    68
  val verit_add_stgy: string * string list -> Context.generic -> Context.generic
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    69
  val verit_rm_stgy: string -> Context.generic -> Context.generic
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    70
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    71
  (*Global tactic*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    72
  val verit_tac: Proof.context -> thm list -> int -> tactic
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    73
  val verit_tac_stgy: string -> Proof.context -> thm list -> int -> tactic
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    74
end;
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    75
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    76
structure Verit_Proof: VERIT_PROOF =
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    77
struct
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    78
58061
3d060f43accb renamed new SMT module from 'SMT2' to 'SMT'
blanchet
parents: 57762
diff changeset
    79
open SMTLIB_Proof
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
    80
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    81
val veriT_strategy_default_name = "default"; (*FUDGE*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    82
val veriT_strategy_del_insts_name = "del_insts"; (*FUDGE*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    83
val veriT_strategy_rm_insts_name = "ccfv_SIG"; (*FUDGE*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    84
val veriT_strategy_ccfv_insts_name = "ccfv_threshold"; (*FUDGE*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    85
val veriT_strategy_best_name = "best"; (*FUDGE*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    86
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    87
val veriT_strategy_best = ["--index-sorts", "--index-fresh-sorts", "--triggers-new",
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    88
  "--triggers-sel-rm-specific"];
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    89
val veriT_strategy_del_insts = ["--index-sorts", "--index-fresh-sorts", "--ccfv-breadth",
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    90
  "--inst-deletion", "--index-SAT-triggers", "--inst-deletion-loops", "--inst-deletion-track-vars",
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    91
  "--inst-deletion", "--index-SAT-triggers"];
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    92
val veriT_strategy_rm_insts = ["--index-SIG", "--triggers-new", "--triggers-sel-rm-specific"];
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    93
val veriT_strategy_ccfv_insts = ["--index-sorts", "--index-fresh-sorts", "--triggers-new",
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    94
  "--triggers-sel-rm-specific", "--triggers-restrict-combine", "--inst-deletion",
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    95
  "--index-SAT-triggers", "--inst-deletion-loops", "--inst-deletion-track-vars", "--inst-deletion",
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    96
  "--index-SAT-triggers", "--inst-sorts-threshold=100000", "--ematch-exp=10000000",
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    97
  "--ccfv-index=100000", "--ccfv-index-full=1000"]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    98
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
    99
val veriT_strategy_default = [];
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   100
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   101
type verit_strategy = {default_strategy: string, strategies: (string * string list) list}
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   102
fun mk_verit_strategy default_strategy strategies : verit_strategy = {default_strategy=default_strategy,strategies=strategies}
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   103
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   104
val empty_data = mk_verit_strategy veriT_strategy_best_name
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   105
  [(veriT_strategy_default_name, veriT_strategy_default),
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   106
   (veriT_strategy_del_insts_name, veriT_strategy_del_insts),
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   107
   (veriT_strategy_rm_insts_name, veriT_strategy_rm_insts),
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   108
   (veriT_strategy_ccfv_insts_name, veriT_strategy_ccfv_insts),
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   109
   (veriT_strategy_best_name, veriT_strategy_best)]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   110
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   111
fun merge_data ({strategies=strategies1,...}:verit_strategy,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   112
    {default_strategy,strategies=strategies2}:verit_strategy) : verit_strategy =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   113
  mk_verit_strategy default_strategy (AList.merge (op =) (op =) (strategies1, strategies2))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   114
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   115
structure Data = Generic_Data
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   116
(
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   117
  type T = verit_strategy
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   118
  val empty = empty_data
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   119
  val extend = I
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   120
  val merge = merge_data
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   121
)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   122
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   123
fun veriT_current_strategy ctxt =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   124
  let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   125
    val {default_strategy,strategies} = (Data.get ctxt)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   126
  in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   127
    AList.lookup (op=) strategies default_strategy
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   128
   |> the
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   129
  end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   130
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   131
val veriT_strategy = Attrib.setup_config_string \<^binding>\<open>smt_verit_strategy\<close> (K veriT_strategy_best_name);
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   132
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   133
fun valid_veriT_stgy stgy context =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   134
  let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   135
    val {strategies,...} = Data.get context
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   136
  in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   137
    AList.defined (op =) strategies stgy
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   138
  end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   139
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   140
fun select_veriT_stgy stgy context =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   141
  let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   142
    val {strategies,...} = Data.get context
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   143
    val upd = Data.map (K (mk_verit_strategy stgy strategies))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   144
  in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   145
    if not (AList.defined (op =) strategies stgy) then
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   146
      error ("Trying to select unknown veriT strategy: " ^ quote stgy)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   147
    else upd context
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   148
  end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   149
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   150
fun verit_add_stgy stgy context =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   151
  let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   152
    val {default_strategy,strategies} = Data.get context
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   153
  in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   154
    Data.map 
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   155
      (K (mk_verit_strategy default_strategy (AList.update (op =) stgy strategies)))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   156
      context
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   157
  end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   158
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   159
fun verit_rm_stgy stgy context =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   160
  let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   161
    val {default_strategy,strategies} = Data.get context
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   162
  in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   163
    Data.map 
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   164
      (K (mk_verit_strategy default_strategy (AList.delete (op =) stgy strategies)))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   165
      context
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   166
  end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   167
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   168
fun all_veriT_stgies context =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   169
  let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   170
    val {strategies,...} = Data.get context
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   171
   in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   172
    map fst strategies
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   173
  end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   174
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   175
fun verit_tac ctxt = SMT_Solver.smt_tac (Context.proof_map (SMT_Config.select_solver "verit") ctxt)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   176
fun verit_tac_stgy stgy ctxt = verit_tac (Context.proof_of (select_veriT_stgy stgy (Context.Proof ctxt)))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   177
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   178
datatype raw_veriT_node = Raw_VeriT_Node of {
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   179
  id: string,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   180
  rule: string,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   181
  args: SMTLIB.tree,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   182
  prems: string list,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   183
  concl: SMTLIB.tree,
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   184
  declarations: (string * SMTLIB.tree) list,
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   185
  subproof: raw_veriT_node list}
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   186
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   187
fun mk_raw_node id rule args prems declarations concl subproof =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   188
  Raw_VeriT_Node {id = id, rule = rule, args = args, prems = prems, declarations = declarations,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   189
    concl = concl, subproof = subproof}
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   190
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   191
datatype veriT_node = VeriT_Node of {
57712
3c4e6bc7455f Simplifying the labels in the proof of the SMT solver veriT.
fleury
parents: 57710
diff changeset
   192
  id: string,
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   193
  rule: string,
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   194
  prems: string list,
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   195
  proof_ctxt: term list,
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   196
  concl: term}
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   197
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   198
fun mk_node id rule prems proof_ctxt concl =
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   199
  VeriT_Node {id = id, rule = rule, prems = prems, proof_ctxt = proof_ctxt, concl = concl}
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   200
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   201
datatype veriT_replay_node = VeriT_Replay_Node of {
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   202
  id: string,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   203
  rule: string,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   204
  args: term list,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   205
  prems: string list,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   206
  proof_ctxt: term list,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   207
  concl: term,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   208
  bounds: (string * typ) list,
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   209
  insts: term Symtab.table,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   210
  declarations: (string * term) list,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   211
  subproof: (string * typ) list * term list * term list * veriT_replay_node list}
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   212
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   213
fun mk_replay_node id rule args prems proof_ctxt concl bounds insts declarations subproof =
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   214
  VeriT_Replay_Node {id = id, rule = rule, args = args, prems = prems, proof_ctxt = proof_ctxt,
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   215
    concl = concl, bounds = bounds, insts = insts, declarations = declarations,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   216
    subproof = subproof}
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   217
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   218
datatype veriT_step = VeriT_Step of {
57712
3c4e6bc7455f Simplifying the labels in the proof of the SMT solver veriT.
fleury
parents: 57710
diff changeset
   219
  id: string,
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   220
  rule: string,
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   221
  prems: string list,
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   222
  proof_ctxt: term list,
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   223
  concl: term,
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   224
  fixes: string list}
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   225
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   226
fun mk_step id rule prems proof_ctxt concl fixes =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   227
  VeriT_Step {id = id, rule = rule, prems = prems, proof_ctxt = proof_ctxt, concl = concl,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   228
    fixes = fixes}
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   229
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   230
val step_prefix = ".c"
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   231
val input_rule = "input"
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   232
val la_generic_rule = "la_generic"
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   233
val normalized_input_rule = "__normalized_input" (*arbitrary*)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   234
val rewrite_rule = "__rewrite" (*arbitrary*)
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   235
val subproof_rule = "subproof"
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   236
val local_input_rule = "__local_input" (*arbitrary*)
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   237
val simp_arith_rule = "simp_arith"
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   238
val veriT_def = "__skolem_definition" (*arbitrary*)
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   239
val not_not_rule = "not_not"
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   240
val contract_rule = "contraction"
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   241
val eq_congruent_pred_rule = "eq_congruent_pred"
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   242
val eq_congruent_rule = "eq_congruent"
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   243
val ite_intro_rule = "ite_intro"
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   244
val default_skolem_rule = "sko_forall" (*arbitrary, but must be one of the skolems*)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   245
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   246
val skolemization_steps = ["sko_forall", "sko_ex"]
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   247
val is_skolemization = member (op =) skolemization_steps
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   248
val keep_app_symbols = member (op =) [eq_congruent_pred_rule, eq_congruent_rule, ite_intro_rule]
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   249
val keep_raw_lifting = member (op =) [eq_congruent_pred_rule, eq_congruent_rule, ite_intro_rule]
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   250
val is_SH_trivial = member (op =) [not_not_rule, contract_rule]
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   251
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   252
fun is_skolemization_step (VeriT_Replay_Node {id, ...}) = is_skolemization id
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   253
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   254
(* Even the veriT developers do not know if the following rule can still appear in proofs: *)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   255
val veriT_deep_skolemize_rule = "deep_skolemize"
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   256
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   257
fun number_of_steps [] = 0
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   258
  | number_of_steps ((VeriT_Replay_Node {subproof = (_, _, _, subproof), ...}) :: pf) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   259
      1 + number_of_steps subproof + number_of_steps pf
57708
4b52c1b319ce veriT changes for lifted terms, and ite_elim rules.
fleury
parents: 57705
diff changeset
   260
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   261
(* proof parser *)
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   262
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   263
fun node_of p cx =
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   264
  ([], cx)
57747
816f96fff418 tuned name context code
blanchet
parents: 57716
diff changeset
   265
  ||>> `(with_fresh_names (term_of p))
57716
4546c9fdd8a7 Improving robustness and indentation corrections.
fleury
parents: 57715
diff changeset
   266
  |>> snd
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   267
58490
blanchet
parents: 58078
diff changeset
   268
fun find_type_in_formula (Abs (v, T, u)) var_name =
blanchet
parents: 58078
diff changeset
   269
    if String.isPrefix var_name v then SOME T else find_type_in_formula u var_name
57705
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   270
  | find_type_in_formula (u $ v) var_name =
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   271
    (case find_type_in_formula u var_name of
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   272
      NONE => find_type_in_formula v var_name
58490
blanchet
parents: 58078
diff changeset
   273
    | some_T => some_T)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   274
  | find_type_in_formula (Free(v, T)) var_name =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   275
    if String.isPrefix var_name v then SOME T else NONE
57705
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   276
  | find_type_in_formula _ _ = NONE
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   277
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   278
fun synctactic_var_subst old_name new_name (u $ v) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   279
    (synctactic_var_subst old_name new_name u $ synctactic_var_subst old_name new_name v)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   280
  | synctactic_var_subst old_name new_name (Abs (v, T, u)) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   281
    Abs (if String.isPrefix old_name v then new_name else v, T,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   282
      synctactic_var_subst old_name new_name u)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   283
  | synctactic_var_subst old_name new_name (Free (v, T)) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   284
     if String.isPrefix old_name v then Free (new_name, T) else Free (v, T)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   285
  | synctactic_var_subst _ _ t = t
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   286
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   287
fun synctatic_rew_in_lhs_subst old_name new_name (Const(\<^const_name>\<open>HOL.eq\<close>, T) $ t1 $ t2) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   288
     Const(\<^const_name>\<open>HOL.eq\<close>, T) $ synctactic_var_subst old_name new_name t1 $ t2
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   289
  | synctatic_rew_in_lhs_subst old_name new_name (Const(\<^const_name>\<open>Trueprop\<close>, T) $ t1) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   290
     Const(\<^const_name>\<open>Trueprop\<close>, T) $ (synctatic_rew_in_lhs_subst old_name new_name t1)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   291
  | synctatic_rew_in_lhs_subst _ _ t = t
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   292
58490
blanchet
parents: 58078
diff changeset
   293
fun add_bound_variables_to_ctxt concl =
blanchet
parents: 58078
diff changeset
   294
  fold (update_binding o
blanchet
parents: 58078
diff changeset
   295
    (fn s => (s, Term (Free (s, the_default dummyT (find_type_in_formula concl s))))))
57705
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   296
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   297
local
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   298
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   299
  fun remove_Sym (SMTLIB.Sym y) = y
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   300
    | remove_Sym y = (@{print} y; raise (Fail "failed to match"))
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   301
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   302
  fun extract_symbols bds =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   303
    bds
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   304
    |> map (fn SMTLIB.S [SMTLIB.Sym "=", SMTLIB.Sym x, SMTLIB.Sym y] => [[x, y]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   305
             | SMTLIB.S [SMTLIB.Key "=", SMTLIB.Sym x, SMTLIB.Sym y] => [[x, y]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   306
             | SMTLIB.S syms => map (single o remove_Sym) syms
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   307
             | SMTLIB.Sym x => [[x]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   308
             | t => raise (Fail ("match error " ^ @{make_string} t)))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   309
    |> flat
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   310
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   311
  (* onepoint can bind a variable to another variable or to a constant *)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   312
  fun extract_qnt_symbols cx bds =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   313
    bds
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   314
    |> map (fn SMTLIB.S [SMTLIB.Sym "=", SMTLIB.Sym x, SMTLIB.Sym y] =>
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   315
                (case node_of (SMTLIB.Sym y) cx  of
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   316
                  ((_, []), _) => [[x]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   317
                | _ => [[x, y]])
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   318
             | SMTLIB.S [SMTLIB.Key "=", SMTLIB.Sym x, SMTLIB.Sym y] =>
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   319
                (case node_of (SMTLIB.Sym y) cx  of
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   320
                  ((_, []), _) => [[x]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   321
                | _ => [[x, y]])
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   322
             | SMTLIB.S (SMTLIB.Sym "=" :: SMTLIB.Sym x :: _) => [[x]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   323
             | SMTLIB.S (SMTLIB.Key "=" :: SMTLIB.Sym x :: _) => [[x]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   324
             | SMTLIB.S syms => map (single o remove_Sym) syms
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   325
             | SMTLIB.Sym x => [[x]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   326
             | t => raise (Fail ("match error " ^ @{make_string} t)))
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   327
    |> flat
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   328
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   329
  fun extract_symbols_map bds =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   330
    bds
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   331
    |> map (fn SMTLIB.S [SMTLIB.Sym "=", SMTLIB.Sym x, _] => [[x]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   332
             | SMTLIB.S syms =>  map (single o remove_Sym) syms)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   333
    |> flat
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   334
in
57705
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   335
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   336
fun declared_csts _ "__skolem_definition" (SMTLIB.S [SMTLIB.Sym x, typ, _]) = [(x, typ)]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   337
  | declared_csts _ _ _ = []
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   338
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   339
fun skolems_introduced_by_rule (SMTLIB.S bds) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   340
   fold (fn (SMTLIB.S [SMTLIB.Sym "=", SMTLIB.Sym _, SMTLIB.Sym y]) => curry (op ::) y) bds []
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   341
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   342
(*FIXME there is probably a way to use the information given by onepoint*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   343
fun bound_vars_by_rule _ "bind" (SMTLIB.S bds) = extract_symbols bds
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   344
  | bound_vars_by_rule cx "onepoint" (SMTLIB.S bds) = extract_qnt_symbols cx bds
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   345
  | bound_vars_by_rule _ "sko_forall" (SMTLIB.S bds) = extract_symbols_map bds
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   346
  | bound_vars_by_rule _ "sko_ex" (SMTLIB.S bds) = extract_symbols_map bds
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   347
  | bound_vars_by_rule _ "__skolem_definition" (SMTLIB.S [SMTLIB.Sym x, _, _]) = [[x]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   348
  | bound_vars_by_rule _ _ _ = []
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   349
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   350
(* VeriT adds "?" before some variables. *)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   351
fun remove_all_qm (SMTLIB.Sym v :: l) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   352
    SMTLIB.Sym (perhaps (try (unprefix "?")) v) :: remove_all_qm l
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   353
  | remove_all_qm (SMTLIB.S l :: l') = SMTLIB.S (remove_all_qm l) :: remove_all_qm l'
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   354
  | remove_all_qm (SMTLIB.Key v :: l) = SMTLIB.Key v :: remove_all_qm l
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   355
  | remove_all_qm (v :: l) = v :: remove_all_qm l
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   356
  | remove_all_qm [] = []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   357
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   358
fun remove_all_qm2 (SMTLIB.Sym v) = SMTLIB.Sym (perhaps (try (unprefix "?")) v)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   359
  | remove_all_qm2 (SMTLIB.S l) = SMTLIB.S (remove_all_qm l)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   360
  | remove_all_qm2 (SMTLIB.Key v) = SMTLIB.Key v
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   361
  | remove_all_qm2 v = v
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   362
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   363
end
57705
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   364
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   365
datatype step_kind = ASSUME | ANCHOR | NO_STEP | NORMAL_STEP | SKOLEM
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   366
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   367
fun parse_raw_proof_steps (limit : string option) (ls : SMTLIB.tree list) (cx : name_bindings) :
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   368
     (raw_veriT_node list * SMTLIB.tree list * name_bindings) =
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   369
  let
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   370
    fun rotate_pair (a, (b, c)) = ((a, b), c)
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   371
    fun step_kind [] = (NO_STEP, SMTLIB.S [], [])
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   372
      | step_kind ((p as SMTLIB.S (SMTLIB.Sym "anchor" :: _)) :: l) = (ANCHOR, p, l)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   373
      | step_kind ((p as SMTLIB.S (SMTLIB.Sym "assume" :: _)) :: l) = (ASSUME, p, l)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   374
      | step_kind ((p as SMTLIB.S (SMTLIB.Sym "step" :: _)) :: l) = (NORMAL_STEP, p, l)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   375
      | step_kind ((p as SMTLIB.S (SMTLIB.Sym "define-fun" :: _)) :: l) = (SKOLEM, p, l)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   376
    fun parse_skolem (SMTLIB.S [SMTLIB.Sym "define-fun", SMTLIB.Sym id,  _, typ,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   377
           SMTLIB.S (SMTLIB.Sym "!" :: t :: [SMTLIB.Key _, SMTLIB.Sym name])]) cx =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   378
         (*replace the name binding by the constant instead of the full term in order to reduce
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   379
           the size of the generated terms and therefore the reconstruction time*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   380
         let val (l, cx) = (fst oo SMTLIB_Proof.extract_and_update_name_bindings) t cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   381
            |> apsnd (SMTLIB_Proof.update_name_binding (name, SMTLIB.Sym id))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   382
         in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   383
           (mk_raw_node (id ^ veriT_def) veriT_def (SMTLIB.S [SMTLIB.Sym id, typ, l]) [] []
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   384
              (SMTLIB.S [SMTLIB.Sym "=", SMTLIB.Sym id, l]) [], cx)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   385
         end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   386
      | parse_skolem (SMTLIB.S [SMTLIB.Sym "define-fun", SMTLIB.Sym id,  _, typ, SMTLIB.S l]) cx =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   387
         let val (l, cx) = (fst oo SMTLIB_Proof.extract_and_update_name_bindings) (SMTLIB.S l ) cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   388
         in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   389
           (mk_raw_node (id ^ veriT_def) veriT_def (SMTLIB.S [SMTLIB.Sym id, typ, l]) [] []
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   390
              (SMTLIB.S [SMTLIB.Sym "=", SMTLIB.Sym id, l]) [], cx)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   391
         end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   392
      | parse_skolem t _ = raise Fail ("unrecognized VeriT proof " ^ \<^make_string> t)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   393
    fun get_id_cx (SMTLIB.S ((SMTLIB.Sym _) :: (SMTLIB.Sym id) :: l), cx) = (id, (l, cx))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   394
      | get_id_cx t = raise Fail ("unrecognized VeriT proof " ^ \<^make_string> t)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   395
    fun get_id (SMTLIB.S ((SMTLIB.Sym _) :: (SMTLIB.Sym id) :: l)) = (id, l)
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69205
diff changeset
   396
      | get_id t = raise Fail ("unrecognized VeriT proof " ^ \<^make_string> t)
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   397
    fun parse_source (SMTLIB.Key "premises" :: SMTLIB.S source ::l, cx) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   398
        (SOME (map (fn (SMTLIB.Sym id) => id) source), (l, cx))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   399
      | parse_source (l, cx) = (NONE, (l, cx))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   400
    fun parse_rule (SMTLIB.Key "rule" :: SMTLIB.Sym r :: l, cx) = (r, (l, cx))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   401
      | parse_rule t = raise Fail ("unrecognized VeriT proof " ^ \<^make_string> t)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   402
    fun parse_anchor_step (SMTLIB.S (SMTLIB.Sym "anchor" :: SMTLIB.Key "step" :: SMTLIB.Sym r :: l), cx) = (r, (l, cx))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   403
      | parse_anchor_step t = raise Fail ("unrecognized VeriT proof " ^ \<^make_string> t)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   404
    fun parse_args (SMTLIB.Key "args" :: args :: l, cx) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   405
          let val ((args, cx), _) = SMTLIB_Proof.extract_and_update_name_bindings args cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   406
          in (args, (l, cx)) end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   407
      | parse_args (l, cx) = (SMTLIB.S [], (l, cx))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   408
    fun parse_and_clausify_conclusion (SMTLIB.S (SMTLIB.Sym "cl" :: []) :: l, cx) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   409
          (SMTLIB.Sym "false", (l, cx))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   410
      | parse_and_clausify_conclusion (SMTLIB.S (SMTLIB.Sym "cl" :: concl) :: l, cx) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   411
          let val (concl, cx) = fold_map (fst oo SMTLIB_Proof.extract_and_update_name_bindings) concl cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   412
          in (SMTLIB.S (SMTLIB.Sym "or" :: concl), (l, cx)) end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   413
      | parse_and_clausify_conclusion t = raise Fail ("unrecognized VeriT proof " ^ \<^make_string> t)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   414
    val parse_normal_step =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   415
        get_id_cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   416
        ##> parse_and_clausify_conclusion
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   417
        #> rotate_pair
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   418
        ##> parse_rule
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   419
        #> rotate_pair
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   420
        ##> parse_source
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   421
        #> rotate_pair
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   422
        ##> parse_args
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   423
        #> rotate_pair
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   424
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   425
    fun to_raw_node subproof ((((id, concl), rule), prems), args) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   426
        mk_raw_node id rule args (the_default [] prems) [] concl subproof
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   427
    fun at_discharge NONE _ = false
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   428
      | at_discharge (SOME id) p = p |> get_id |> fst |> (fn id2 => id = id2)
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   429
  in
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   430
    case step_kind ls of
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   431
        (NO_STEP, _, _) => ([],[], cx)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   432
      | (NORMAL_STEP, p, l) =>
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   433
          if at_discharge limit p then ([], ls, cx) else
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   434
            let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   435
              val (s, (_, cx)) =  (p, cx)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   436
                |> parse_normal_step
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   437
                ||> (fn i => i)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   438
                |>>  (to_raw_node [])
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   439
              val (rp, rl, cx) = parse_raw_proof_steps limit l cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   440
          in (s :: rp, rl, cx) end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   441
      | (ASSUME, p, l) =>
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   442
          let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   443
            val (id, t :: []) = p
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   444
              |> get_id
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   445
            val ((t, cx), _) = SMTLIB_Proof.extract_and_update_name_bindings t cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   446
            val s = mk_raw_node id input_rule (SMTLIB.S []) [] [] t []
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   447
            val (rp, rl, cx) = parse_raw_proof_steps limit l cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   448
          in (s :: rp, rl, cx) end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   449
      | (ANCHOR, p, l) =>
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   450
          let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   451
            val (anchor_id, (anchor_args, (_, cx))) = (p, cx) |> (parse_anchor_step ##> parse_args)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   452
            val (subproof, discharge_step :: remaining_proof, cx) = parse_raw_proof_steps (SOME anchor_id) l cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   453
            val (curss, (_, cx)) = parse_normal_step (discharge_step, cx)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   454
            val s = to_raw_node subproof (fst curss, anchor_args)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   455
            val (rp, rl, cx) = parse_raw_proof_steps limit remaining_proof cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   456
          in (s :: rp, rl, cx) end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   457
      | (SKOLEM, p, l) =>
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   458
          let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   459
            val (s, cx) = parse_skolem p cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   460
            val (rp, rl, cx) = parse_raw_proof_steps limit l cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   461
          in (s :: rp, rl, cx) end
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   462
  end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   463
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   464
fun proof_ctxt_of_rule "bind" t = t
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   465
  | proof_ctxt_of_rule "sko_forall" t = t
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   466
  | proof_ctxt_of_rule "sko_ex" t = t
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   467
  | proof_ctxt_of_rule "let" t = t
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   468
  | proof_ctxt_of_rule "onepoint" t = t
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   469
  | proof_ctxt_of_rule _ _ = []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   470
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   471
fun args_of_rule "bind" t = t
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   472
  | args_of_rule "la_generic" t = t
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   473
  | args_of_rule "lia_generic" t = t
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   474
  | args_of_rule _ _ = []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   475
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   476
fun insts_of_forall_inst "forall_inst" t = map (fn SMTLIB.S [_, SMTLIB.Sym x, a] => (x, a)) t
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   477
  | insts_of_forall_inst _ _ = []
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   478
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   479
fun id_of_last_step prems =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   480
  if null prems then []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   481
  else
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   482
    let val VeriT_Replay_Node {id, ...} = List.last prems in [id] end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   483
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   484
fun extract_assumptions_from_subproof subproof =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   485
  let fun extract_assumptions_from_subproof (VeriT_Replay_Node {rule, concl, ...}) assms =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   486
    if rule = local_input_rule then concl :: assms else assms
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   487
  in
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   488
    fold extract_assumptions_from_subproof subproof []
57705
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   489
  end
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   490
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   491
fun normalized_rule_name id rule =
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   492
  (case (rule = input_rule, can (unprefix SMTLIB_Interface.assert_prefix) id) of
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   493
    (true, true) => normalized_input_rule
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   494
  | (true, _) => local_input_rule
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   495
  | _ => rule)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   496
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   497
fun is_assm_repetition id rule =
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   498
  rule = input_rule andalso can (unprefix SMTLIB_Interface.assert_prefix) id
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   499
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   500
fun extract_skolem ([SMTLIB.Sym var, typ, choice]) = (var, typ, choice)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   501
  | extract_skolem t = raise Fail ("fail to parse type" ^ @{make_string} t)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   502
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   503
(* The preprocessing takes care of:
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   504
     1. unfolding the shared terms
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   505
     2. extract the declarations of skolems to make sure that there are not unfolded
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   506
*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   507
fun preprocess compress step =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   508
  let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   509
    fun expand_assms cs =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   510
      map (fn t => case AList.lookup (op =) cs t of NONE => t | SOME a => a)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   511
    fun expand_lonely_arguments (args as SMTLIB.S [SMTLIB.Sym "=", _, _]) = [args]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   512
      | expand_lonely_arguments (SMTLIB.S S) = map (fn x => SMTLIB.S [SMTLIB.Sym "=", x, x]) S
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   513
      | expand_lonely_arguments (x as SMTLIB.Sym _) = [SMTLIB.S [SMTLIB.Sym "=", x, x]]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   514
      | expand_lonely_arguments t = [t]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   515
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   516
    fun preprocess (Raw_VeriT_Node {id, rule, args, prems, concl, subproof, ...}) (cx, remap_assms)  =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   517
      let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   518
        val stripped_args = args
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   519
          |> (fn SMTLIB.S args => args)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   520
          |> map
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   521
              (fn SMTLIB.S [SMTLIB.Key "=", x, y] => SMTLIB.S [SMTLIB.Sym "=", x, y]
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   522
              | x => x)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   523
          |> (rule = "bind" orelse rule = "onepoint") ? flat o (map expand_lonely_arguments)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   524
          |> `(if rule = veriT_def then single o extract_skolem else K [])
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   525
          ||> SMTLIB.S
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   526
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   527
        val (subproof, (cx, _)) = fold_map preprocess subproof (cx, remap_assms) |> apfst flat
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   528
        val (skolem_names, stripped_args) = stripped_args
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   529
        val remap_assms = (if rule = "or" then (id, hd prems) :: remap_assms else remap_assms)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   530
        (* declare variables in the context *)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   531
        val declarations =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   532
           if rule = veriT_def
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   533
           then skolem_names |> map (fn (name, _, choice) => (name, choice))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   534
           else []
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   535
      in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   536
        if compress andalso rule = "or"
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   537
        then ([], (cx, remap_assms))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   538
        else ([Raw_VeriT_Node {id = id, rule = rule, args = stripped_args,
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   539
           prems = expand_assms remap_assms prems, declarations = declarations, concl = concl, subproof = subproof}],
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   540
          (cx, remap_assms))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   541
      end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   542
  in preprocess step end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   543
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   544
fun filter_split _ [] = ([], [])
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   545
  | filter_split f (a :: xs) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   546
     (if f a then apfst (curry op :: a) else apsnd (curry op :: a)) (filter_split f xs)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   547
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   548
fun collect_skolem_defs (Raw_VeriT_Node {rule, subproof = subproof, args, ...}) =
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   549
  (if is_skolemization rule then map (fn id => id ^ veriT_def) (skolems_introduced_by_rule args) else []) @
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   550
  flat (map collect_skolem_defs subproof)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   551
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   552
(*The postprocessing does:
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   553
  1. translate the terms to Isabelle syntax, taking care of free variables
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   554
  2. remove the ambiguity in the proof terms:
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   555
       x \<leadsto> y |- x = x
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   556
    means y = x. To remove ambiguity, we use the fact that y is a free variable and replace the term
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   557
    by:
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   558
      xy \<leadsto> y |- xy = x.
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   559
    This is now does not have an ambiguity and we can safely move the "xy \<leadsto> y" to the proof
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   560
    assumptions.
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   561
*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   562
fun postprocess_proof compress ctxt step cx =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   563
  let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   564
    fun postprocess (Raw_VeriT_Node {id, rule, args, prems, declarations, concl, subproof}) (cx, rew) =
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   565
    let
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   566
      val _ = (SMT_Config.verit_msg ctxt) (fn () => @{print} ("id =", id, "concl =", concl))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   567
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   568
      val globally_bound_vars = declared_csts cx rule args
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   569
      val cx = fold (update_binding o (fn (s, typ) => (s, Term (Free (s, type_of cx typ)))))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   570
           globally_bound_vars cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   571
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   572
      (*find rebound variables specific to the LHS of the equivalence symbol*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   573
      val bound_vars = bound_vars_by_rule cx rule args
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   574
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   575
      val rhs_vars = fold (fn [t', t] => t <> t' ? (curry (op ::) t) | _ => fn x => x) bound_vars []
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   576
      fun not_already_bound cx t = SMTLIB_Proof.lookup_binding cx t = None andalso
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   577
          not (member (op =) rhs_vars t)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   578
      val (shadowing_vars, rebound_lhs_vars) = bound_vars
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   579
        |> filter_split (fn [t, _] => not_already_bound cx t | _ => true)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   580
        |>> map (single o hd)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   581
        |>> (fn vars => vars @ map (fn [_, t] => [t] | _ => []) bound_vars)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   582
        |>> flat
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   583
      val subproof_rew = fold (fn [t, t'] => curry (op ::) (t, t ^ t'))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   584
        rebound_lhs_vars rew
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   585
      val subproof_rewriter = fold (fn (t, t') => synctatic_rew_in_lhs_subst t t')
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   586
         subproof_rew
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   587
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   588
      val ((concl, bounds), cx') = node_of concl cx
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   589
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   590
      val extra_lhs_vars = map (fn [a,b] => (a, a^b)) rebound_lhs_vars
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   591
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   592
      (* postprocess conclusion *)
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   593
      val concl = SMTLIB_Isar.unskolemize_names ctxt (subproof_rewriter concl)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   594
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   595
      val _ = (SMT_Config.verit_msg ctxt) (fn () => \<^print> ("id =", id, "concl =", concl))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   596
      val _ = (SMT_Config.verit_msg ctxt) (fn () => \<^print> ("id =", id, "cx' =", cx',
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   597
        "bound_vars =", bound_vars))
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   598
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   599
      val bound_tvars =
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   600
        map (fn s => (s, the (find_type_in_formula concl s)))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   601
         (shadowing_vars @ map snd extra_lhs_vars)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   602
      val subproof_cx =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   603
         add_bound_variables_to_ctxt concl (shadowing_vars @ map snd extra_lhs_vars) cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   604
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   605
      fun could_unify (Bound i, Bound j) = i = j
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   606
        | could_unify (Var v, Var v') = v = v'
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   607
        | could_unify (Free v, Free v') = v = v'
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   608
        | could_unify (Const (v, ty), Const (v', ty')) = v = v' andalso ty = ty'
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   609
        | could_unify (Abs (_, ty, bdy), Abs (_, ty', bdy')) = ty = ty' andalso could_unify (bdy, bdy')
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   610
        | could_unify (u $ v, u' $ v') = could_unify (u, u') andalso could_unify (v, v')
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   611
        | could_unify _ = false
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   612
      fun is_alpha_renaming t =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   613
          t
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   614
          |> HOLogic.dest_Trueprop
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   615
          |> HOLogic.dest_eq
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   616
          |> could_unify
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   617
        handle TERM _ => false
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   618
      val alpha_conversion = rule = "bind" andalso is_alpha_renaming concl
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   619
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   620
      val can_remove_subproof =
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   621
        compress andalso (is_skolemization rule orelse alpha_conversion)
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   622
      val (fixed_subproof : veriT_replay_node list, _) =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   623
         fold_map postprocess (if can_remove_subproof then [] else subproof)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   624
           (subproof_cx, subproof_rew)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   625
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   626
      val unsk_and_rewrite = SMTLIB_Isar.unskolemize_names ctxt o subproof_rewriter
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   627
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   628
      (* postprocess assms *)
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   629
      val stripped_args = args |> (fn SMTLIB.S S => S)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   630
      val sanitized_args = proof_ctxt_of_rule rule stripped_args
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   631
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   632
      val arg_cx =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   633
        subproof_cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   634
        |> add_bound_variables_to_ctxt concl (shadowing_vars @ map fst extra_lhs_vars)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   635
      val (termified_args, _) = fold_map node_of sanitized_args arg_cx |> apfst (map fst)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   636
      val normalized_args = map unsk_and_rewrite termified_args
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   637
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   638
      val subproof_assms = proof_ctxt_of_rule rule normalized_args
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   639
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   640
      (* postprocess arguments *)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   641
      val rule_args = args_of_rule rule stripped_args
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   642
      val (termified_args, _) = fold_map term_of rule_args subproof_cx
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   643
      val normalized_args = map unsk_and_rewrite termified_args
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   644
      val rule_args = map subproof_rewriter normalized_args
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   645
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   646
      val raw_insts = insts_of_forall_inst rule stripped_args
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   647
      fun termify_term (x, t) cx = let val (t, cx) = term_of t cx in ((x, t), cx) end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   648
      val (termified_args, _) = fold_map termify_term raw_insts subproof_cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   649
      val insts = Symtab.empty
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   650
        |> fold (fn (x, t) => fn insts => Symtab.update_new (x, t) insts) termified_args
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   651
        |> Symtab.map (K unsk_and_rewrite)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   652
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   653
      (* declarations *)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   654
      val (declarations, _) = fold_map termify_term declarations cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   655
        |> apfst (map (apsnd unsk_and_rewrite))
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   656
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   657
      (* fix step *)
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   658
      val bound_t = bounds
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   659
        |> map (fn s => (s, the (find_type_in_formula concl s)))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   660
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   661
      val skolem_defs = (if is_skolemization rule
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   662
         then map (fn id => id ^ veriT_def) (skolems_introduced_by_rule args) else [])
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   663
      val skolems_of_subproof = (if is_skolemization rule
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   664
         then flat (map collect_skolem_defs subproof) else [])
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   665
      val fixed_prems =
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   666
        prems @ (if is_assm_repetition id rule then [id] else []) @
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   667
        skolem_defs @ skolems_of_subproof @ (id_of_last_step fixed_subproof)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   668
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   669
      (* fix subproof *)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   670
      val normalized_rule = normalized_rule_name id rule
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   671
        |> (if compress andalso alpha_conversion then K "refl" else I)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   672
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   673
      val extra_assms2 =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   674
        (if rule = subproof_rule then extract_assumptions_from_subproof fixed_subproof else [])
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   675
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   676
      val step = mk_replay_node id normalized_rule rule_args fixed_prems subproof_assms concl
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   677
        bound_t insts declarations (bound_tvars, subproof_assms, extra_assms2, fixed_subproof)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   678
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   679
    in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   680
       (step, (cx', rew))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   681
    end
57705
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   682
  in
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   683
    postprocess step (cx, [])
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   684
    |> (fn (step, (cx, _)) => (step, cx))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   685
   end
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   686
57705
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   687
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   688
val linearize_proof =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   689
  let
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   690
    fun map_node_concl f (VeriT_Node {id, rule, prems, proof_ctxt, concl}) =
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   691
       mk_node id rule prems proof_ctxt (f concl)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   692
    fun linearize (VeriT_Replay_Node {id = id, rule = rule, args = _, prems = prems,
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   693
        proof_ctxt = proof_ctxt, concl = concl, bounds = bounds, insts = _, declarations = _,
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   694
        subproof = (bounds', assms, inputs, subproof)}) =
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   695
      let
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   696
        val bounds = distinct (op =) bounds
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   697
        val bounds' = distinct (op =) bounds'
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   698
        fun mk_prop_of_term concl =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69205
diff changeset
   699
          concl |> fastype_of concl = \<^typ>\<open>bool\<close> ? curry (op $) \<^term>\<open>Trueprop\<close>
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   700
        fun remove_assumption_id assumption_id prems =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   701
          filter_out (curry (op =) assumption_id) prems
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   702
        fun add_assumption assumption concl =
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   703
          \<^const>\<open>Pure.imp\<close> $ mk_prop_of_term assumption $ mk_prop_of_term concl
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   704
        fun inline_assumption assumption assumption_id
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   705
            (VeriT_Node {id, rule, prems, proof_ctxt, concl}) =
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   706
          mk_node id rule (remove_assumption_id assumption_id prems) proof_ctxt
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   707
            (add_assumption assumption concl)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   708
        fun find_input_steps_and_inline [] = []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   709
          | find_input_steps_and_inline
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   710
              (VeriT_Node {id = id', rule, prems, concl, ...} :: steps) =
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   711
            if rule = input_rule then
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   712
              find_input_steps_and_inline (map (inline_assumption concl id') steps)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   713
            else
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   714
              mk_node (id') rule prems [] concl :: find_input_steps_and_inline steps
57708
4b52c1b319ce veriT changes for lifted terms, and ite_elim rules.
fleury
parents: 57705
diff changeset
   715
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   716
        fun free_bounds bounds (concl) =
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   717
          fold (fn (var, typ) => fn t => Logic.all (Free (var, typ)) t) bounds concl
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   718
        val subproof = subproof
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   719
          |> flat o map linearize
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   720
          |> map (map_node_concl (fold add_assumption (assms @ inputs)))
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   721
          |> map (map_node_concl (free_bounds (bounds @ bounds')))
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   722
          |> find_input_steps_and_inline
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   723
        val concl = free_bounds bounds concl
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   724
      in
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   725
        subproof @ [mk_node id rule prems proof_ctxt concl]
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   726
      end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   727
  in linearize end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   728
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   729
fun rule_of (VeriT_Replay_Node {rule,...}) = rule
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   730
fun subproof_of (VeriT_Replay_Node {subproof = (_, _, _, subproof),...}) = subproof
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   731
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   732
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   733
(* Massage Skolems for Sledgehammer.
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   734
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   735
We have to make sure that there is an "arrow" in the graph for skolemization steps.
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   736
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   737
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   738
A. The normal easy case
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   739
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   740
This function detects the steps of the form
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   741
  P \<longleftrightarrow> Q :skolemization
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   742
  Q       :resolution with P
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   743
and replace them by
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   744
  Q       :skolemization
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   745
Throwing away the step "P \<longleftrightarrow> Q" completely. This throws away a lot of information, but it does not
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   746
matter too much for Sledgehammer.
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   747
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   748
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   749
B. Skolems in subproofs
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   750
Supporting this is more or less hopeless as long as the Isar reconstruction of Sledgehammer
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   751
does not support more features like definitions. veriT is able to generate proofs with skolemization
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   752
happening in subproofs inside the formula. 
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   753
  (assume "A \<or> P"
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   754
   ...
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   755
   P \<longleftrightarrow> Q :skolemization in the subproof
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   756
   ...)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   757
  hence A \<or> P \<longrightarrow> A \<or> Q :lemma
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   758
  ...
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   759
  R :something with some rule
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   760
and replace them by
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   761
  R :skolemization with some rule
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   762
Without any subproof
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   763
*)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   764
fun remove_skolem_definitions_proof steps =
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   765
  let
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   766
    fun replace_equivalent_by_imp (judgement $ ((Const(\<^const_name>\<open>HOL.eq\<close>, typ) $ arg1) $ arg2)) =
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   767
       judgement $ ((Const(\<^const_name>\<open>HOL.implies\<close>, typ) $ arg1) $ arg2)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   768
     | replace_equivalent_by_imp a = a (*This case is probably wrong*)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   769
    fun remove_skolem_definitions (VeriT_Replay_Node {id = id, rule = rule, args = args,
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   770
         prems = prems,
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   771
        proof_ctxt = proof_ctxt, concl = concl, bounds = bounds, insts = insts,
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   772
        declarations = declarations,
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   773
        subproof = (vars, assms', extra_assms', subproof)}) (prems_to_remove, skolems) =
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   774
    let
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   775
      val prems = prems
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   776
        |> filter_out (member (op =) prems_to_remove)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   777
      val trivial_step = is_SH_trivial rule
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   778
      fun has_skolem_substep st NONE = if is_skolemization (rule_of st) then SOME (rule_of st)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   779
             else fold has_skolem_substep (subproof_of st) NONE
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   780
        | has_skolem_substep _ a = a
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   781
      val promote_to_skolem = exists (fn t => member (op =) skolems t) prems
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   782
      val promote_from_assms = fold has_skolem_substep subproof NONE <> NONE
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   783
      val promote_step = promote_to_skolem orelse promote_from_assms
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   784
      val skolem_step_to_skip = is_skolemization rule orelse 
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   785
        (promote_from_assms andalso length prems > 1)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   786
      val is_skolem = is_skolemization rule orelse promote_step
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   787
      val prems = prems
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   788
        |> filter_out (fn t => member (op =) skolems t)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   789
        |> is_skolem ? filter_out (String.isPrefix id)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   790
      val rule = (if promote_step then default_skolem_rule else rule)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   791
      val subproof = subproof
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   792
        |> (is_skolem ? K []) (*subproofs of skolemization steps are useless for SH*)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   793
        |> map (fst o (fn st => remove_skolem_definitions st (prems_to_remove, skolems)))
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   794
             (*no new definitions in subproofs*)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   795
        |> flat
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   796
      val concl = concl
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   797
        |> is_skolem ? replace_equivalent_by_imp
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   798
      val step = (if skolem_step_to_skip orelse rule = veriT_def orelse trivial_step then []
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   799
        else mk_replay_node id rule args prems proof_ctxt concl bounds insts declarations
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   800
            (vars, assms', extra_assms', subproof)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   801
          |> single)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   802
      val defs = (if rule = veriT_def orelse trivial_step then id :: prems_to_remove
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   803
         else prems_to_remove)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   804
      val skolems = (if skolem_step_to_skip then id :: skolems else skolems)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   805
    in
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   806
      (step, (defs, skolems))
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   807
    end
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   808
  in
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   809
    fold_map remove_skolem_definitions steps ([], [])
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   810
    |> fst
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   811
    |> flat
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   812
  end
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   813
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   814
local
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   815
  fun import_proof_and_post_process typs funs lines ctxt =
57708
4b52c1b319ce veriT changes for lifted terms, and ite_elim rules.
fleury
parents: 57705
diff changeset
   816
    let
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   817
      val compress = SMT_Config.compress_verit_proofs ctxt
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   818
      val smtlib_lines_without_qm =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   819
        lines
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   820
        |> map single
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   821
        |> map SMTLIB.parse
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   822
        |> map remove_all_qm2
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   823
      val (raw_steps, _, _) = 
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   824
        parse_raw_proof_steps NONE smtlib_lines_without_qm SMTLIB_Proof.empty_name_binding
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   825
      
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   826
      fun process step (cx, cx') =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   827
        let fun postprocess step (cx, cx') =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   828
          let val (step, cx) = postprocess_proof compress ctxt step cx
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   829
          in (step, (cx, cx')) end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   830
        in uncurry (fold_map postprocess) (preprocess compress step (cx, cx')) end
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   831
      val step =
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   832
        (empty_context ctxt typs funs, [])
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   833
        |> fold_map process raw_steps
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   834
        |> (fn (steps, (cx, _)) => (flat steps, cx))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   835
    in step end
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   836
in
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   837
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   838
fun parse typs funs lines ctxt =
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   839
  let
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   840
    val (u, env) = import_proof_and_post_process typs funs lines ctxt
72513
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   841
    val t = u
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   842
       |> remove_skolem_definitions_proof
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   843
       |> flat o (map linearize_proof)
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   844
    fun node_to_step (VeriT_Node {id, rule, prems, concl, ...}) =
75f5c63f6cfa better handling of skolemization for Isar reconstruction in Sledgehammer for veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 72458
diff changeset
   845
      mk_step id rule prems [] concl []
58490
blanchet
parents: 58078
diff changeset
   846
  in
57705
5da48dae7d03 Subproofs for the SMT solver veriT.
fleury
parents: 57704
diff changeset
   847
    (map node_to_step t, ctxt_of env)
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   848
  end
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   849
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   850
fun parse_replay typs funs lines ctxt =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   851
  let
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   852
    val (u, env) = import_proof_and_post_process typs funs lines ctxt
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 69597
diff changeset
   853
    val _ = (SMT_Config.verit_msg ctxt) (fn () => \<^print> u)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   854
  in
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   855
    (u, ctxt_of env)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   856
  end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   857
end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 61611
diff changeset
   858
57704
c0da3fc313e3 Basic support for the SMT prover veriT.
fleury
parents:
diff changeset
   859
end;