src/HOL/Tools/Sledgehammer/sledgehammer_minimize.ML
author blanchet
Thu, 30 Jan 2014 14:37:53 +0100
changeset 55183 17ec4a29ef71
parent 54824 4e58a38b330b
child 55201 1ee776da8da7
permissions -rw-r--r--
renamed Sledgehammer options for symmetry between positive and negative versions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38988
483879af0643 finished renaming
blanchet
parents: 38986
diff changeset
     1
(*  Title:      HOL/Tools/Sledgehammer/sledgehammer_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
38988
483879af0643 finished renaming
blanchet
parents: 38986
diff changeset
     8
signature SLEDGEHAMMER_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
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    11
  type reconstructor = Sledgehammer_Reconstructor.reconstructor
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    12
  type play_outcome = Sledgehammer_Reconstructor.play_outcome
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
    13
  type mode = Sledgehammer_Provers.mode
41087
d7b5fd465198 split "Sledgehammer" module into two parts, to resolve forthcoming dependency problems
blanchet
parents: 40983
diff changeset
    14
  type params = Sledgehammer_Provers.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
    15
  type prover = Sledgehammer_Provers.prover
35867
16279c4c7a33 move all ATP setup code into ATP_Wrapper
blanchet
parents: 35866
diff changeset
    16
42646
4781fcd53572 replaced some Unsynchronized.refs with Config.Ts
blanchet
parents: 42579
diff changeset
    17
  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
    18
  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
    19
  val auto_minimize_max_time : real Config.T
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    20
  val minimize_facts : (thm list -> unit) -> string -> params -> bool -> int -> int ->
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    21
    Proof.state -> thm -> (reconstructor * play_outcome) Lazy.lazy option ->
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    22
    ((string * stature) * thm list) list ->
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    23
    ((string * stature) * thm list) list option
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    24
    * ((reconstructor * play_outcome) Lazy.lazy * ((reconstructor * play_outcome) -> string)
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    25
       * string)
54503
blanchet
parents: 54141
diff changeset
    26
  val get_minimizing_prover : Proof.context -> mode -> (thm list -> unit) -> string -> prover
blanchet
parents: 54141
diff changeset
    27
  val run_minimize : params -> (thm list -> unit) -> int -> (Facts.ref * Attrib.src list) list ->
blanchet
parents: 54141
diff changeset
    28
    Proof.state -> unit
35866
513074557e06 move the Sledgehammer Isar commands together into one file;
blanchet
parents: 35865
diff changeset
    29
end;
32525
ea322e847633 added signature ATP_MINIMAL,
boehmes
parents: 32510
diff changeset
    30
38988
483879af0643 finished renaming
blanchet
parents: 38986
diff changeset
    31
structure Sledgehammer_Minimize : SLEDGEHAMMER_MINIMIZE =
31037
ac8669134e7a added Philipp Meyer's implementation of AtpMinimal
immler@in.tum.de
parents:
diff changeset
    32
struct
ac8669134e7a added Philipp Meyer's implementation of AtpMinimal
immler@in.tum.de
parents:
diff changeset
    33
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43064
diff changeset
    34
open ATP_Util
39496
a52a4e4399c1 got caught once again by SML's pattern maching (ctor vs. var)
blanchet
parents: 39491
diff changeset
    35
open ATP_Proof
46320
0b8b73b49848 renamed two files to make room for a new file
blanchet
parents: 46301
diff changeset
    36
open ATP_Problem_Generate
51200
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51191
diff changeset
    37
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
    38
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
    39
open Sledgehammer_Fact
52555
6811291d1869 moved code -> easier debugging
smolkas
parents: 52031
diff changeset
    40
open Sledgehammer_Reconstructor
49914
23e36a4d28f1 refactor code
blanchet
parents: 48799
diff changeset
    41
open Sledgehammer_Reconstruct
41087
d7b5fd465198 split "Sledgehammer" module into two parts, to resolve forthcoming dependency problems
blanchet
parents: 40983
diff changeset
    42
open Sledgehammer_Provers
35866
513074557e06 move the Sledgehammer Isar commands together into one file;
blanchet
parents: 35865
diff changeset
    43
36370
a4f601daa175 centralized ATP-specific error handling in "atp_wrapper.ML"
blanchet
parents: 36369
diff changeset
    44
(* wrapper for calling external prover *)
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
    45
40061
71cc5aac8b76 generalization of the Sledgehammer minimizer, to make it possible to handle SMT solvers as well
blanchet
parents: 40060
diff changeset
    46
fun n_facts names =
38698
d19c3a7ce38b clean handling of whether a fact is chained or not;
blanchet
parents: 38696
diff changeset
    47
  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
    48
    string_of_int n ^ " fact" ^ plural_s n ^
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
    49
    (if n > 0 then
48085
ff5e900d7b1a avoid dumping definitions several times in LEO-II proofs
blanchet
parents: 47531
diff changeset
    50
       ": " ^ (names |> map fst |> sort string_ord |> space_implode " ")
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
    51
     else
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
    52
       "")
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
    53
  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
    54
41091
0afdf5cde874 implicitly call the minimizer for SMT solvers that don't return an unsat core
blanchet
parents: 41090
diff changeset
    55
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
    56
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    57
fun test_facts ({debug, verbose, overlord, spy, provers, max_mono_iters, max_new_mono_instances,
55183
17ec4a29ef71 renamed Sledgehammer options for symmetry between positive and negative versions
blanchet
parents: 54824
diff changeset
    58
      type_enc, strict, lam_trans, uncurried_aliases, isar_proofs, compress_isar, try0_isar,
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    59
      preplay_timeout, ...} : params)
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
    60
    silent (prover : prover) timeout i n state goal facts =
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
    61
  let
41277
1369c27c6966 reduce the minimizer slack and add verbose information
blanchet
parents: 41267
diff changeset
    62
    val _ =
1369c27c6966 reduce the minimizer slack and add verbose information
blanchet
parents: 41267
diff changeset
    63
      print silent (fn () =>
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
    64
        "Testing " ^ n_facts (map fst facts) ^
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
    65
        (if verbose then " (timeout: " ^ string_of_time timeout ^ ")" else "") ^ "...")
51005
ce4290c33d73 eliminated needless speed optimization -- and simplified code quite a bit
blanchet
parents: 50669
diff changeset
    66
    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
    67
    val params =
53800
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
    68
      {debug = debug, verbose = verbose, overlord = overlord, spy = spy, blocking = true,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
    69
       provers = provers, type_enc = type_enc, strict = strict, lam_trans = lam_trans,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
    70
       uncurried_aliases = uncurried_aliases, learn = false, fact_filter = NONE,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
    71
       max_facts = SOME (length facts), fact_thresholds = (1.01, 1.01),
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
    72
       max_mono_iters = max_mono_iters, max_new_mono_instances = max_new_mono_instances,
55183
17ec4a29ef71 renamed Sledgehammer options for symmetry between positive and negative versions
blanchet
parents: 54824
diff changeset
    73
       isar_proofs = isar_proofs, compress_isar = compress_isar, try0_isar = try0_isar,
53800
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
    74
       slice = false, minimize = SOME false, timeout = timeout, preplay_timeout = preplay_timeout,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
    75
       expect = ""}
40065
1e4c7185f3f9 remove more needless code ("run_smt_solvers");
blanchet
parents: 40063
diff changeset
    76
    val problem =
54141
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54130
diff changeset
    77
      {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
    78
       factss = [("", facts)]}
45370
bab52dafa63a use "Time.time" rather than milliseconds internally
blanchet
parents: 45369
diff changeset
    79
    val result as {outcome, used_facts, run_time, ...} =
45520
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
    80
      prover params (K (K (K ""))) problem
36223
217ca1273786 make Sledgehammer's minimizer also minimize Isar proofs
blanchet
parents: 36143
diff changeset
    81
  in
43259
30c141dc22d6 killed "explicit_apply" option in Sledgehammer -- the "smart" default is about as lightweight as "false" and just as complete as "true"
blanchet
parents: 43166
diff changeset
    82
    print silent
30c141dc22d6 killed "explicit_apply" option in Sledgehammer -- the "smart" default is about as lightweight as "false" and just as complete as "true"
blanchet
parents: 43166
diff changeset
    83
          (fn () =>
30c141dc22d6 killed "explicit_apply" option in Sledgehammer -- the "smart" default is about as lightweight as "false" and just as complete as "true"
blanchet
parents: 43166
diff changeset
    84
              case outcome of
53586
bd5fa6425993 prefixed types and some functions with "atp_" for disambiguation
blanchet
parents: 52632
diff changeset
    85
                SOME failure => string_of_atp_failure failure
43259
30c141dc22d6 killed "explicit_apply" option in Sledgehammer -- the "smart" default is about as lightweight as "false" and just as complete as "true"
blanchet
parents: 43166
diff changeset
    86
              | NONE =>
30c141dc22d6 killed "explicit_apply" option in Sledgehammer -- the "smart" default is about as lightweight as "false" and just as complete as "true"
blanchet
parents: 43166
diff changeset
    87
                "Found proof" ^
30c141dc22d6 killed "explicit_apply" option in Sledgehammer -- the "smart" default is about as lightweight as "false" and just as complete as "true"
blanchet
parents: 43166
diff changeset
    88
                 (if length used_facts = length facts then ""
45370
bab52dafa63a use "Time.time" rather than milliseconds internally
blanchet
parents: 45369
diff changeset
    89
                  else " with " ^ n_facts used_facts) ^
52031
9a9238342963 tuning -- renamed '_from_' to '_of_' in Sledgehammer
blanchet
parents: 51998
diff changeset
    90
                 " (" ^ 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
    91
    result
36223
217ca1273786 make Sledgehammer's minimizer also minimize Isar proofs
blanchet
parents: 36143
diff changeset
    92
  end
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
    93
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
    94
(* minimalization of facts *)
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
    95
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
    96
(* 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
    97
   Sledgehammer preprocessing time is included in the estimate below but isn't
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
    98
   part of the timeout. *)
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
    99
val slack_msecs = 200
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   100
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   101
fun new_timeout timeout run_time =
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   102
  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
   103
  |> Time.fromMilliseconds
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   104
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   105
(* The linear algorithm usually outperforms the binary algorithm when over 60%
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   106
   of the facts are actually needed. The binary algorithm is much more
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   107
   appropriate for provers that cannot return the list of used facts and hence
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   108
   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
   109
   actually needed, we heuristically set the threshold to 10 facts. *)
42646
4781fcd53572 replaced some Unsynchronized.refs with Config.Ts
blanchet
parents: 42579
diff changeset
   110
val binary_min_facts =
4781fcd53572 replaced some Unsynchronized.refs with Config.Ts
blanchet
parents: 42579
diff changeset
   111
  Attrib.setup_config_int @{binding sledgehammer_minimize_binary_min_facts}
45368
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   112
                          (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
   113
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
   114
  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
   115
      (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
   116
val 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
   117
  Attrib.setup_config_real @{binding sledgehammer_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
   118
                           (K 5.0)
40977
9140c5950494 [mq]: sledge_binary_minimizer
blanchet
parents: 40941
diff changeset
   119
45368
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   120
fun linear_minimize test timeout result xs =
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   121
  let
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   122
    fun min _ [] p = p
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   123
      | 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
   124
        (case test timeout (xs @ seen) of
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   125
          result as {outcome = NONE, used_facts, run_time, ...} : prover_result =>
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   126
          min (new_timeout timeout run_time)
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   127
              (filter_used_facts true used_facts xs)
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   128
              (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
   129
        | _ => min timeout xs (x :: seen, result))
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   130
  in
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   131
    min timeout xs ([], result)
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   132
  end
38015
b30c3c2e1030 implemented "sublinear" minimization algorithm
blanchet
parents: 38002
diff changeset
   133
45368
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   134
fun binary_minimize test timeout result xs =
40977
9140c5950494 [mq]: sledge_binary_minimizer
blanchet
parents: 40941
diff changeset
   135
  let
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   136
    fun min depth (result as {run_time, ...} : prover_result) sup
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   137
            (xs as _ :: _ :: _) =
41743
blanchet
parents: 41742
diff changeset
   138
        let
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   139
          val (l0, r0) = chop (length xs div 2) xs
41743
blanchet
parents: 41742
diff changeset
   140
(*
45366
4339763edd55 speed up binary minimizer in practice by preferring the first half of the used facts (which are likelier to be relevant) to the second half
blanchet
parents: 44463
diff changeset
   141
          val _ = warning (replicate_string depth " " ^ "{ " ^
4339763edd55 speed up binary minimizer in practice by preferring the first half of the used facts (which are likelier to be relevant) to the second half
blanchet
parents: 44463
diff changeset
   142
                           "sup: " ^ n_facts (map fst sup))
4339763edd55 speed up binary minimizer in practice by preferring the first half of the used facts (which are likelier to be relevant) to the second half
blanchet
parents: 44463
diff changeset
   143
          val _ = warning (replicate_string depth " " ^ "  " ^
4339763edd55 speed up binary minimizer in practice by preferring the first half of the used facts (which are likelier to be relevant) to the second half
blanchet
parents: 44463
diff changeset
   144
                           "xs: " ^ n_facts (map fst xs))
4339763edd55 speed up binary minimizer in practice by preferring the first half of the used facts (which are likelier to be relevant) to the second half
blanchet
parents: 44463
diff changeset
   145
          val _ = warning (replicate_string depth " " ^ "  " ^
4339763edd55 speed up binary minimizer in practice by preferring the first half of the used facts (which are likelier to be relevant) to the second half
blanchet
parents: 44463
diff changeset
   146
                           "l0: " ^ n_facts (map fst l0))
4339763edd55 speed up binary minimizer in practice by preferring the first half of the used facts (which are likelier to be relevant) to the second half
blanchet
parents: 44463
diff changeset
   147
          val _ = warning (replicate_string depth " " ^ "  " ^
4339763edd55 speed up binary minimizer in practice by preferring the first half of the used facts (which are likelier to be relevant) to the second half
blanchet
parents: 44463
diff changeset
   148
                           "r0: " ^ n_facts (map fst r0))
41743
blanchet
parents: 41742
diff changeset
   149
*)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   150
          val depth = depth + 1
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   151
          val timeout = new_timeout timeout run_time
41743
blanchet
parents: 41742
diff changeset
   152
        in
45368
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   153
          case test timeout (sup @ l0) of
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   154
            result as {outcome = NONE, used_facts, ...} =>
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   155
            min depth result (filter_used_facts true used_facts sup)
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   156
                      (filter_used_facts true used_facts l0)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   157
          | _ =>
45368
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   158
            case test timeout (sup @ r0) of
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   159
              result as {outcome = NONE, used_facts, ...} =>
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   160
              min depth result (filter_used_facts true used_facts sup)
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   161
                        (filter_used_facts true used_facts r0)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   162
            | _ =>
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   163
              let
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   164
                val (sup_r0, (l, result)) = min depth result (sup @ r0) l0
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   165
                val (sup, r0) =
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   166
                  (sup, r0)
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   167
                  |> pairself (filter_used_facts true (map fst sup_r0))
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   168
                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
   169
                val sup = sup |> filter_used_facts true (map fst sup_l)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   170
              in (sup, (l @ r, result)) end
40977
9140c5950494 [mq]: sledge_binary_minimizer
blanchet
parents: 40941
diff changeset
   171
        end
41743
blanchet
parents: 41742
diff changeset
   172
(*
blanchet
parents: 41742
diff changeset
   173
        |> tap (fn _ => warning (replicate_string depth " " ^ "}"))
blanchet
parents: 41742
diff changeset
   174
*)
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   175
      | min _ result sup xs = (sup, (xs, result))
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   176
  in
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   177
    case snd (min 0 result [] xs) of
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   178
      ([x], result as {run_time, ...}) =>
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   179
      (case test (new_timeout timeout run_time) [] of
45367
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   180
         result as {outcome = NONE, ...} => ([], result)
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   181
       | _ => ([x], result))
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   182
    | p => p
cb54f1b34cf9 shortcut binary minimization algorithm
blanchet
parents: 45366
diff changeset
   183
  end
40977
9140c5950494 [mq]: sledge_binary_minimizer
blanchet
parents: 40941
diff changeset
   184
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   185
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
   186
    preplay0 facts =
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   187
  let
40941
a3e6f8634a11 replace "smt" prover with specific SMT solvers, e.g. "z3" -- whatever the SMT module gives us
blanchet
parents: 40553
diff changeset
   188
    val ctxt = Proof.context_of state
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   189
    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
   190
    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
   191
    val (chained, non_chained) = List.partition is_fact_chained facts
48799
5c9356f8c968 warn users about unused "using" facts
blanchet
parents: 48798
diff changeset
   192
    (* Push chained facts to the back, so that they are less likely to be
5c9356f8c968 warn users about unused "using" facts
blanchet
parents: 48798
diff changeset
   193
       kicked out by the linear minimization algorithm. *)
48796
0f94b8b69e79 consider removing chained facts last, so that they're more likely to be kept
blanchet
parents: 48399
diff changeset
   194
    val facts = non_chained @ chained
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   195
  in
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   196
    (print silent (fn () => "Sledgehammer minimizer: " ^ quote prover_name ^ ".");
48796
0f94b8b69e79 consider removing chained facts last, so that they're more likely to be kept
blanchet
parents: 48399
diff changeset
   197
     case test timeout facts of
45371
blanchet
parents: 45370
diff changeset
   198
       result as {outcome = NONE, used_facts, run_time, ...} =>
38015
b30c3c2e1030 implemented "sublinear" minimization algorithm
blanchet
parents: 38002
diff changeset
   199
       let
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48796
diff changeset
   200
         val facts = filter_used_facts true used_facts facts
45372
cc455b2897f8 cascading timeouts in minimizer, part 2
blanchet
parents: 45371
diff changeset
   201
         val min =
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   202
           if length facts >= Config.get ctxt binary_min_facts then binary_minimize
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   203
           else linear_minimize
45368
ff2edf24e83a cascading timeouts in minimizer
blanchet
parents: 45367
diff changeset
   204
         val (min_facts, {preplay, message, message_tail, ...}) =
45371
blanchet
parents: 45370
diff changeset
   205
           min test (new_timeout timeout run_time) result facts
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   206
       in
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   207
         print silent (fn () => cat_lines
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   208
             ["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
   209
              (case min_facts |> filter is_fact_chained |> length of
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   210
                 0 => ""
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   211
               | n => "\n(including " ^ string_of_int n ^ " chained)") ^ ".");
54503
blanchet
parents: 54141
diff changeset
   212
         (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
   213
         (SOME min_facts,
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   214
          (if is_some preplay0 andalso length min_facts = length facts then the preplay0
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   215
           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
   216
           message, message_tail))
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   217
       end
43052
8d6a4978cc65 automatically minimize with Metis when this can be done within a few seconds
blanchet
parents: 43051
diff changeset
   218
     | {outcome = SOME TimedOut, preplay, ...} =>
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   219
       (NONE, (preplay, fn _ =>
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   220
          "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
   221
          \timeout = " ^ string_of_int (10 + Time.toMilliseconds timeout div 1000) ^ "\").", ""))
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   222
     | {preplay, message, ...} => (NONE, (preplay, prefix "Prover error: " o message, "")))
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
   223
    handle ERROR msg => (NONE, (Lazy.value (plain_metis, Play_Failed), fn _ => "Error: " ^ msg, ""))
31236
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   224
  end
2a1f5c87ac28 proper signature constraint;
wenzelm
parents: 31037
diff changeset
   225
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
   226
fun adjust_reconstructor_params override_params
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   227
    ({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
   228
      uncurried_aliases, learn, fact_filter, max_facts, fact_thresholds, max_mono_iters,
55183
17ec4a29ef71 renamed Sledgehammer options for symmetry between positive and negative versions
blanchet
parents: 54824
diff changeset
   229
      max_new_mono_instances, isar_proofs, compress_isar, try0_isar, slice, minimize, timeout,
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   230
      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
   231
  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
   232
    fun lookup_override name default_value =
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   233
      case AList.lookup (op =) override_params name of
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   234
        SOME [s] => SOME s
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   235
      | _ => default_value
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   236
    (* Only those options that reconstructors are interested in are considered
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   237
       here. *)
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   238
    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
   239
    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
   240
  in
53800
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   241
    {debug = debug, verbose = verbose, overlord = overlord, spy = spy, blocking = blocking,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   242
     provers = provers, type_enc = type_enc, strict = strict, lam_trans = lam_trans,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   243
     uncurried_aliases = uncurried_aliases, learn = learn, fact_filter = fact_filter,
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   244
     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
   245
     max_new_mono_instances = max_new_mono_instances, isar_proofs = isar_proofs,
55183
17ec4a29ef71 renamed Sledgehammer options for symmetry between positive and negative versions
blanchet
parents: 54824
diff changeset
   246
     compress_isar = compress_isar, try0_isar = try0_isar, slice = slice, minimize = minimize,
53800
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   247
     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
   248
  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
   249
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
   250
fun maybe_minimize ctxt mode do_learn name
49918
cf441f4a358b renamed Isar-proof related options + changed semantics of Isar shrinking
blanchet
parents: 49914
diff changeset
   251
        (params as {verbose, isar_proofs, minimize, ...})
54130
b4e6cd4cab92 thread the goal through instead of relying on unreliable (possibly fake) state
blanchet
parents: 54127
diff changeset
   252
        ({state, goal, subgoal, subgoal_count, ...} : prover_problem)
51009
e8ff34a1fa9a thread through fact triple component from which used facts come, for accurate index output
blanchet
parents: 51007
diff changeset
   253
        (result as {outcome, used_facts, used_from, run_time, preplay, message,
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
   254
                    message_tail} : 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
   255
  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
   256
    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
   257
  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
   258
    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
   259
      val num_facts = length used_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
   260
      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
   261
        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
   262
          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
   263
            ((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
   264
          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
   265
            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
   266
              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
   267
                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
   268
                * 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
   269
                <= 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
   270
              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
   271
            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
   272
              (case Lazy.force preplay of
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
   273
                 (reconstr as Metis _, Played timeout) =>
51191
89e9e945a005 auto-minimizer should respect "isar_proofs = true"
blanchet
parents: 51190
diff changeset
   274
                 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
   275
                   (* 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
   276
                      itself. *)
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   277
                   (can_min_fast_enough timeout, (isar_proof_reconstructor ctxt name, params))
51191
89e9e945a005 auto-minimizer should respect "isar_proofs = true"
blanchet
parents: 51190
diff changeset
   278
                 else if can_min_fast_enough timeout then
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
   279
                   (true, extract_reconstructor params reconstr
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51187
diff changeset
   280
                          ||> (fn override_params =>
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   281
                                  adjust_reconstructor_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
   282
                 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
   283
                   (prover_fast_enough (), (name, params))
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
   284
               | (SMT, Played timeout) =>
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   285
                 (* 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
   286
                    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
   287
                 (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
   288
               | _ => (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
   289
               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
   290
            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
   291
        else
54127
1e6db1c9f14c verbose minimization when learning from ATP proofs
blanchet
parents: 54119
diff changeset
   292
          ((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
   293
      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
   294
      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
   295
        if minimize then
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48384
diff changeset
   296
          minimize_facts do_learn minimize_name params
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
   297
            (not verbose orelse (mode <> Normal andalso mode <> MaSh)) subgoal subgoal_count state
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54816
diff changeset
   298
            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
   299
          |>> 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
   300
        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
   301
          (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
   302
    in
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   303
      case used_facts of
1065c307fafe further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
blanchet
parents: 48085
diff changeset
   304
        SOME used_facts =>
51009
e8ff34a1fa9a thread through fact triple component from which used facts come, for accurate index output
blanchet
parents: 51007
diff changeset
   305
        {outcome = NONE, used_facts = used_facts, used_from = used_from,
e8ff34a1fa9a thread through fact triple component from which used facts come, for accurate index output
blanchet
parents: 51007
diff changeset
   306
         run_time = run_time, preplay = preplay, message = message,
e8ff34a1fa9a thread through fact triple component from which used facts come, for accurate index output
blanchet
parents: 51007
diff changeset
   307
         message_tail = message_tail}
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
   308
      | NONE => 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
   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
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
   311
fun get_minimizing_prover ctxt mode do_learn name params minimize_command
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
   312
                          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
   313
  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
   314
  |> 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
   315
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48314
diff changeset
   316
fun run_minimize (params as {provers, ...}) do_learn i refs state =
38045
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   317
  let
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   318
    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
   319
    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
   320
    val reserved = reserved_isar_keyword_table ()
48396
dd82d190c2af name tuning
blanchet
parents: 48394
diff changeset
   321
    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
   322
    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
   323
  in
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   324
    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
   325
      0 => Output.urgent_message "No subgoal!"
41265
a393d6d8e198 let each prover minimizes its own stuff (rather than taking the first prover of the list to minimize every prover's stuff)
blanchet
parents: 41259
diff changeset
   326
    | n => case provers of
a393d6d8e198 let each prover minimizes its own stuff (rather than taking the first prover of the list to minimize every prover's stuff)
blanchet
parents: 41259
diff changeset
   327
             [] => error "No prover is set."
a393d6d8e198 let each prover minimizes its own stuff (rather than taking the first prover of the list to minimize every prover's stuff)
blanchet
parents: 41259
diff changeset
   328
           | prover :: _ =>
a393d6d8e198 let each prover minimizes its own stuff (rather than taking the first prover of the list to minimize every prover's stuff)
blanchet
parents: 41259
diff changeset
   329
             (kill_provers ();
54130
b4e6cd4cab92 thread the goal through instead of relying on unreliable (possibly fake) state
blanchet
parents: 54127
diff changeset
   330
              minimize_facts do_learn prover params false i n state goal NONE facts
43261
a4aeb26a6362 make sure that the message tail (timing + TPTP important message) is preserved upon automatic minimization
blanchet
parents: 43259
diff changeset
   331
              |> (fn (_, (preplay, message, message_tail)) =>
50669
84c7cf36b2e0 use "Lazy" to simplify control flow a bit and guarantee single evaluation (at most)
blanchet
parents: 50668
diff changeset
   332
                     message (Lazy.force preplay) ^ message_tail
43261
a4aeb26a6362 make sure that the message tail (timing + TPTP important message) is preserved upon automatic minimization
blanchet
parents: 43259
diff changeset
   333
                     |> Output.urgent_message))
38045
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   334
  end
f367847f5068 minor refactoring
blanchet
parents: 38023
diff changeset
   335
35866
513074557e06 move the Sledgehammer Isar commands together into one file;
blanchet
parents: 35865
diff changeset
   336
end;