src/HOL/Tools/SMT/smt_replay.ML
author fleury <Mathias.Fleury@mpi-inf.mpg.de>
Tue, 30 Oct 2018 16:24:01 +0100
changeset 69204 d5ab1636660b
child 69593 3dda49e08b9d
permissions -rw-r--r--
split SMT reconstruction into library
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     1
(*  Title:      HOL/Tools/SMT/smt_replay.ML
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     2
    Author:     Sascha Boehme, TU Muenchen
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     3
    Author:     Jasmin Blanchette, TU Muenchen
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     4
    Author:     Mathias Fleury, MPII
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     5
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     6
Shared library for parsing and replay.
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     7
*)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     8
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
     9
signature SMT_REPLAY =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    10
sig
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    11
  (*theorem nets*)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    12
  val thm_net_of: ('a -> thm) -> 'a list -> 'a Net.net
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    13
  val net_instances: (int * thm) Net.net -> cterm -> (int * thm) list
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    14
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    15
  (*proof combinators*)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    16
  val under_assumption: (thm -> thm) -> cterm -> thm
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    17
  val discharge: thm -> thm -> thm
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    18
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    19
  (*a faster COMP*)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    20
  type compose_data = cterm list * (cterm -> cterm list) * thm
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    21
  val precompose: (cterm -> cterm list) -> thm -> compose_data
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    22
  val precompose2: (cterm -> cterm * cterm) -> thm -> compose_data
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    23
  val compose: compose_data -> thm -> thm
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    24
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    25
  (*simpset*)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    26
  val add_simproc: Simplifier.simproc -> Context.generic -> Context.generic
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    27
  val make_simpset: Proof.context -> thm list -> simpset
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    28
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    29
  (*assertion*)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    30
  val add_asserted:  ('a * ('b * thm) -> 'c -> 'c) ->
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    31
    'c -> ('d -> 'a * 'e * term * 'b) -> ('e -> bool) -> Proof.context -> thm list ->
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    32
    (int * thm) list -> 'd list -> Proof.context ->
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    33
    ((int * ('a * thm)) list * thm list) * (Proof.context * 'c)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    34
  
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    35
  (*statistics*)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    36
  val pretty_statistics: string -> int -> int list Symtab.table -> Pretty.T
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    37
  val intermediate_statistics: Proof.context -> Timing.start -> int -> int -> unit
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    38
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    39
  (*theorem transformation*)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    40
  val varify: Proof.context -> thm -> thm
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    41
  val params_of: term -> (string * typ) list
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    42
end;
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    43
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    44
structure SMT_Replay : SMT_REPLAY =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    45
struct
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    46
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    47
(* theorem nets *)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    48
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    49
fun thm_net_of f xthms =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    50
  let fun insert xthm = Net.insert_term (K false) (Thm.prop_of (f xthm), xthm)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    51
  in fold insert xthms Net.empty end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    52
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    53
fun maybe_instantiate ct thm =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    54
  try Thm.first_order_match (Thm.cprop_of thm, ct)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    55
  |> Option.map (fn inst => Thm.instantiate inst thm)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    56
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    57
local
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    58
  fun instances_from_net match f net ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    59
    let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    60
      val lookup = if match then Net.match_term else Net.unify_term
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    61
      val xthms = lookup net (Thm.term_of ct)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    62
      fun select ct = map_filter (f (maybe_instantiate ct)) xthms
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    63
      fun select' ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    64
        let val thm = Thm.trivial ct
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    65
        in map_filter (f (try (fn rule => rule COMP thm))) xthms end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    66
    in (case select ct of [] => select' ct | xthms' => xthms') end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    67
in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    68
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    69
fun net_instances net =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    70
  instances_from_net false (fn f => fn (i, thm) => Option.map (pair i) (f thm))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    71
    net
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    72
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    73
end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    74
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    75
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    76
(* proof combinators *)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    77
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    78
fun under_assumption f ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    79
  let val ct' = SMT_Util.mk_cprop ct in Thm.implies_intr ct' (f (Thm.assume ct')) end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    80
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    81
fun discharge p pq = Thm.implies_elim pq p
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    82
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    83
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    84
(* a faster COMP *)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    85
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    86
type compose_data = cterm list * (cterm -> cterm list) * thm
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    87
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    88
fun list2 (x, y) = [x, y]
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    89
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    90
fun precompose f rule : compose_data = (f (Thm.cprem_of rule 1), f, rule)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    91
fun precompose2 f rule : compose_data = precompose (list2 o f) rule
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    92
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    93
fun compose (cvs, f, rule) thm =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    94
  discharge thm
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    95
    (Thm.instantiate ([], map (dest_Var o Thm.term_of) cvs ~~ f (Thm.cprop_of thm)) rule)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    96
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    97
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    98
(* simpset *)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    99
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   100
local
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   101
  val antisym_le1 = mk_meta_eq @{thm order_class.antisym_conv}
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   102
  val antisym_le2 = mk_meta_eq @{thm linorder_class.antisym_conv2}
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   103
  val antisym_less1 = mk_meta_eq @{thm linorder_class.antisym_conv1}
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   104
  val antisym_less2 = mk_meta_eq @{thm linorder_class.antisym_conv3}
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   105
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   106
  fun eq_prop t thm = HOLogic.mk_Trueprop t aconv Thm.prop_of thm
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   107
  fun dest_binop ((c as Const _) $ t $ u) = (c, t, u)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   108
    | dest_binop t = raise TERM ("dest_binop", [t])
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   109
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   110
  fun prove_antisym_le ctxt ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   111
    let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   112
      val (le, r, s) = dest_binop (Thm.term_of ct)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   113
      val less = Const (@{const_name less}, Term.fastype_of le)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   114
      val prems = Simplifier.prems_of ctxt
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   115
    in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   116
      (case find_first (eq_prop (le $ s $ r)) prems of
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   117
        NONE =>
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   118
          find_first (eq_prop (HOLogic.mk_not (less $ r $ s))) prems
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   119
          |> Option.map (fn thm => thm RS antisym_less1)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   120
      | SOME thm => SOME (thm RS antisym_le1))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   121
    end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   122
    handle THM _ => NONE
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   123
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   124
  fun prove_antisym_less ctxt ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   125
    let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   126
      val (less, r, s) = dest_binop (HOLogic.dest_not (Thm.term_of ct))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   127
      val le = Const (@{const_name less_eq}, Term.fastype_of less)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   128
      val prems = Simplifier.prems_of ctxt
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   129
    in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   130
      (case find_first (eq_prop (le $ r $ s)) prems of
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   131
        NONE =>
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   132
          find_first (eq_prop (HOLogic.mk_not (less $ s $ r))) prems
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   133
          |> Option.map (fn thm => thm RS antisym_less2)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   134
      | SOME thm => SOME (thm RS antisym_le2))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   135
  end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   136
  handle THM _ => NONE
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   137
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   138
  val basic_simpset =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   139
    simpset_of (put_simpset HOL_ss @{context}
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   140
      addsimps @{thms field_simps times_divide_eq_right times_divide_eq_left arith_special
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   141
        arith_simps rel_simps array_rules z3div_def z3mod_def NO_MATCH_def}
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   142
      addsimprocs [@{simproc numeral_divmod},
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   143
        Simplifier.make_simproc @{context} "fast_int_arith"
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   144
         {lhss = [@{term "(m::int) < n"}, @{term "(m::int) \<le> n"}, @{term "(m::int) = n"}],
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   145
          proc = K Lin_Arith.simproc},
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   146
        Simplifier.make_simproc @{context} "antisym_le"
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   147
         {lhss = [@{term "(x::'a::order) \<le> y"}],
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   148
          proc = K prove_antisym_le},
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   149
        Simplifier.make_simproc @{context} "antisym_less"
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   150
         {lhss = [@{term "\<not> (x::'a::linorder) < y"}],
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   151
          proc = K prove_antisym_less}])
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   152
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   153
  structure Simpset = Generic_Data
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   154
  (
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   155
    type T = simpset
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   156
    val empty = basic_simpset
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   157
    val extend = I
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   158
    val merge = Simplifier.merge_ss
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   159
  )
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   160
in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   161
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   162
fun add_simproc simproc context =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   163
  Simpset.map (simpset_map (Context.proof_of context)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   164
    (fn ctxt => ctxt addsimprocs [simproc])) context
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   165
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   166
fun make_simpset ctxt rules =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   167
  simpset_of (put_simpset (Simpset.get (Context.Proof ctxt)) ctxt addsimps rules)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   168
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   169
end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   170
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   171
local
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   172
  val remove_trigger = mk_meta_eq @{thm trigger_def}
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   173
  val remove_fun_app = mk_meta_eq @{thm fun_app_def}
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   174
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   175
  fun rewrite_conv _ [] = Conv.all_conv
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   176
    | rewrite_conv ctxt eqs = Simplifier.full_rewrite (empty_simpset ctxt addsimps eqs)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   177
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   178
  val rewrite_true_rule = @{lemma "True \<equiv> \<not> False" by simp}
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   179
  val prep_rules = [@{thm Let_def}, remove_trigger, remove_fun_app, rewrite_true_rule]
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   180
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   181
  fun rewrite _ [] = I
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   182
    | rewrite ctxt eqs = Conv.fconv_rule (rewrite_conv ctxt eqs)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   183
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   184
  fun lookup_assm assms_net ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   185
    net_instances assms_net ct
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   186
    |> map (fn ithm as (_, thm) => (ithm, Thm.cprop_of thm aconvc ct))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   187
in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   188
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   189
fun add_asserted tab_update tab_empty p_extract cond outer_ctxt rewrite_rules assms steps ctxt =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   190
  let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   191
    val eqs = map (rewrite ctxt [rewrite_true_rule]) rewrite_rules
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   192
    val eqs' = union Thm.eq_thm eqs prep_rules
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   193
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   194
    val assms_net =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   195
      assms
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   196
      |> map (apsnd (rewrite ctxt eqs'))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   197
      |> map (apsnd (Conv.fconv_rule Thm.eta_conversion))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   198
      |> thm_net_of snd
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   199
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   200
    fun revert_conv ctxt = rewrite_conv ctxt eqs' then_conv Thm.eta_conversion
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   201
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   202
    fun assume thm ctxt =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   203
      let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   204
        val ct = Thm.cprem_of thm 1
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   205
        val (thm', ctxt') = yield_singleton Assumption.add_assumes ct ctxt
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   206
      in (thm' RS thm, ctxt') end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   207
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   208
    fun add1 id fixes thm1 ((i, th), exact) ((iidths, thms), (ctxt, ptab)) =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   209
      let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   210
        val (thm, ctxt') = if exact then (Thm.implies_elim thm1 th, ctxt) else assume thm1 ctxt
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   211
        val thms' = if exact then thms else th :: thms
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   212
      in (((i, (id, th)) :: iidths, thms'), (ctxt', tab_update (id, (fixes, thm)) ptab)) end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   213
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   214
    fun add step
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   215
        (cx as ((iidths, thms), (ctxt, ptab))) =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   216
      let val (id, rule, concl, fixes) = p_extract step in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   217
        if (*Z3_Proof.is_assumption rule andalso rule <> Z3_Proof.Hypothesis*) cond rule then
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   218
          let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   219
            val ct = Thm.cterm_of ctxt concl
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   220
            val thm1 = Thm.trivial ct |> Conv.fconv_rule (Conv.arg1_conv (revert_conv outer_ctxt))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   221
            val thm2 = singleton (Variable.export ctxt outer_ctxt) thm1
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   222
          in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   223
            (case lookup_assm assms_net (Thm.cprem_of thm2 1) of
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   224
              [] =>
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   225
                let val (thm, ctxt') = assume thm1 ctxt
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   226
                in ((iidths, thms), (ctxt', tab_update (id, (fixes, thm)) ptab)) end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   227
            | ithms => fold (add1 id fixes thm1) ithms cx)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   228
          end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   229
        else
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   230
          cx
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   231
      end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   232
  in fold add steps (([], []), (ctxt, tab_empty)) end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   233
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   234
end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   235
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   236
fun params_of t = Term.strip_qnt_vars @{const_name Pure.all} t
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   237
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   238
fun varify ctxt thm =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   239
  let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   240
    val maxidx = Thm.maxidx_of thm + 1
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   241
    val vs = params_of (Thm.prop_of thm)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   242
    val vars = map_index (fn (i, (n, T)) => Var ((n, i + maxidx), T)) vs
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   243
  in Drule.forall_elim_list (map (Thm.cterm_of ctxt) vars) thm end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   244
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   245
fun intermediate_statistics ctxt start total =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   246
  SMT_Config.statistics_msg ctxt (fn current =>
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   247
    "Reconstructed " ^ string_of_int current ^ " of " ^ string_of_int total ^ " steps in " ^
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   248
    string_of_int (Time.toMilliseconds (#elapsed (Timing.result start))) ^ " ms")
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   249
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   250
fun pretty_statistics solver total stats =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   251
  let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   252
    fun mean_of is =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   253
      let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   254
        val len = length is
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   255
        val mid = len div 2
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   256
      in if len mod 2 = 0 then (nth is (mid - 1) + nth is mid) div 2 else nth is mid end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   257
    fun pretty_item name p = Pretty.item (Pretty.separate ":" [Pretty.str name, p])
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   258
    fun pretty (name, milliseconds) = pretty_item name (Pretty.block (Pretty.separate "," [
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   259
      Pretty.str (string_of_int (length milliseconds) ^ " occurrences") ,
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   260
      Pretty.str (string_of_int (mean_of milliseconds) ^ " ms mean time"),
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   261
      Pretty.str (string_of_int (fold Integer.max milliseconds 0) ^ " ms maximum time"),
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   262
      Pretty.str (string_of_int (fold Integer.add milliseconds 0) ^ " ms total time")]))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   263
  in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   264
    Pretty.big_list (solver ^ " proof reconstruction statistics:") (
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   265
      pretty_item "total time" (Pretty.str (string_of_int total ^ " ms")) ::
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   266
      map pretty (Symtab.dest stats))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   267
  end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   268
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   269
end;