src/HOL/Tools/SMT/cvc_proof_parse.ML
author wenzelm
Wed, 25 Jun 2025 16:35:25 +0200
changeset 82768 8f866fd6fae1
parent 82643 f1c14af17591
permissions -rw-r--r--
merged
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75806
2b106aae897c added support for cvc5 (whose interface is almost identical to CVC4)
blanchet
parents: 75365
diff changeset
     1
(*  Title:      HOL/Tools/SMT/cvc_proof_parse.ML
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
     3
75806
2b106aae897c added support for cvc5 (whose interface is almost identical to CVC4)
blanchet
parents: 75365
diff changeset
     4
CVC4 and cvc5 proof (actually, unsat core) parsing.
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
     5
*)
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
     6
75806
2b106aae897c added support for cvc5 (whose interface is almost identical to CVC4)
blanchet
parents: 75365
diff changeset
     7
signature CVC_PROOF_PARSE =
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
     8
sig
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
     9
  val parse_proof: SMT_Translate.replay_data ->
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    10
    ((string * ATP_Problem_Generate.stature) * thm) list -> term list -> term -> string list ->
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    11
    SMT_Solver.parsed_proof
78177
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    12
  val parse_proof_lethe: SMT_Translate.replay_data ->
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    13
    ((string * ATP_Problem_Generate.stature) * thm) list -> term list -> term -> string list ->
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    14
    SMT_Solver.parsed_proof
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    15
  val cvc_matching_assms: Proof.context -> thm list -> term list -> term -> thm -> bool
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    16
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    17
end;
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    18
75806
2b106aae897c added support for cvc5 (whose interface is almost identical to CVC4)
blanchet
parents: 75365
diff changeset
    19
structure CVC_Proof_Parse: CVC_PROOF_PARSE =
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    20
struct
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    21
78177
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    22
open ATP_Util
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    23
open ATP_Problem
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    24
open ATP_Proof
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    25
open ATP_Proof_Reconstruct
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    26
open Lethe_Isar
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    27
open Lethe_Proof
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    28
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    29
(*taken from verit*)
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    30
fun add_used_asserts_in_step (Lethe_Proof.Lethe_Step {prems, ...}) =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    31
  union (op =) (map_filter (try (snd o SMTLIB_Interface.role_and_index_of_assert_name)) prems)
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    32
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    33
fun cvc_matching_assms ctxt rewrite_rules ll_defs th th' =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    34
  let
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    35
    val expand =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    36
       not (null ll_defs) ? SMTLIB_Isar.unlift_term ll_defs
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    37
       #> Object_Logic.dest_judgment ctxt o (Thm.cterm_of ctxt)
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    38
       #> Thm.eta_long_conversion
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    39
       #> Thm.prop_of
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    40
       #> snd o Logic.dest_equals
82643
f1c14af17591 prefer Simplifier over bootstrap-only Raw_Simplifier
haftmann
parents: 78177
diff changeset
    41
       #> Simplifier.rewrite_term (Proof_Context.theory_of
78177
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    42
          (empty_simpset ctxt addsimps rewrite_rules (*@ @{thms eq_True} still useful?*))) rewrite_rules []
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    43
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    44
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    45
    val normalize = 
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    46
       Object_Logic.dest_judgment ctxt o (Thm.cprop_of)
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    47
       #> Thm.eta_long_conversion
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    48
       #> Thm.prop_of
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    49
       #> snd o Logic.dest_equals
82643
f1c14af17591 prefer Simplifier over bootstrap-only Raw_Simplifier
haftmann
parents: 78177
diff changeset
    50
       #> Simplifier.rewrite_term (Proof_Context.theory_of
