src/HOL/Tools/Sledgehammer/sledgehammer_prover_minimize.ML
author blanchet
Fri, 25 Jul 2014 11:26:23 +0200
changeset 57673 858c1a63967f
parent 57245 f6bf6d5341ee
child 57721 e4858f85e616
permissions -rw-r--r--
don't lose 'minimize' flag before it reaches Isar proof text generation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
     1
(*  Title:      HOL/Tools/Sledgehammer/sledgehammer_prover_minimize.ML
31037
ac8669134e7a added Philipp Meyer's implementation of AtpMinimal
immler@in.tum.de
parents:
diff changeset
     2
    Author:     Philipp Meyer, TU Muenchen
36370
a4f601daa175 centralized ATP-specific error handling in "atp_wrapper.ML"
blanchet
parents: 36369
diff changeset
     3
    Author:     Jasmin Blanchette, TU Muenchen
31037
ac8669134e7a added Philipp Meyer's implementation of AtpMinimal
immler@in.tum.de
parents:
diff changeset
     4
40977
9140c5950494 [mq]: sledge_binary_minimizer
blanchet
parents: 40941
diff changeset
     5
Minimization of fact list for Metis using external provers.
31037
ac8669134e7a added Philipp Meyer's implementation of AtpMinimal
immler@in.tum.de
parents:
diff changeset
     6
*)
ac8669134e7a added Philipp Meyer's implementation of AtpMinimal
immler@in.tum.de
parents:
diff changeset
     7
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
     8
signature SLEDGEHAMMER_PROVER_MINIMIZE =
32525
ea322e847633 added signature ATP_MINIMAL,
boehmes
parents: 32510
diff changeset
     9
sig
46340
cac402c486b0 separate orthogonal components
blanchet
parents: 46320
diff changeset
    10
  type stature = ATP_Problem_Generate.stature
55287
ffa306239316 renamed ML file
blanchet
parents: 55285
diff changeset
    11
  type proof_method = Sledgehammer_Proof_Methods.proof_method
ffa306239316 renamed ML file
blanchet
parents: 55285
diff changeset
    12
  type play_outcome = Sledgehammer_Proof_Methods.play_outcome
55201
1ee776da8da7 renamed ML file
blanchet
parents: 55183
diff changeset
    13
  type mode = Sledgehammer_Prover.mode
1ee776da8da7 renamed ML file
blanchet
parents: 55183
diff changeset
    14
  type params = Sledgehammer_Prover.params
1ee776da8da7 renamed ML file
blanchet
parents: 55183
diff changeset
    15
  type prover = Sledgehammer_Prover.prover
35867
16279c4c7a33 move all ATP setup code into ATP_Wrapper
blanchet
parents: 35866
diff changeset
    16
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    17
  val is_prover_supported : Proof.context -> string -> bool
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    18
  val is_prover_installed : Proof.context -> string -> bool
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    19
  val default_max_facts_of_prover : Proof.context -> string -> int
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    20
  val get_prover : Proof.context -> mode -> string -> prover
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    21
42646
4781fcd53572 replaced some Unsynchronized.refs with Config.Ts
blanchet
parents: 42579
diff changeset
    22
  val binary_min_facts : int Config.T
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
    23
  val auto_minimize_min_facts : int Config.T
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
    24
  val auto_minimize_max_time : real Config.T
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    25
  val minimize_facts : (thm list -> unit) -> string -> params -> bool -> int -> int ->
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
    26
    Proof.state -> thm -> (proof_method * play_outcome) Lazy.lazy option ->
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    27
    ((string * stature) * thm list) list ->
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    28
    ((string * stature) * thm list) list option
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
    29
      * ((proof_method * play_outcome) Lazy.lazy * ((proof_method * play_outcome) -> string)
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
    30
         * string)
54503
blanchet
parents: 54141
diff changeset
    31
  val get_minimizing_prover : Proof.context -> mode -> (thm list -> unit) -> string -> prover
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    32
54503
blanchet
parents: 54141
diff changeset
    33
  val run_minimize : params -> (thm list -> unit) -> int -> (Facts.ref * Attrib.src list) list ->
blanchet
parents: 54141
diff changeset
    34
    Proof.state -> unit
35866
513074557e06 move the Sledgehammer Isar commands together into one file;
blanchet
parents: 35865
diff changeset
    35
end;
32525
ea322e847633 added signature ATP_MINIMAL,
boehmes
parents: 32510
diff changeset
    36
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
    37
