src/HOL/Tools/SMT/verit_replay.ML
author wenzelm
Sat, 01 Jun 2019 11:29:59 +0200
changeset 70299 83774d669b51
parent 69593 3dda49e08b9d
child 72458 b44e894796d5
permissions -rw-r--r--
Added tag Isabelle2019-RC4 for changeset ad2d84c42380
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     1
(*  Title:      HOL/Tools/SMT/verit_replay.ML
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     2
    Author:     Mathias Fleury, MPII
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     3
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     4
VeriT proof parsing and replay.
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     5
*)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     6
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     7
signature VERIT_REPLAY =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     8
sig
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     9
  val replay: Proof.context -> SMT_Translate.replay_data -> string list -> thm
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    10
end;
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    11
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    12
structure Verit_Replay: VERIT_REPLAY =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    13
struct
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    14
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    15
fun under_fixes f unchanged_prems (prems, nthms) names args (concl, ctxt) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    16
  let
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    17
    val thms1 = unchanged_prems @ map (SMT_Replay.varify ctxt) prems
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69205
diff changeset
    18
    val _ =  SMT_Config.veriT_msg ctxt (fn () => \<^print>  ("names =", names))
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    19
    val thms2 = map snd nthms
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69205
diff changeset
    20
    val _ = SMT_Config.veriT_msg ctxt (fn () => \<^print> ("prems=", prems))
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69205
diff changeset
    21
    val _ = SMT_Config.veriT_msg ctxt (fn () => \<^print> ("nthms=", nthms))
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69205
diff changeset
    22
    val _ = SMT_Config.veriT_msg ctxt (fn () => \<^print> ("thms1=", thms1))
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69205
diff changeset
    23
    val _ = SMT_Config.veriT_msg ctxt (fn () => \<^print> ("thms2=", thms2))
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    24
  in (f ctxt (thms1 @ thms2) args concl) end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    25
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    26
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    27
(** Replaying **)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    28
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    29
fun replay_thm method_for rewrite_rules ll_defs ctxt assumed unchanged_prems prems nthms
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    30
    concl_transformation global_transformation args
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    31
    (VeriT_Proof.VeriT_Replay_Node {id, rule, concl, bounds,  ...}) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    32
  let
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69205
diff changeset
    33
    val _ = SMT_Config.veriT_msg ctxt (fn () => \<^print> id)
69205
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    34
    val rewrite = let val thy = Proof_Context.theory_of (empty_simpset ctxt) in
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    35
        Raw_Simplifier.rewrite_term thy rewrite_rules []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    36
        #> not (null ll_defs) ? SMTLIB_Isar.unlift_term ll_defs
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    37
      end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    38
    val post = let val thy = Proof_Context.theory_of (empty_simpset ctxt) in
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    39
        Raw_Simplifier.rewrite_term thy rewrite_rules []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    40
        #> Object_Logic.atomize_term ctxt
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    41
        #> not (null ll_defs) ? SMTLIB_Isar.unlift_term ll_defs
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    42
        #> SMTLIB_Isar.unskolemize_names ctxt
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    43
        #> HOLogic.mk_Trueprop
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    44
      end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    45
    val concl = concl
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    46
      |> concl_transformation
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    47
      |> global_transformation
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    48
      |> post
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    49
in
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    50
  if rule = VeriT_Proof.veriT_input_rule then
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    51
    (case Symtab.lookup assumed id of
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    52
      SOME (_, thm) => thm)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    53
  else
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    54
    under_fixes (method_for rule) unchanged_prems
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    55
      (prems, nthms) (map fst bounds)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    56
      (map rewrite args) (concl, ctxt)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    57