78177
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    51
          (empty_simpset ctxt addsimps rewrite_rules @ @{thms eq_True})) rewrite_rules []
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    52
  in (expand th) aconv (normalize th') end
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    53
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    54
fun parse_proof_unsatcore ({ll_defs, assms, ...} : SMT_Translate.replay_data) xfacts prems _ output =
60201
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    55
  if exists (String.isPrefix "(error \"This build of CVC4 doesn't have proof support") output then
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    56
    {outcome = NONE, fact_ids = NONE, atp_proof = K []}
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    57
  else
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    58
    let
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    59
      val num_ll_defs = length ll_defs
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    60
60201
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    61
      val id_of_index = Integer.add num_ll_defs
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    62
      val index_of_id = Integer.add (~ num_ll_defs)
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    63
75274
e89709b80b6e used more descriptive assert names in SMT-Lib output
desharna
parents: 60201
diff changeset
    64
      val used_assert_ids =
e89709b80b6e used more descriptive assert names in SMT-Lib output
desharna
parents: 60201
diff changeset
    65
        map_filter (try (snd o SMTLIB_Interface.role_and_index_of_assert_name)) output
60201
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    66
      val used_assm_js =
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    67
        map_filter (fn id => let val i = index_of_id id in if i >= 0 then SOME i else NONE end)
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    68
          used_assert_ids
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    69
60201
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    70
      val conjecture_i = 0
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    71
      val prems_i = conjecture_i + 1
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    72
      val num_prems = length prems
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    73
      val facts_i = prems_i + num_prems
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    74
60201
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    75
      val fact_ids' =
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    76
        map_filter (fn j =>
75365
83940294cc67 fixed generation of Isar proofs e89709b80b6e
desharna
parents: 75274
diff changeset
    77
          let val ((i, _), _) = nth assms j in
60201
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    78
            try (apsnd (nth xfacts)) (id_of_index j, i - facts_i)
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    79
          end) used_assm_js
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    80
    in
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    81
      {outcome = NONE, fact_ids = SOME fact_ids', atp_proof = K []}
90e88e521e0e made CVC4 support work also without unsat cores
blanchet
parents: 59015
diff changeset
    82
    end
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
    83
78177
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    84
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    85
fun parse_proof_lethe
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    86
    ({context = ctxt, typs, terms, ll_defs, rewrite_rules, assms} : SMT_Translate.replay_data)
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    87
    xfacts prems concl output =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    88
   if exists (String.isPrefix "(error \"This build of CVC4 doesn't have proof support") output then
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    89
     {outcome = NONE, fact_ids = NONE, atp_proof = K []}
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    90
   else
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    91
     let
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    92
    val num_ll_defs = length ll_defs
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    93
    val id_of_index = Integer.add num_ll_defs
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    94
    val index_of_id = Integer.add (~ num_ll_defs)
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    95
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    96
    fun step_of_assume i ((_, role), th) =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    97
      let
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    98
        val th = Thm.prop_of th
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
    99
        fun matching (_, th') = cvc_matching_assms ctxt rewrite_rules ll_defs th th'
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   100
      in
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   101
        case List.find matching assms of
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   102
          NONE => []
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   103
        | SOME (k, _) =>
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   104
          Lethe_Proof.Lethe_Step 
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   105
           {id = SMTLIB_Interface.assert_name_of_role_and_index role (id_of_index i),
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   106
            rule = input_rule, prems = [], proof_ctxt = [], concl = th, fixes = []}
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   107
          |> single
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   108
      end
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   109
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   110
    val (actual_steps, _) = Lethe_Proof.parse typs terms output ctxt
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   111
    val used_assert_ids = fold add_used_asserts_in_step actual_steps []
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   112
    val used_assm_js =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   113
      map_filter (fn id => let val i = index_of_id id in if i >= 0 then SOME i else NONE end)
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   114
        used_assert_ids
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   115
    val used_assms = map (nth assms) used_assm_js
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   116
    val assm_steps = map2 step_of_assume used_assm_js used_assms
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   117
        |> flat
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   118
    val steps = assm_steps @ actual_steps
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   119
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   120
    val conjecture_i = 0
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   121
    val prems_i = conjecture_i + 1
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   122
    val num_prems = length prems
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   123
    val facts_i = prems_i + num_prems
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   124
    val num_facts = length xfacts
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   125
    val helpers_i = facts_i + num_facts
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   126
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   127
    val conjecture_id = id_of_index conjecture_i
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   128
    val prem_ids = map id_of_index (prems_i upto prems_i + num_prems - 1)
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   129
    val fact_ids' =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   130
      map_filter (fn j =>
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   131
        let val ((i, _), _) = nth assms j in
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   132
          try (apsnd (nth xfacts)) (id_of_index j, i - facts_i)
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   133
        end) used_assm_js
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   134
    val helper_ids' =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   135
      map_filter (fn ((i, _), thm) => if i >= helpers_i then SOME (i, thm) else NONE) used_assms
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   136
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   137
    val fact_helper_ts =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   138
      map (fn (_, th) => (ATP_Util.short_thm_name ctxt th, Thm.prop_of th)) helper_ids' @
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   139
      map (fn (_, ((s, _), th)) => (s, Thm.prop_of th)) fact_ids'
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   140
    val fact_helper_ids' =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   141
      map (apsnd (ATP_Util.short_thm_name ctxt)) helper_ids' @ map (apsnd (fst o fst)) fact_ids'
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   142
  in
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   143
    {outcome = NONE, fact_ids = SOME fact_ids',
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   144
     atp_proof = fn () => atp_proof_of_veriT_proof ctxt ll_defs rewrite_rules prems concl
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   145
       fact_helper_ts prem_ids conjecture_id fact_helper_ids' steps}
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   146
  end
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   147
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   148
fun parse_proof (rep as {context = ctxt, ...}) =
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   149
  if SMT_Config.use_lethe_proof_from_cvc ctxt
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   150
  then parse_proof_unsatcore rep
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   151
  else parse_proof_unsatcore rep
ea7a3cc64df5 early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 75806
diff changeset
   152
59015
627a93f67182 parse CVC4 unsat cores
blanchet
parents:
diff changeset
   153
end;