structure Sledgehammer_Prover_Minimize : SLEDGEHAMMER_PROVER_MINIMIZE =
31037
ac8669134e7a added Philipp Meyer's implementation of AtpMinimal
immler@in.tum.de
parents:
diff changeset
    38
struct
ac8669134e7a added Philipp Meyer's implementation of AtpMinimal
immler@in.tum.de
parents:
diff changeset
    39
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43064
diff changeset
    40
open ATP_Util
39496
a52a4e4399c1 got caught once again by SML's pattern maching (ctor vs. var)
blanchet
parents: 39491
diff changeset
    41
open ATP_Proof
46320
0b8b73b49848 renamed two files to make room for a new file
blanchet
parents: 46301
diff changeset
    42
open ATP_Problem_Generate
55212
blanchet
parents: 55205
diff changeset
    43
open ATP_Proof_Reconstruct
51200
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51191
diff changeset
    44
open ATP_Systems
36142
f5e15e9aae10 make Sledgehammer "minimize" output less confusing + round up (not down) time limits to nearest second
blanchet
parents: 36063
diff changeset
    45
open Sledgehammer_Util
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
    46
open Sledgehammer_Fact
55287
ffa306239316 renamed ML file
blanchet
parents: 55285
diff changeset
    47
open Sledgehammer_Proof_Methods
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
    48
open Sledgehammer_Isar
55201
1ee776da8da7 renamed ML file
blanchet
parents: 55183
diff changeset
    49
open Sledgehammer_Prover
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    50
open Sledgehammer_Prover_ATP
56081
72fad75baf7e integrate SMT2 with Sledgehammer
blanchet
parents: 55452
diff changeset
    51
open Sledgehammer_Prover_SMT2
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    52
57054
blanchet
parents: 56985
diff changeset
    53
fun run_proof_method mode name (params as {verbose, timeout, type_enc, lam_trans, ...})
55212
blanchet
parents: 55205
diff changeset
    54
    minimize_command
blanchet
parents: 55205
diff changeset
    55
    ({state, subgoal, subgoal_count, factss = (_, facts) :: _, ...} : prover_problem) =
blanchet
parents: 55205
diff changeset
    56
  let
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
    57
    val meth =
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
    58
      if name = metisN then Metis_Method (type_enc, lam_trans)
56081
72fad75baf7e integrate SMT2 with Sledgehammer
blanchet
parents: 55452
diff changeset
    59
      else if name = smtN then SMT2_Method
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
    60
      else raise Fail ("unknown proof_method: " ^ quote name)
55212
blanchet
parents: 55205
diff changeset
    61
    val used_facts = facts |> map fst
blanchet
parents: 55205
diff changeset
    62
  in
