src/HOL/Tools/SMT/smt_replay.ML
author haftmann
Thu, 19 Jun 2025 17:15:40 +0200
changeset 82734 89347c0cc6a3
parent 81942 da3c3948a39c
permissions -rw-r--r--
treat map_filter similar to list_all, list_ex, list_ex1
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
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
    42
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
    43
  (*spy*)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
    44
  val spying: bool -> Proof.context -> (unit -> string) -> string -> unit
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
    45
  val print_stats: (string * int list) list -> string
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    46
end;
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    47
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    48
structure SMT_Replay : SMT_REPLAY =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    49
struct
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    50
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    51
(* theorem nets *)
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 thm_net_of f xthms =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    54
  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
    55
  in fold insert xthms Net.empty end
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
fun maybe_instantiate ct thm =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    58
  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
    59
  |> Option.map (fn inst => Thm.instantiate inst thm)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    60
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    61
local
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    62
  fun instances_from_net match f net ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    63
    let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    64
      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
    65
      val xthms = lookup net (Thm.term_of ct)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    66
      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
    67
      fun select' ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    68
        let val thm = Thm.trivial ct
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    69
        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
    70
    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
    71
in
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
fun net_instances net =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    74
  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
    75
    net
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    76
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    77
end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    78
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    79
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    80
(* proof combinators *)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    81
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    82
fun under_assumption f ct =
81942
da3c3948a39c clarified signature: more uniform cterm operations, without context;
wenzelm
parents: 80701
diff changeset
    83
  let val ct' = HOLogic.mk_judgment ct in Thm.implies_intr ct' (f (Thm.assume ct')) end
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    84
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    85
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
    86
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
(* a faster COMP *)
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
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
    91
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    92
fun list2 (x, y) = [x, y]
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    93
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    94
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
    95
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
    96
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    97
fun compose (cvs, f, rule) thm =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
    98
  discharge thm
74282
c2ee8d993d6a clarified signature: more scalable operations;
wenzelm
parents: 72458
diff changeset
    99
    (Thm.instantiate
c2ee8d993d6a clarified signature: more scalable operations;
wenzelm
parents: 72458
diff changeset
   100
      (TVars.empty, Vars.make (map (dest_Var o Thm.term_of) cvs ~~ f (Thm.cprop_of thm))) rule)
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   101
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   102
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   103
(* simpset *)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   104
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   105
local
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   106
  val antisym_le1 = mk_meta_eq @{thm order_class.antisym_conv}
70749
5d06b7bb9d22 More type class generalisations. Note that linorder_antisym_conv1 and linorder_antisym_conv2 no longer exist.
paulson <lp15@cam.ac.uk>
parents: 70320
diff changeset
   107
  val antisym_le2 = mk_meta_eq @{thm order_class.antisym_conv2}
5d06b7bb9d22 More type class generalisations. Note that linorder_antisym_conv1 and linorder_antisym_conv2 no longer exist.
paulson <lp15@cam.ac.uk>
parents: 70320
diff changeset
   108
  val antisym_less1 = mk_meta_eq @{thm order_class.antisym_conv1}
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   109
  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
   110
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   111
  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
   112
  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
   113
    | dest_binop t = raise TERM ("dest_binop", [t])
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   114
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   115
  fun prove_antisym_le ctxt ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   116
    let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   117
      val (le, r, s) = dest_binop (Thm.term_of ct)
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69204
diff changeset
   118
      val less = Const (\<^const_name>\<open>less\<close>, Term.fastype_of le)
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   119
      val prems = Simplifier.prems_of ctxt
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   120
    in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   121
      (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
   122
        NONE =>
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   123
          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
   124
          |> Option.map (fn thm => thm RS antisym_less1)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   125
      | SOME thm => SOME (thm RS antisym_le1))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   126
    end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   127
    handle THM _ => NONE
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   128
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   129
  fun prove_antisym_less ctxt ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   130
    let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   131
      val (less, r, s) = dest_binop (HOLogic.dest_not (Thm.term_of ct))
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69204
diff changeset
   132
      val le = Const (\<^const_name>\<open>less_eq\<close>, Term.fastype_of less)
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   133
      val prems = Simplifier.prems_of ctxt
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   134
    in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   135
      (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
   136
        NONE =>
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   137
          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
   138
          |> Option.map (fn thm => thm RS antisym_less2)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   139
      | SOME thm => SOME (thm RS antisym_le2))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   140
  end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   141
  handle THM _ => NONE
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   142
78808
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   143
  val fast_int_arith_simproc =
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   144
    \<^simproc_setup>\<open>passive fast_int_arith ("(m::int) < n" | "(m::int) \<le> n" | "(m::int) = n") =
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   145
      \<open>K Lin_Arith.simproc\<close>\<close>
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   146
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   147
  val antisym_le_simproc =
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   148
    \<^simproc_setup>\<open>passive antisym_le ("(x::'a::order) \<le> y") = \<open>K prove_antisym_le\<close>\<close>
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   149
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   150
  val antisym_less_simproc =
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   151
    \<^simproc_setup>\<open>passive antisym_less ("\<not> (x::'a::linorder) < y") = \<open>K prove_antisym_less\<close>\<close>
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   152
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   153
  val basic_simpset =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69204
diff changeset
   154
    simpset_of (put_simpset HOL_ss \<^context>
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   155
      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
   156
        arith_simps rel_simps array_rules z3div_def z3mod_def NO_MATCH_def}
80701
39cd50407f79 tuned: prefer canonical argument order;
wenzelm
parents: 78808
diff changeset
   157
      |> fold Simplifier.add_proc [\<^simproc>\<open>numeral_divmod\<close>, fast_int_arith_simproc,
78808
64973b03b778 more standard simproc_setup using ML antiquotation;
wenzelm
parents: 74561
diff changeset
   158
        antisym_le_simproc, antisym_less_simproc])
69204
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
  structure Simpset = Generic_Data
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
    type T = simpset
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   163
    val empty = basic_simpset
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   164
    val merge = Simplifier.merge_ss
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
in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   167
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   168
fun add_simproc simproc context =
80701
39cd50407f79 tuned: prefer canonical argument order;
wenzelm
parents: 78808
diff changeset
   169
  Simpset.map (simpset_map (Context.proof_of context) (Simplifier.add_proc simproc)) context
69204
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
fun make_simpset ctxt rules =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   172
  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
   173
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   174
end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   175
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   176
local
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   177
  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
   178
  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
   179
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   180
  fun rewrite_conv _ [] = Conv.all_conv
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   181
    | 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
   182
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   183
  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
   184
  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
   185
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   186
  fun rewrite _ [] = I
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   187
    | 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
   188
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   189
  fun lookup_assm assms_net ct =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   190
    net_instances assms_net ct
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   191
    |> 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
   192
in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   193
70320
59258a3192bf misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents: 69593
diff changeset
   194
fun add_asserted tab_update tab_empty p_extract cond outer_ctxt rewrite_rules assms steps ctxt0 =
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   195
  let
70320
59258a3192bf misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents: 69593
diff changeset
   196
    val eqs = map (rewrite ctxt0 [rewrite_true_rule]) rewrite_rules
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   197
    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
   198
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   199
    val assms_net =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   200
      assms
70320
59258a3192bf misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents: 69593
diff changeset
   201
      |> map (apsnd (rewrite ctxt0 eqs'))
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   202
      |> map (apsnd (Conv.fconv_rule Thm.eta_conversion))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   203
      |> thm_net_of snd
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   205
    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
   206
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   207
    fun assume thm ctxt =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   208
      let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   209
        val ct = Thm.cprem_of thm 1
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   210
        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
   211
      in (thm' RS thm, ctxt') end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   212
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   213
    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
   214
      let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   215
        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
   216
        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
   217
      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
   218
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   219
    fun add step
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   220
        (cx as ((iidths, thms), (ctxt, ptab))) =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   221
      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
   222
        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
   223
          let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   224
            val ct = Thm.cterm_of ctxt concl
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   225
            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
   226
            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
   227
          in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   228
            (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
   229
              [] =>
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   230
                let val (thm, ctxt') = assume thm1 ctxt
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   231
                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
   232
            | ithms => fold (add1 id fixes thm1) ithms cx)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   233
          end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   234
        else
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   235
          cx
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   236
      end
70320
59258a3192bf misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents: 69593
diff changeset
   237
  in fold add steps (([], []), (ctxt0, tab_empty)) end
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   238
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   239
end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   240
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69204
diff changeset
   241
fun params_of t = Term.strip_qnt_vars \<^const_name>\<open>Pure.all\<close> t
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   242
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   243
fun varify ctxt thm =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   244
  let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   245
    val maxidx = Thm.maxidx_of thm + 1
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   246
    val vs = params_of (Thm.prop_of thm)
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   247
    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
   248
  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
   249
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   250
fun intermediate_statistics ctxt start total =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   251
  SMT_Config.statistics_msg ctxt (fn current =>
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   252
    "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
   253
    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
   254
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   255
fun pretty_statistics solver total stats =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   256
  let
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   257
    val stats = Symtab.map (K (map (fn i => curry Int.div i 1000000))) stats
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   258
    fun mean_of is =
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   259
      let
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   260
        val len = length is
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   261
        val mid = len div 2
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   262
      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
   263
    fun pretty_item name p = Pretty.item (Pretty.separate ":" [Pretty.str name, p])
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   264
    fun pretty (name, milliseconds) = (Pretty.block (Pretty.str (name ^": ")  :: Pretty.separate "," [
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   265
      Pretty.str (string_of_int (length milliseconds) ^ " occurrences") ,
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   266
      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
   267
      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
   268
      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
   269
  in
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   270
    Pretty.big_list (solver ^ " proof reconstruction statistics:") (
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   271
      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
   272
      map pretty (Symtab.dest stats))
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   273
  end
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   274
72458
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   275
fun timestamp_format time =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   276
  Date.fmt "%Y-%m-%d %H:%M:%S." (Date.fromTimeLocal time) ^
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   277
  (StringCvt.padLeft #"0" 3 (string_of_int (Time.toMilliseconds time - 1000 * Time.toSeconds time)))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   278
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   279
fun print_stats stats =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   280
  let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   281
    fun print_list xs = fold (fn x => fn msg => msg ^ string_of_int x ^ ",") xs ""
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   282
  in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   283
    fold (fn (x,y) => fn msg => msg ^ x ^ ": " ^ print_list y ^ "\n") stats ""
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   284
  end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   285
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   286
fun spying false _ _ _ = ()
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   287
  | spying true ctxt f filename =
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   288
    let
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   289
      val message = f ()
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   290
      val thy = Context.theory_long_name ((Context.theory_of o Context.Proof) ctxt)
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   291
      val spying_version = "1"
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   292
    in
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   293
      File.append (Path.explode ("$ISABELLE_HOME_USER/" ^ filename))
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   294
        (spying_version ^ "; " ^ thy ^ "; " ^ (timestamp_format (Time.now ())) ^ ";\n" ^ message ^ "\n")
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   295
    end
b44e894796d5 add reconstruction for the SMT solver veriT
Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents: 70749
diff changeset
   296
69204
d5ab1636660b split SMT reconstruction into library
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff changeset
   297
end;