end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    58
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    59
fun add_used_asserts_in_step (VeriT_Proof.VeriT_Replay_Node {prems,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    60
    subproof = (_, _, subproof), ...}) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    61
  union (op =) (map_filter (try SMTLIB_Interface.assert_index_of_name) prems @
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    62
     flat (map (fn x => add_used_asserts_in_step x []) subproof))
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    63
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    64
fun remove_rewrite_rules_from_rules n =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    65
  (fn (step as VeriT_Proof.VeriT_Replay_Node {id, ...}) =>
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    66
    (case try SMTLIB_Interface.assert_index_of_name id of
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    67
      NONE => SOME step
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    68
    | SOME a => if a < n then NONE else SOME step))
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    69
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    70
fun replay_step rewrite_rules ll_defs assumed proof_prems
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    71
  (step as VeriT_Proof.VeriT_Replay_Node {id, rule, prems, bounds, args,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    72
     subproof = (fixes, assms, subproof), concl, ...}) state =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    73
  let
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    74
    val (proofs, stats, ctxt, concl_tranformation, global_transformation) = state
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    75
    val (_, ctxt) = Variable.variant_fixes (map fst bounds) ctxt
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    76
      |> (fn (names, ctxt) => (names,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    77
        fold Variable.declare_term [SMTLIB_Isar.unskolemize_names ctxt concl] ctxt))
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    78
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    79
    val (names, sub_ctxt) = Variable.variant_fixes (map fst fixes) ctxt
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    80
       ||> fold Variable.declare_term (map Free fixes)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    81
    val export_vars =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    82
      Term.subst_free (ListPair.zip (map Free fixes, map Free (ListPair.zip (names, map snd fixes))))
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    83
      o concl_tranformation
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    84
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    85
    val post = let val thy = Proof_Context.theory_of (empty_simpset ctxt) in
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    86
        Raw_Simplifier.rewrite_term thy rewrite_rules []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    87
        #> Object_Logic.atomize_term ctxt
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    88
        #> not (null ll_defs) ? SMTLIB_Isar.unlift_term ll_defs
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    89
        #> SMTLIB_Isar.unskolemize_names ctxt
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    90
        #> HOLogic.mk_Trueprop
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    91
      end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    92
    val assms = map (export_vars o global_transformation o post) assms
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    93
    val (proof_prems', sub_ctxt2) = Assumption.add_assumes (map (Thm.cterm_of sub_ctxt) assms)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    94
      sub_ctxt
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    95
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    96
    val all_proof_prems = proof_prems @ proof_prems'
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    97
    val (proofs', stats, _, _, sub_global_rew) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    98
       fold (replay_step rewrite_rules ll_defs assumed all_proof_prems) subproof
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    99
         (assumed, stats, sub_ctxt2, export_vars, global_transformation)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   100
    val export_thm = singleton (Proof_Context.export sub_ctxt2 ctxt)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   101
    val nthms = prems
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   102
      |>  map (apsnd export_thm o the o (Symtab.lookup (if null subproof then proofs else proofs')))
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   103
    val proof_prems =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   104
       if Verit_Replay_Methods.veriT_step_requires_subproof_assms rule then proof_prems else []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   105
    val replay = Timing.timing (replay_thm Verit_Replay_Methods.method_for rewrite_rules ll_defs
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   106
       ctxt assumed [] (proof_prems) nthms concl_tranformation global_transformation args)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   107
    val ({elapsed, ...}, thm) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   108
      SMT_Config.with_time_limit ctxt SMT_Config.reconstruction_step_timeout replay step
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   109
        handle Timeout.TIMEOUT _ => raise SMT_Failure.SMT SMT_Failure.Time_Out
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   110
    val stats' = Symtab.cons_list (rule, Time.toMilliseconds elapsed) stats
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   111
  in (Symtab.update (id, (map fst bounds, thm)) proofs, stats', ctxt,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   112
       concl_tranformation, sub_global_rew) end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   113
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   114
fun replay_ll_def assms ll_defs rewrite_rules stats ctxt term =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   115
  let
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   116
    val rewrite = let val thy = Proof_Context.theory_of (empty_simpset ctxt) in
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   117
        Raw_Simplifier.rewrite_term thy rewrite_rules []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   118
        #> not (null ll_defs) ? SMTLIB_Isar.unlift_term ll_defs
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   119
      end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   120
   val replay = Timing.timing (SMT_Replay_Methods.prove ctxt (rewrite term))
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   121
    val ({elapsed, ...}, thm) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   122
      SMT_Config.with_time_limit ctxt SMT_Config.reconstruction_step_timeout replay
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   123
         (fn _ => Method.insert_tac ctxt (map snd assms) THEN' Classical.fast_tac ctxt)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   124
        handle Timeout.TIMEOUT _ => raise SMT_Failure.SMT SMT_Failure.Time_Out
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   125
    val stats' = Symtab.cons_list ("ll_defs", Time.toMilliseconds elapsed) stats
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   126
  in
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   127
    (thm, stats')
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   128
  end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   129
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   130
fun replay outer_ctxt
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   131
    ({context = ctxt, typs, terms, rewrite_rules, assms, ll_defs, ...} : SMT_Translate.replay_data)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   132
     output =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   133
  let
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   134
    val rewrite_rules =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   135
      filter_out (fn thm => Term.could_unify (Thm.prop_of @{thm verit_eq_true_simplify},
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   136
          Thm.prop_of thm))
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   137
        rewrite_rules
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   138
    val num_ll_defs = length ll_defs
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   139
    val index_of_id = Integer.add (~ num_ll_defs)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   140
    val id_of_index = Integer.add num_ll_defs
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   141
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   142
    val (actual_steps, ctxt2) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   143
      VeriT_Proof.parse_replay typs terms output ctxt
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   144
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   145
    fun step_of_assume (j, (_, th)) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   146
      VeriT_Proof.VeriT_Replay_Node {
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   147
        id = SMTLIB_Interface.assert_name_of_index (id_of_index j),
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   148
        rule = VeriT_Proof.veriT_input_rule,
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   149
        args = [],
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   150
        prems = [],
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   151
        proof_ctxt = [],
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   152
        concl = Thm.prop_of th
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   153
          |> Raw_Simplifier.rewrite_term (Proof_Context.theory_of
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   154
               (empty_simpset ctxt addsimps rewrite_rules)) [] [],
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   155
        bounds = [],
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   156
        subproof = ([], [], [])}
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   157
    val used_assert_ids = fold add_used_asserts_in_step actual_steps []
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   158
    fun normalize_tac ctxt = let val thy = Proof_Context.theory_of (empty_simpset ctxt) in
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   159
      Raw_Simplifier.rewrite_term thy rewrite_rules [] end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   160
    val used_assm_js =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   161
      map_filter (fn id => let val i = index_of_id id in if i >= 0 then SOME (i, nth assms i)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   162
          else NONE end)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   163
        used_assert_ids
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   164
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   165
    val assm_steps = map step_of_assume used_assm_js
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   166
    val steps = assm_steps @ actual_steps
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   167
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   168
    fun extract (VeriT_Proof.VeriT_Replay_Node {id, rule, concl, bounds, ...}) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   169
         (id, rule, concl, map fst bounds)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   170
    fun cond rule = rule = VeriT_Proof.veriT_input_rule
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   171
    val add_asssert = SMT_Replay.add_asserted Symtab.update Symtab.empty extract cond
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   172
    val ((_, _), (ctxt3, assumed)) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   173
      add_asssert outer_ctxt rewrite_rules assms
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   174
        (map_filter (remove_rewrite_rules_from_rules num_ll_defs) steps) ctxt2
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   175
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   176
    val used_rew_js =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   177
      map_filter (fn id => let val i = index_of_id id in if i < 0
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   178
          then SOME (id, normalize_tac ctxt (nth ll_defs id)) else NONE end)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   179
        used_assert_ids
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   180
    val (assumed, stats) = fold (fn ((id, thm)) => fn (assumed, stats) =>
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   181
           let val (thm, stats) =  replay_ll_def assms ll_defs rewrite_rules stats ctxt thm
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   182
           in (Symtab.update (SMTLIB_Interface.assert_name_of_index id, ([], thm)) assumed, stats)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   183
           end)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   184
         used_rew_js (assumed,  Symtab.empty)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   185
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   186
    val ctxt4 =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   187
      ctxt3
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   188
      |> put_simpset (SMT_Replay.make_simpset ctxt3 [])
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   189
      |> Config.put SAT.solver (Config.get ctxt3 SMT_Config.sat_solver)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   190
    val len = length steps
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   191
    val start = Timing.start ()
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   192
    val print_runtime_statistics = SMT_Replay.intermediate_statistics ctxt4 start len
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   193
    fun blockwise f (i, x) y =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   194
      (if i > 0 andalso i mod 100 = 0 then print_runtime_statistics i else (); f x y)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   195
    val (proofs, stats, ctxt5, _, _) =
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   196
      fold_index (blockwise (replay_step rewrite_rules ll_defs assumed [])) steps
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   197
        (assumed, stats, ctxt4, fn x => x, fn x => x)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   198
    val _ = print_runtime_statistics len
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   199
    val total = Time.toMilliseconds (#elapsed (Timing.result start))
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   200
    val (_, VeriT_Proof.VeriT_Replay_Node {id, ...}) = split_last steps
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   201
    val _ = SMT_Config.statistics_msg ctxt5
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   202
      (Pretty.string_of o SMT_Replay.pretty_statistics "veriT" total) stats
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   203
  in
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   204
    Symtab.lookup proofs id |> the |> snd |> singleton (Proof_Context.export ctxt5 outer_ctxt)
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   205
  end
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   206
8050734eee3e add reconstruction by veriT in method smt
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   207
end