57054
blanchet
parents: 56985
diff changeset
    63
    (case play_one_line_proof (if mode = Minimize then Normal else mode) verbose timeout facts state
blanchet
parents: 56985
diff changeset
    64
        subgoal meth [meth] of
55212
blanchet
parents: 55205
diff changeset
    65
      play as (_, Played time) =>
blanchet
parents: 55205
diff changeset
    66
      {outcome = NONE, used_facts = used_facts, used_from = facts, run_time = time,
blanchet
parents: 55205
diff changeset
    67
       preplay = Lazy.value play,
57054
blanchet
parents: 56985
diff changeset
    68
       message = fn play =>
blanchet
parents: 56985
diff changeset
    69
          let
blanchet
parents: 56985
diff changeset
    70
            val ctxt = Proof.context_of state
blanchet
parents: 56985
diff changeset
    71
            val (_, override_params) = extract_proof_method params meth
blanchet
parents: 56985
diff changeset
    72
            val one_line_params =
blanchet
parents: 56985
diff changeset
    73
              (play, proof_banner mode name, used_facts, minimize_command override_params name,
blanchet
parents: 56985
diff changeset
    74
               subgoal, subgoal_count)
blanchet
parents: 56985
diff changeset
    75
            val num_chained = length (#facts (Proof.goal state))
blanchet
parents: 56985
diff changeset
    76
          in
blanchet
parents: 56985
diff changeset
    77
            one_line_proof_text ctxt num_chained one_line_params
blanchet
parents: 56985
diff changeset
    78
          end,
55212
blanchet
parents: 55205
diff changeset
    79
       message_tail = ""}
blanchet
parents: 55205
diff changeset
    80
    | play =>
blanchet
parents: 55205
diff changeset
    81
      let
blanchet
parents: 55205
diff changeset
    82
        val failure = (case play of (_, Play_Failed) => GaveUp | _ => TimedOut)
blanchet
parents: 55205
diff changeset
    83
      in
blanchet
parents: 55205
diff changeset
    84
        {outcome = SOME failure, used_facts = [], used_from = [],
blanchet
parents: 55205
diff changeset
    85
         run_time = Time.zeroTime, preplay = Lazy.value play,
blanchet
parents: 55205
diff changeset
    86
         message = fn _ => string_of_atp_failure failure, message_tail = ""}
blanchet
parents: 55205
diff changeset
    87
      end)
blanchet
parents: 55205
diff changeset
    88
  end
blanchet
parents: 55205
diff changeset
    89
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    90
fun is_prover_supported ctxt =
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    91
  let val thy = Proof_Context.theory_of ctxt in
57208
5bf2a5c498c2 removed old SMT module from Sledgehammer
blanchet
parents: 57054
diff changeset
    92
    is_proof_method orf is_atp thy orf is_smt2_prover ctxt
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    93
  end
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    94
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    95
fun is_prover_installed ctxt =
57208
5bf2a5c498c2 removed old SMT module from Sledgehammer
blanchet
parents: 57054
diff changeset
    96
  is_proof_method orf is_smt2_prover ctxt orf
56081
72fad75baf7e integrate SMT2 with Sledgehammer
blanchet
parents: 55452
diff changeset
    97
  is_atp_installed (Proof_Context.theory_of ctxt)
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    98
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
    99
val proof_method_default_max_facts = 20
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   100
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   101
fun default_max_facts_of_prover ctxt name =
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   102
  let val thy = Proof_Context.theory_of ctxt in
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   103
    if is_proof_method name then
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   104
      proof_method_default_max_facts
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   105
    else if is_atp thy name then
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   106
      fold (Integer.max o fst o #1 o fst o snd) (#best_slices (get_atp thy name ()) ctxt) 0
56081
72fad75baf7e integrate SMT2 with Sledgehammer
blanchet
parents: 55452
diff changeset
   107
    else if is_smt2_prover ctxt name then
72fad75baf7e integrate SMT2 with Sledgehammer
blanchet
parents: 55452
diff changeset
   108
      SMT2_Solver.default_max_relevant ctxt name
72fad75baf7e integrate SMT2 with Sledgehammer
blanchet
parents: 55452
diff changeset
   109
    else
72fad75baf7e integrate SMT2 with Sledgehammer
blanchet
parents: 55452
diff changeset
   110
      error ("No such prover: " ^ name ^ ".")
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   111
  end
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   112
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   113
fun get_prover ctxt mode name =
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   114
  let val thy = Proof_Context.theory_of ctxt in
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   115
    if is_proof_method name then run_proof_method mode name
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   116
    else if is_atp thy name then run_atp mode name
56081
72fad75baf7e integrate SMT2 with Sledgehammer
blanchet
parents: 55452
diff changeset
   117
    else if is_smt2_prover ctxt name then run_smt2_solver mode name
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   118
    else error ("No such prover: " ^ name ^ ".")
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   119
  end
35866
513074557e06 move the Sledgehammer Isar commands together into one file;
blanchet
parents: 35865
diff changeset
   120
36370
a4f601daa175 centralized ATP-specific error handling in "atp_wrapper.ML"
blanchet
parents: 36369
diff changeset
   121
(* wrapper for calling external prover *)
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   122
40061
71cc5aac8b76 generalization of the Sledgehammer minimizer, to make it possible to handle SMT solvers as well
blanchet
parents: 40060
diff changeset
   123
fun n_facts names =
38698
d19c3a7ce38b clean handling of whether a fact is chained or not;
blanchet
parents: 38696
diff changeset
   124
  let val n = length names in
40061
71cc5aac8b76 generalization of the Sledgehammer minimizer, to make it possible to handle SMT solvers as well
blanchet
parents: 40060
diff changeset
   125
    string_of_int n ^ " fact" ^ plural_s n ^
57054
blanchet
parents: 56985
diff changeset
   126
    (if n > 0 then ": " ^ (names |> map fst |> sort string_ord |> space_implode " ") else "")
38092
81a003f7de0d speed up the minimizer by using the time taken for the first iteration as a timeout for the following iterations, and fix a subtle bug in "string_for_failure"
blanchet
parents: 38084
diff changeset
   127
  end
81a003f7de0d speed up the minimizer by using the time taken for the first iteration as a timeout for the following iterations, and fix a subtle bug in "string_for_failure"
blanchet
parents: 38084
diff changeset
   128
41091
0afdf5cde874 implicitly call the minimizer for SMT solvers that don't return an unsat core
blanchet
parents: 41090
diff changeset
   129
fun print silent f = if silent then () else Output.urgent_message (f ())
0afdf5cde874 implicitly call the minimizer for SMT solvers that don't return an unsat core
blanchet
parents: 41090
diff changeset
   130
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
   131
fun test_facts ({debug, verbose, overlord, spy, provers, max_mono_iters, max_new_mono_instances,
57245
f6bf6d5341ee renamed Sledgehammer options
blanchet
parents: 57208
diff changeset
   132
      type_enc, strict, lam_trans, uncurried_aliases, isar_proofs, compress, try0, smt_proofs,
57673
858c1a63967f don't lose 'minimize' flag before it reaches Isar proof text generation
blanchet
parents: 57245
diff changeset
   133
      minimize, preplay_timeout, ...} : params)
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
   134
    silent (prover : prover) timeout i n state goal facts =
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   135
  let
57054
blanchet
parents: 56985
diff changeset
   136
    val _ = print silent (fn () => "Testing " ^ n_facts (map fst facts) ^
blanchet
parents: 56985
diff changeset
   137
      (if verbose then " (timeout: " ^ string_of_time timeout ^ ")" else "") ^ "...")
blanchet
parents: 56985
diff changeset
   138
51005
ce4290c33d73 eliminated needless speed optimization -- and simplified code quite a bit
blanchet
parents: 50669
diff changeset
   139
    val facts = facts |> maps (fn (n, ths) => map (pair n) ths)
38100
e458a0dd3dc1 use "explicit_apply" in the minimizer whenever it might make a difference to prevent freak failures;
blanchet
parents: 38094
diff changeset
   140
    val params =
53800
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   141
      {debug = debug, verbose = verbose, overlord = overlord, spy = spy, blocking = true,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   142
       provers = provers, type_enc = type_enc, strict = strict, lam_trans = lam_trans,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   143
       uncurried_aliases = uncurried_aliases, learn = false, fact_filter = NONE,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   144
       max_facts = SOME (length facts), fact_thresholds = (1.01, 1.01),
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   145
       max_mono_iters = max_mono_iters, max_new_mono_instances = max_new_mono_instances,
57245
f6bf6d5341ee renamed Sledgehammer options
blanchet
parents: 57208
diff changeset
   146
       isar_proofs = isar_proofs, compress = compress, try0 = try0, smt_proofs = smt_proofs,
57673
858c1a63967f don't lose 'minimize' flag before it reaches Isar proof text generation
blanchet
parents: 57245
diff changeset
   147
       slice = false, minimize = minimize, timeout = timeout, preplay_timeout = preplay_timeout,
57245
f6bf6d5341ee renamed Sledgehammer options
blanchet
parents: 57208
diff changeset
   148
       expect = ""}
40065
1e4c7185f3f9 remove more needless code ("run_smt_solvers");
blanchet
parents: 40063
diff changeset
   149
    val problem =
54141
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54130
diff changeset
   150
      {comment = "", state = state, goal = goal, subgoal = i, subgoal_count = n,
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54130
diff changeset
   151
       factss = [("", facts)]}
45370
bab52dafa63a use "Time.time" rather than milliseconds internally
blanchet
parents: 45369
diff changeset
   152
    val result as {outcome, used_facts, run_time, ...} =
45520
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
   153
      prover params (K (K (K ""))) problem
36223
217ca1273786 make Sledgehammer's minimizer also minimize Isar proofs
blanchet
parents: 36143
diff changeset
   154
  in
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   155
    print silent (fn () =>
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   156
      (case outcome of
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   157
        SOME failure => string_of_atp_failure failure
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   158
      | NONE =>
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   159
        "Found proof" ^
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   160
         (if length used_facts = length facts then "" else " with " ^ n_facts used_facts) ^
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   161
         " (" ^ string_of_time run_time ^ ")."));
38092
81a003f7de0d speed up the minimizer by using the time taken for the first iteration as a timeout for the following iterations, and fix a subtle bug in "string_for_failure"
blanchet
parents: 38084
diff changeset
   162
    result
36223
217ca1273786 make Sledgehammer's minimizer also minimize Isar proofs
blanchet
parents: 36143
diff changeset
   163
  end
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   164
40204
da97d75e20e6 standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents: 40200
diff changeset
   165
(* minimalization of facts *)
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   166
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   167
(* Give the external prover some slack. The ATP gets further slack because the
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   168
   Sledgehammer preprocessing time is included in the estimate below but isn't
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   169
   part of the timeout. *)
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   170
val slack_msecs = 200
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   171
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   172
fun new_timeout timeout run_time =
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   173
  Int.min (Time.toMilliseconds timeout, Time.toMilliseconds run_time + slack_msecs)
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   174
  |> Time.fromMilliseconds
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   175
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   176
(* The linear algorithm usually outperforms the binary algorithm when over 60%
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   177
   of the facts are actually needed. The binary algorithm is much more
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   178
   appropriate for provers that cannot return the list of used facts and hence
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   179
   returns all facts as used. Since we cannot know in advance how many facts are
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   180
   actually needed, we heuristically set the threshold to 10 facts. *)
42646
4781fcd53572 replaced some Unsynchronized.refs with Config.Ts
blanchet
parents: 42579
diff changeset
   181
val binary_min_facts =
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   182
  Attrib.setup_config_int @{binding sledgehammer_minimize_binary_min_facts} (K 20)
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   183
val auto_minimize_min_facts =
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   184
  Attrib.setup_config_int @{binding sledgehammer_auto_minimize_min_facts}
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   185
      (fn generic => Config.get_generic generic binary_min_facts)
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   186
val auto_minimize_max_time =
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   187
  Attrib.setup_config_real @{binding sledgehammer_auto_minimize_max_time} (K 5.0)
40977
9140c5950494 [mq]: sledge_binary_minimizer
blanchet
parents: 40941
diff changeset
   188
45368
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   189
fun linear_minimize test timeout result xs =
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   190
  let
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   191
    fun min _ [] p = p
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   192
      | min timeout (x :: xs) (seen, result) =
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   193
        (case test timeout (xs @ seen) of
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   194
          result as {outcome = NONE, used_facts, run_time, ...} : prover_result =>
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   195
          min (new_timeout timeout run_time) (filter_used_facts true used_facts xs)
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   196
            (filter_used_facts false used_facts seen, result)
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   197
        | _ => min timeout xs (x :: seen, result))
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   198
  in
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   199
    min timeout xs ([], result)
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   200
  end
38015
b30c3c2e1030 implemented "sublinear" minimization algorithm
blanchet
parents: 38002
diff changeset
   201
45368
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   202
fun binary_minimize test timeout result xs =
40977
9140c5950494 [mq]: sledge_binary_minimizer
blanchet
parents: 40941
diff changeset
   203
  let
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   204
    fun min depth (result as {run_time, ...} : prover_result) sup (xs as _ :: _ :: _) =
41743
blanchet
parents: 41742
diff changeset
   205
        let
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   206
          val (l0, r0) = chop (length xs div 2) xs
41743
blanchet
parents: 41742
diff changeset
   207
(*
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   208
          val _ = warning (replicate_string depth " " ^ "{ " ^ "sup: " ^ n_facts (map fst sup))
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   209
          val _ = warning (replicate_string depth " " ^ " " ^ "xs: " ^ n_facts (map fst xs))
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   210
          val _ = warning (replicate_string depth " " ^ " " ^ "l0: " ^ n_facts (map fst l0))
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   211
          val _ = warning (replicate_string depth " " ^ " " ^ "r0: " ^ n_facts (map fst r0))
41743
blanchet
parents: 41742
diff changeset
   212
*)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   213
          val depth = depth + 1
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   214
          val timeout = new_timeout timeout run_time
41743
blanchet
parents: 41742
diff changeset
   215
        in
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   216
          (case test timeout (sup @ l0) of
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   217
            result as {outcome = NONE, used_facts, ...} =>
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   218
            min depth result (filter_used_facts true used_facts sup)
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   219
                      (filter_used_facts true used_facts l0)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   220
          | _ =>
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   221
            (case test timeout (sup @ r0) of
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   222
              result as {outcome = NONE, used_facts, ...} =>
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   223
              min depth result (filter_used_facts true used_facts sup)
57054
blanchet
parents: 56985
diff changeset
   224
                (filter_used_facts true used_facts r0)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   225
            | _ =>
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   226
              let
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   227
                val (sup_r0, (l, result)) = min depth result (sup @ r0) l0
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   228
                val (sup, r0) = (sup, r0) |> pairself (filter_used_facts true (map fst sup_r0))
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   229
                val (sup_l, (r, result)) = min depth result (sup @ l) r0
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   230
                val sup = sup |> filter_used_facts true (map fst sup_l)
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   231
              in (sup, (l @ r, result)) end))
40977
9140c5950494 [mq]: sledge_binary_minimizer
blanchet
parents: 40941
diff changeset
   232
        end
41743
blanchet
parents: 41742
diff changeset
   233
(*
blanchet
parents: 41742
diff changeset
   234
        |> tap (fn _ => warning (replicate_string depth " " ^ "}"))
blanchet
parents: 41742
diff changeset
   235
*)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   236
      | min _ result sup xs = (sup, (xs, result))
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   237
  in
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   238
    (case snd (min 0 result [] xs) of
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   239
      ([x], result as {run_time, ...}) =>
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   240
      (case test (new_timeout timeout run_time) [] of
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   241
        result as {outcome = NONE, ...} => ([], result)
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   242
      | _ => ([x], result))
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   243
    | p => p)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   244
  end
40977
9140c5950494 [mq]: sledge_binary_minimizer
blanchet
parents: 40941
diff changeset
   245
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   246
fun minimize_facts do_learn prover_name (params as {learn, timeout, ...}) silent i n state goal
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   247
    preplay0 facts =
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   248
  let
40941
a3e6f8634a11 replace "smt" prover with specific SMT solvers, e.g. "z3" -- whatever the SMT module gives us
blanchet
parents: 40553
diff changeset
   249
    val ctxt = Proof.context_of state
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   250
    val prover = get_prover ctxt (if silent then Auto_Minimize else Minimize) prover_name
54130
b4e6cd4cab92 thread the goal through instead of relying on unreliable (possibly fake) state
blanchet
parents: 54127
diff changeset
   251
    fun test timeout = test_facts params silent prover timeout i n state goal
48796
0f94b8b69e79 consider removing chained facts last, so that they're more likely to be kept
blanchet
parents: 48399
diff changeset
   252
    val (chained, non_chained) = List.partition is_fact_chained facts
57054
blanchet
parents: 56985
diff changeset
   253
    (* Push chained facts to the back, so that they are less likely to be kicked out by the linear
blanchet
parents: 56985
diff changeset
   254
       minimization algorithm. *)
48796
0f94b8b69e79 consider removing chained facts last, so that they're more likely to be kept
blanchet
parents: 48399
diff changeset
   255
    val facts = non_chained @ chained
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   256
  in
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   257
    (print silent (fn () => "Sledgehammer minimizer: " ^ quote prover_name ^ ".");
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   258
     (case test timeout facts of
45371
blanchet
parents: 45370
diff changeset
   259
       result as {outcome = NONE, used_facts, run_time, ...} =>
38015
b30c3c2e1030 implemented "sublinear" minimization algorithm
blanchet
parents: 38002
diff changeset
   260
       let
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   261
         val facts = filter_used_facts true used_facts facts
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   262
         val min =
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   263
           if length facts >= Config.get ctxt binary_min_facts then binary_minimize
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   264
           else linear_minimize
45368
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   265
         val (min_facts, {preplay, message, message_tail, ...}) =
45371
blanchet
parents: 45370
diff changeset
   266
           min test (new_timeout timeout run_time) result facts
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   267
       in
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   268
         print silent (fn () => cat_lines
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   269
             ["Minimized to " ^ n_facts (map fst min_facts)] ^
48796
0f94b8b69e79 consider removing chained facts last, so that they're more likely to be kept
blanchet
parents: 48399
diff changeset
   270
              (case min_facts |> filter is_fact_chained |> length of
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   271
                 0 => ""
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   272
               | n => "\n(including " ^ string_of_int n ^ " chained)") ^ ".");
54503
blanchet
parents: 54141
diff changeset
   273
         (if learn then do_learn (maps snd min_facts) else ());
51187
c344cf148e8f avoid using "smt" for minimization -- better use the prover itself, since then Sledgehammer gets to try metis again and gives the opportunity to output an Isar proof -- and show Isar proof as fallback for SMT proofs
blanchet
parents: 51130
diff changeset
   274
         (SOME min_facts,
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   275
          (if is_some preplay0 andalso length min_facts = length facts then the preplay0
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   276
           else preplay,
51187
c344cf148e8f avoid using "smt" for minimization -- better use the prover itself, since then Sledgehammer gets to try metis again and gives the opportunity to output an Isar proof -- and show Isar proof as fallback for SMT proofs
blanchet
parents: 51130
diff changeset
   277
           message, message_tail))
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   278
       end
43052
8d6a4978cc65 automatically minimize with Metis when this can be done within a few seconds
blanchet
parents: 43051
diff changeset
   279
     | {outcome = SOME TimedOut, preplay, ...} =>
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   280
       (NONE, (preplay, fn _ =>
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   281
          "Timeout: You can increase the time limit using the \"timeout\" option (e.g., \
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   282
          \timeout = " ^ string_of_int (10 + Time.toMilliseconds timeout div 1000) ^ "\").", ""))
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   283
     | {preplay, message, ...} => (NONE, (preplay, prefix "Prover error: " o message, ""))))
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   284
    handle ERROR msg =>
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   285
      (NONE, (Lazy.value (Metis_Method (NONE, NONE), Play_Failed), fn _ => "Error: " ^ msg, ""))
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   286
  end
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   287
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   288
fun adjust_proof_method_params override_params
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   289
    ({debug, verbose, overlord, spy, blocking, provers, type_enc, strict, lam_trans,
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   290
      uncurried_aliases, learn, fact_filter, max_facts, fact_thresholds, max_mono_iters,
57245
f6bf6d5341ee renamed Sledgehammer options
blanchet
parents: 57208
diff changeset
   291
      max_new_mono_instances, isar_proofs, compress, try0, smt_proofs, slice, minimize, timeout,
f6bf6d5341ee renamed Sledgehammer options
blanchet
parents: 57208
diff changeset
   292
      preplay_timeout, expect} : params) =
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   293
  let
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   294
    fun lookup_override name default_value =
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   295
      (case AList.lookup (op =) override_params name of
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   296
        SOME [s] => SOME s
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   297
      | _ => default_value)
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   298
    (* Only those options that proof_methods are interested in are considered here. *)
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   299
    val type_enc = lookup_override "type_enc" type_enc
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   300
    val lam_trans = lookup_override "lam_trans" lam_trans
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   301
  in
53800
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   302
    {debug = debug, verbose = verbose, overlord = overlord, spy = spy, blocking = blocking,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   303
     provers = provers, type_enc = type_enc, strict = strict, lam_trans = lam_trans,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   304
     uncurried_aliases = uncurried_aliases, learn = learn, fact_filter = fact_filter,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   305
     max_facts = max_facts, fact_thresholds = fact_thresholds, max_mono_iters = max_mono_iters,
49918
cf441f4a358b renamed Isar-proof related options + changed semantics of Isar shrinking
blanchet
parents: 49914
diff changeset
   306
     max_new_mono_instances = max_new_mono_instances, isar_proofs = isar_proofs,
57245
f6bf6d5341ee renamed Sledgehammer options
blanchet
parents: 57208
diff changeset
   307
     compress = compress, try0 = try0, smt_proofs = smt_proofs, slice = slice, minimize = minimize,
f6bf6d5341ee renamed Sledgehammer options
blanchet
parents: 57208
diff changeset
   308
     timeout = timeout, preplay_timeout = preplay_timeout, expect = expect}
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   309
  end
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   310
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   311
fun maybe_minimize ctxt mode do_learn name (params as {verbose, isar_proofs, minimize, ...})
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   312
    ({state, goal, subgoal, subgoal_count, ...} : prover_problem)
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   313
    (result as {outcome, used_facts, used_from, run_time, preplay, message, message_tail} :
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   314
     prover_result) =
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   315
  if is_some outcome orelse null used_facts then
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   316
    result
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   317
  else
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   318
    let
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   319
      val thy = Proof_Context.theory_of ctxt
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   320
      val num_facts = length used_facts
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   321
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   322
      val ((perhaps_minimize, (minimize_name, params)), preplay) =
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   323
        if mode = Normal then
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   324
          if num_facts >= Config.get ctxt auto_minimize_min_facts then
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   325
            ((true, (name, params)), preplay)
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   326
          else
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   327
            let
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   328
              fun can_min_fast_enough time =
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   329
                0.001
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   330
                * Real.fromInt ((num_facts + 1) * Time.toMilliseconds time)
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   331
                <= Config.get ctxt auto_minimize_max_time
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   332
              fun prover_fast_enough () = can_min_fast_enough run_time
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   333
            in
51190
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51187
diff changeset
   334
              (case Lazy.force preplay of
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   335
                 (meth as Metis_Method _, Played timeout) =>
51191
89e9e945a005 auto-minimizer should respect "isar_proofs = true"
blanchet
parents: 51190
diff changeset
   336
                 if isar_proofs = SOME true then
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   337
                   (* Cheat: Assume the selected ATP is as fast as "metis" for the goal it proved
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   338
                      itself. *)
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   339
                   (can_min_fast_enough timeout, (isar_supported_prover_of thy name, params))
51191
89e9e945a005 auto-minimizer should respect "isar_proofs = true"
blanchet
parents: 51190
diff changeset
   340
                 else if can_min_fast_enough timeout then
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   341
                   (true, extract_proof_method params meth
51190
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51187
diff changeset
   342
                          ||> (fn override_params =>
55285
e88ad20035f4 merged 'reconstructors' and 'proof methods'
blanchet
parents: 55212
diff changeset
   343
                                  adjust_proof_method_params override_params params))
51190
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51187
diff changeset
   344
                 else
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51187
diff changeset
   345
                   (prover_fast_enough (), (name, params))
56081
72fad75baf7e integrate SMT2 with Sledgehammer
blanchet
parents: 55452
diff changeset
   346
               | (SMT2_Method, Played timeout) =>
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   347
                 (* Cheat: Assume the original prover is as fast as "smt" for the goal it proved
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   348
                    itself. *)
51190
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51187
diff changeset
   349
                 (can_min_fast_enough timeout, (name, params))
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51187
diff changeset
   350
               | _ => (prover_fast_enough (), (name, params)),
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51187
diff changeset
   351
               preplay)
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   352
            end
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   353
        else
54127
1e6db1c9f14c verbose minimization when learning from ATP proofs
blanchet
parents: 54119
diff changeset
   354
          ((false, (name, params)), preplay)
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   355
      val minimize = minimize |> the_default perhaps_minimize
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   356
      val (used_facts, (preplay, message, _)) =
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   357
        if minimize then
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48384
diff changeset
   358
          minimize_facts do_learn minimize_name params
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
   359
            (not verbose orelse (mode <> Normal andalso mode <> MaSh)) subgoal subgoal_count state
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
   360
            goal (SOME preplay) (filter_used_facts true used_facts (map (apsnd single) used_from))
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   361
          |>> Option.map (map fst)
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   362
        else
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   363
          (SOME used_facts, (preplay, message, ""))
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   364
    in
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   365
      (case used_facts of
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   366
        SOME used_facts =>
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   367
        {outcome = NONE, used_facts = used_facts, used_from = used_from, run_time = run_time,
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   368
         preplay = preplay, message = message, message_tail = message_tail}
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   369
      | NONE => result)
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   370
    end
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   371
57054
blanchet
parents: 56985
diff changeset
   372
fun get_minimizing_prover ctxt mode do_learn name params minimize_command problem =
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   373
  get_prover ctxt mode name params minimize_command problem
48384
83dc102041e6 learn on explicit "min" command but do the learning in a thread, since it may take a couple of seconds
blanchet
parents: 48321
diff changeset
   374
  |> maybe_minimize ctxt mode do_learn name params problem
48250
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   375
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   376
fun run_minimize (params as {provers, ...}) do_learn i refs state =
38045
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   377
  let
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   378
    val ctxt = Proof.context_of state
54130
b4e6cd4cab92 thread the goal through instead of relying on unreliable (possibly fake) state
blanchet
parents: 54127
diff changeset
   379
    val {goal, facts = chained_ths, ...} = Proof.goal state
38696
4c6b65d6a135 quote facts whose names collide with a keyword or command name (cf. "subclass" in "Jinja/J/TypeSafe.thy")
blanchet
parents: 38617
diff changeset
   380
    val reserved = reserved_isar_keyword_table ()
48396
dd82d190c2af name tuning
blanchet
parents: 48394
diff changeset
   381
    val css = clasimpset_rule_table_of ctxt
54130
b4e6cd4cab92 thread the goal through instead of relying on unreliable (possibly fake) state
blanchet
parents: 54127
diff changeset
   382
    val facts = refs |> maps (map (apsnd single) o fact_of_ref ctxt reserved chained_ths css)
38045
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   383
  in
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   384
    (case subgoal_count state of
40132
7ee65dbffa31 renamed Output.priority to Output.urgent_message to emphasize its special role more clearly;
wenzelm
parents: 40114
diff changeset
   385
      0 => Output.urgent_message "No subgoal!"
57054
blanchet
parents: 56985
diff changeset
   386
    | n =>
blanchet
parents: 56985
diff changeset
   387
      (case provers of
blanchet
parents: 56985
diff changeset
   388
        [] => error "No prover is set."
blanchet
parents: 56985
diff changeset
   389
      | prover :: _ =>
blanchet
parents: 56985
diff changeset
   390
        (kill_provers ();
blanchet
parents: 56985
diff changeset
   391
         minimize_facts do_learn prover params false i n state goal NONE facts
blanchet
parents: 56985
diff changeset
   392
         |> (fn (_, (preplay, message, message_tail)) =>
blanchet
parents: 56985
diff changeset
   393
                Output.urgent_message (message (Lazy.force preplay) ^ message_tail)))))
38045
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   394
  end
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   395
35866
513074557e06 move the Sledgehammer Isar commands together into one file;
blanchet
parents: 35865
diff changeset
   396
end;