src/HOL/Tools/Sledgehammer/sledgehammer_prover.ML
author blanchet
Fri, 31 Jan 2014 16:41:54 +0100
changeset 55214 48a347b40629
parent 55212 5832470d956e
child 55285 e88ad20035f4
permissions -rw-r--r--
better tracing + syntactically correct 'metis' calls
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55201
1ee776da8da7 renamed ML file
blanchet
parents: 55183
diff changeset
     1
(*  Title:      HOL/Tools/Sledgehammer/sledgehammer_prover.ML
28477
9339d4dcec8b version of sledgehammer using threads instead of processes, misc cleanup;
wenzelm
parents:
diff changeset
     2
    Author:     Fabian Immler, TU Muenchen
32996
d2e48879e65a removed disjunctive group cancellation -- provers run independently;
wenzelm
parents: 32995
diff changeset
     3
    Author:     Makarius
35969
c9565298df9e added support for Sledgehammer parameters;
blanchet
parents: 35867
diff changeset
     4
    Author:     Jasmin Blanchette, TU Muenchen
28477
9339d4dcec8b version of sledgehammer using threads instead of processes, misc cleanup;
wenzelm
parents:
diff changeset
     5
41087
d7b5fd465198 split "Sledgehammer" module into two parts, to resolve forthcoming dependency problems
blanchet
parents: 41066
diff changeset
     6
Generic prover abstraction for Sledgehammer.
28477
9339d4dcec8b version of sledgehammer using threads instead of processes, misc cleanup;
wenzelm
parents:
diff changeset
     7
*)
9339d4dcec8b version of sledgehammer using threads instead of processes, misc cleanup;
wenzelm
parents:
diff changeset
     8
55201
1ee776da8da7 renamed ML file
blanchet
parents: 55183
diff changeset
     9
signature SLEDGEHAMMER_PROVER =
28477
9339d4dcec8b version of sledgehammer using threads instead of processes, misc cleanup;
wenzelm
parents:
diff changeset
    10
sig
53586
bd5fa6425993 prefixed types and some functions with "atp_" for disambiguation
blanchet
parents: 53551
diff changeset
    11
  type atp_failure = ATP_Proof.atp_failure
46340
cac402c486b0 separate orthogonal components
blanchet
parents: 46320
diff changeset
    12
  type stature = ATP_Problem_Generate.stature
46320
0b8b73b49848 renamed two files to make room for a new file
blanchet
parents: 46301
diff changeset
    13
  type type_enc = ATP_Problem_Generate.type_enc
51005
ce4290c33d73 eliminated needless speed optimization -- and simplified code quite a bit
blanchet
parents: 50927
diff changeset
    14
  type fact = Sledgehammer_Fact.fact
52555
6811291d1869 moved code -> easier debugging
smolkas
parents: 52196
diff changeset
    15
  type reconstructor = Sledgehammer_Reconstructor.reconstructor
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
    16
  type play_outcome = Sledgehammer_Reconstructor.play_outcome
52555
6811291d1869 moved code -> easier debugging
smolkas
parents: 52196
diff changeset
    17
  type minimize_command = Sledgehammer_Reconstructor.minimize_command
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39492
diff changeset
    18
53052
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
    19
  datatype mode = Auto_Try | Try | Normal | MaSh | Auto_Minimize | Minimize
43021
5910dd009d0e handle non-auto try case of Sledgehammer better
blanchet
parents: 43015
diff changeset
    20
35969
c9565298df9e added support for Sledgehammer parameters;
blanchet
parents: 35867
diff changeset
    21
  type params =
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    22
    {debug : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    23
     verbose : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    24
     overlord : bool,
53800
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
    25
     spy : bool,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    26
     blocking : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    27
     provers : string list,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    28
     type_enc : string option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    29
     strict : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    30
     lam_trans : string option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    31
     uncurried_aliases : bool option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    32
     learn : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    33
     fact_filter : string option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    34
     max_facts : int option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    35
     fact_thresholds : real * real,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    36
     max_mono_iters : int option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    37
     max_new_mono_instances : int option,
51190
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51186
diff changeset
    38
     isar_proofs : bool option,
55183
17ec4a29ef71 renamed Sledgehammer options for symmetry between positive and negative versions
blanchet
parents: 55170
diff changeset
    39
     compress_isar : real,
17ec4a29ef71 renamed Sledgehammer options for symmetry between positive and negative versions
blanchet
parents: 55170
diff changeset
    40
     try0_isar : bool,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    41
     slice : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    42
     minimize : bool option,
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
    43
     timeout : Time.time,
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
    44
     preplay_timeout : Time.time,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    45
     expect : string}
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39492
diff changeset
    46
40061
71cc5aac8b76 generalization of the Sledgehammer minimizer, to make it possible to handle SMT solvers as well
blanchet
parents: 40060
diff changeset
    47
  type prover_problem =
54141
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54126
diff changeset
    48
    {comment : string,
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54126
diff changeset
    49
     state : Proof.state,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    50
     goal : thm,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    51
     subgoal : int,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    52
     subgoal_count : int,
51010
afd0213a3dab tuned data structure
blanchet
parents: 51009
diff changeset
    53
     factss : (string * fact list) list}
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39492
diff changeset
    54
40061
71cc5aac8b76 generalization of the Sledgehammer minimizer, to make it possible to handle SMT solvers as well
blanchet
parents: 40060
diff changeset
    55
  type prover_result =
53586
bd5fa6425993 prefixed types and some functions with "atp_" for disambiguation
blanchet
parents: 53551
diff changeset
    56
    {outcome : atp_failure option,
51009
e8ff34a1fa9a thread through fact triple component from which used facts come, for accurate index output
blanchet
parents: 51007
diff changeset
    57
     used_facts : (string * stature) list,
e8ff34a1fa9a thread through fact triple component from which used facts come, for accurate index output
blanchet
parents: 51007
diff changeset
    58
     used_from : fact list,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    59
     run_time : Time.time,
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
    60
     preplay : (reconstructor * play_outcome) Lazy.lazy,
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
    61
     message : reconstructor * play_outcome -> string,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
    62
     message_tail : string}
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39492
diff changeset
    63
43051
d7075adac3bd minimize with Metis if possible
blanchet
parents: 43050
diff changeset
    64
  type prover =
45520
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
    65
    params -> ((string * string list) list -> string -> minimize_command)
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
    66
    -> prover_problem -> prover_result
35867
16279c4c7a33 move all ATP setup code into ATP_Wrapper
blanchet
parents: 35866
diff changeset
    67
48319
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48314
diff changeset
    68
  val SledgehammerN : string
45519
cd6e78cb6ee8 make metis reconstruction handling more flexible
blanchet
parents: 45514
diff changeset
    69
  val plain_metis : reconstructor
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    70
  val overlord_file_location_of_prover : string -> string * string
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    71
  val proof_banner : mode -> string -> string
54811
df56a01f5684 parse SPASS-Pirate types
blanchet
parents: 54773
diff changeset
    72
  val extract_reconstructor : params -> reconstructor -> string * (string * string list) list
45379
0147a4348ca1 try "smt" as a fallback for ATPs if "metis" fails/times out
blanchet
parents: 45378
diff changeset
    73
  val is_reconstructor : string -> bool
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43044
diff changeset
    74
  val is_atp : theory -> string -> bool
55212
blanchet
parents: 55211
diff changeset
    75
  val bunch_of_reconstructors : bool -> (bool -> string) -> reconstructor list
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48797
diff changeset
    76
  val is_fact_chained : (('a * stature) * 'b) -> bool
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48797
diff changeset
    77
  val filter_used_facts :
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48797
diff changeset
    78
    bool -> (''a * stature) list -> ((''a * stature) * 'b) list ->
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48797
diff changeset
    79
    ((''a * stature) * 'b) list
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    80
  val play_one_line_proof : mode -> bool -> bool -> Time.time -> ((string * 'a) * thm) list ->
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    81
    Proof.state -> int -> reconstructor -> reconstructor list -> reconstructor * play_outcome
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    82
  val remotify_atp_if_not_installed : theory -> string -> string option
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    83
  val isar_supported_prover_of : theory -> string -> string
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    84
  val choose_minimize_command : theory -> params -> ((string * string list) list -> string -> 'a) ->
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    85
    string -> reconstructor * play_outcome -> 'a
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    86
  val repair_monomorph_context : int option -> int -> int option -> int -> Proof.context ->
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
    87
    Proof.context
55212
blanchet
parents: 55211
diff changeset
    88
blanchet
parents: 55211
diff changeset
    89
  val supported_provers : Proof.context -> unit
blanchet
parents: 55211
diff changeset
    90
  val kill_provers : unit -> unit
blanchet
parents: 55211
diff changeset
    91
  val running_provers : unit -> unit
blanchet
parents: 55211
diff changeset
    92
  val messages : int option -> unit
28477
9339d4dcec8b version of sledgehammer using threads instead of processes, misc cleanup;
wenzelm
parents:
diff changeset
    93
end;
9339d4dcec8b version of sledgehammer using threads instead of processes, misc cleanup;
wenzelm
parents:
diff changeset
    94
55201
1ee776da8da7 renamed ML file
blanchet
parents: 55183
diff changeset
    95
structure Sledgehammer_Prover : SLEDGEHAMMER_PROVER =
28477
9339d4dcec8b version of sledgehammer using threads instead of processes, misc cleanup;
wenzelm
parents:
diff changeset
    96
struct
9339d4dcec8b version of sledgehammer using threads instead of processes, misc cleanup;
wenzelm
parents:
diff changeset
    97
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43063
diff changeset
    98
open ATP_Util
38028
22dcaec5fa77 minor refactoring
blanchet
parents: 38023
diff changeset
    99
open ATP_Problem
22dcaec5fa77 minor refactoring
blanchet
parents: 38023
diff changeset
   100
open ATP_Systems
46320
0b8b73b49848 renamed two files to make room for a new file
blanchet
parents: 46301
diff changeset
   101
open ATP_Problem_Generate
0b8b73b49848 renamed two files to make room for a new file
blanchet
parents: 46301
diff changeset
   102
open ATP_Proof_Reconstruct
45521
0cd6e59bd0b5 give each time slice its own lambda translation
blanchet
parents: 45520
diff changeset
   103
open Metis_Tactic
51005
ce4290c33d73 eliminated needless speed optimization -- and simplified code quite a bit
blanchet
parents: 50927
diff changeset
   104
open Sledgehammer_Fact
52555
6811291d1869 moved code -> easier debugging
smolkas
parents: 52196
diff changeset
   105
open Sledgehammer_Reconstructor
54000
9cfff7f61d0d added experimental configuration options to tune use of builtin symbols in SMT
blanchet
parents: 53989
diff changeset
   106
53052
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
   107
datatype mode = Auto_Try | Try | Normal | MaSh | Auto_Minimize | Minimize
43021
5910dd009d0e handle non-auto try case of Sledgehammer better
blanchet
parents: 43015
diff changeset
   108
45376
blanchet
parents: 45370
diff changeset
   109
(* Identifier that distinguishes Sledgehammer from other tools that could use
38102
019a49759829 fix bug in the newly introduced "bound concealing" code
blanchet
parents: 38100
diff changeset
   110
   "Async_Manager". *)
48319
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48314
diff changeset
   111
val SledgehammerN = "Sledgehammer"
37585
c2ed8112ce57 multiplexing
blanchet
parents: 37584
diff changeset
   112
45520
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
   113
val reconstructor_names = [metisN, smtN]
46365
547d1a1dcaf6 rename lambda translation schemes
blanchet
parents: 46340
diff changeset
   114
val plain_metis = Metis (hd partial_type_encs, combsN)
45561
57227eedce81 don't propagate user-set "type_enc" or "lam_trans" to Metis calls
blanchet
parents: 45560
diff changeset
   115
val is_reconstructor = member (op =) reconstructor_names
43228
2ed2f092e990 obsoleted "metisFT", and added "no_types" version of Metis as fallback to Sledgehammer after noticing how useful it can be
blanchet
parents: 43226
diff changeset
   116
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43044
diff changeset
   117
val is_atp = member (op =) o supported_atps
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43044
diff changeset
   118
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   119
fun remotify_atp_if_supported_and_not_already_remote thy name =
51200
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   120
  if String.isPrefix remote_prefix name then
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   121
    SOME name
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   122
  else
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   123
    let val remote_name = remote_prefix ^ name in
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   124
      if is_atp thy remote_name then SOME remote_name else NONE
51200
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   125
    end
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   126
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   127
fun remotify_atp_if_not_installed thy name =
55207
42ad887a1c7c guarded against exception
blanchet
parents: 55205
diff changeset
   128
  if is_atp thy name andalso is_atp_installed thy name then SOME name
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   129
  else remotify_atp_if_supported_and_not_already_remote thy name
40063
d086e3699e78 bring ATPs and SMT solvers more in line with each other
blanchet
parents: 40062
diff changeset
   130
35969
c9565298df9e added support for Sledgehammer parameters;
blanchet
parents: 35867
diff changeset
   131
type params =
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   132
  {debug : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   133
   verbose : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   134
   overlord : bool,
53800
ac1ec5065316 added "spy" option to Sledgehammer
blanchet
parents: 53764
diff changeset
   135
   spy : bool,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   136
   blocking : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   137
   provers : string list,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   138
   type_enc : string option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   139
   strict : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   140
   lam_trans : string option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   141
   uncurried_aliases : bool option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   142
   learn : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   143
   fact_filter : string option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   144
   max_facts : int option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   145
   fact_thresholds : real * real,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   146
   max_mono_iters : int option,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   147
   max_new_mono_instances : int option,
51190
2654b3965c8d made "isar_proofs" a 3-way option, to provide a way to totally disable isar_proofs if desired
blanchet
parents: 51186
diff changeset
   148
   isar_proofs : bool option,
55183
17ec4a29ef71 renamed Sledgehammer options for symmetry between positive and negative versions
blanchet
parents: 55170
diff changeset
   149
   compress_isar : real,
17ec4a29ef71 renamed Sledgehammer options for symmetry between positive and negative versions
blanchet
parents: 55170
diff changeset
   150
   try0_isar : bool,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   151
   slice : bool,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   152
   minimize : bool option,
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   153
   timeout : Time.time,
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   154
   preplay_timeout : Time.time,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   155
   expect : string}
35867
16279c4c7a33 move all ATP setup code into ATP_Wrapper
blanchet
parents: 35866
diff changeset
   156
40061
71cc5aac8b76 generalization of the Sledgehammer minimizer, to make it possible to handle SMT solvers as well
blanchet
parents: 40060
diff changeset
   157
type prover_problem =
54141
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54126
diff changeset
   158
  {comment : string,
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54126
diff changeset
   159
   state : Proof.state,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   160
   goal : thm,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   161
   subgoal : int,
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   162
   subgoal_count : int,
51010
afd0213a3dab tuned data structure
blanchet
parents: 51009
diff changeset
   163
   factss : (string * fact list) list}
35867
16279c4c7a33 move all ATP setup code into ATP_Wrapper
blanchet
parents: 35866
diff changeset
   164
40061
71cc5aac8b76 generalization of the Sledgehammer minimizer, to make it possible to handle SMT solvers as well
blanchet
parents: 40060
diff changeset
   165
type prover_result =
53586
bd5fa6425993 prefixed types and some functions with "atp_" for disambiguation
blanchet
parents: 53551
diff changeset
   166
  {outcome : atp_failure option,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   167
   used_facts : (string * stature) list,
51009
e8ff34a1fa9a thread through fact triple component from which used facts come, for accurate index output
blanchet
parents: 51007
diff changeset
   168
   used_from : fact list,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   169
   run_time : Time.time,
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   170
   preplay : (reconstructor * play_outcome) Lazy.lazy,
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   171
   message : reconstructor * play_outcome -> string,
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48319
diff changeset
   172
   message_tail : string}
35867
16279c4c7a33 move all ATP setup code into ATP_Wrapper
blanchet
parents: 35866
diff changeset
   173
43051
d7075adac3bd minimize with Metis if possible
blanchet
parents: 43050
diff changeset
   174
type prover =
45520
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
   175
  params -> ((string * string list) list -> string -> minimize_command)
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
   176
  -> prover_problem -> prover_result
35867
16279c4c7a33 move all ATP setup code into ATP_Wrapper
blanchet
parents: 35866
diff changeset
   177
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   178
fun overlord_file_location_of_prover prover = (getenv "ISABELLE_HOME_USER", "prob_" ^ prover)
41313
a96ac4d180b7 optionally supply constant weights to E -- turned off by default until properly parameterized
blanchet
parents: 41259
diff changeset
   179
43052
8d6a4978cc65 automatically minimize with Metis when this can be done within a few seconds
blanchet
parents: 43051
diff changeset
   180
fun proof_banner mode name =
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   181
  (case mode of
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   182
    Auto_Try => "Auto Sledgehammer (" ^ quote name ^ ") found a proof"
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   183
  | Try => "Sledgehammer (" ^ quote name ^ ") found a proof"
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   184
  | _ => "Try this")
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   185
45561
57227eedce81 don't propagate user-set "type_enc" or "lam_trans" to Metis calls
blanchet
parents: 45560
diff changeset
   186
fun bunch_of_reconstructors needs_full_types lam_trans =
48800
943bb96b4e12 improved set of reconstructor methods
blanchet
parents: 48799
diff changeset
   187
  if needs_full_types then
48802
b86e8cf3f464 fixed then-else confusion
blanchet
parents: 48800
diff changeset
   188
    [Metis (full_type_enc, lam_trans false),
b86e8cf3f464 fixed then-else confusion
blanchet
parents: 48800
diff changeset
   189
     Metis (really_full_type_enc, lam_trans false),
b86e8cf3f464 fixed then-else confusion
blanchet
parents: 48800
diff changeset
   190
     Metis (full_type_enc, lam_trans true),
b86e8cf3f464 fixed then-else confusion
blanchet
parents: 48800
diff changeset
   191
     Metis (really_full_type_enc, lam_trans true),
b86e8cf3f464 fixed then-else confusion
blanchet
parents: 48800
diff changeset
   192
     SMT]
b86e8cf3f464 fixed then-else confusion
blanchet
parents: 48800
diff changeset
   193
  else
48800
943bb96b4e12 improved set of reconstructor methods
blanchet
parents: 48799
diff changeset
   194
    [Metis (partial_type_enc, lam_trans false),
943bb96b4e12 improved set of reconstructor methods
blanchet
parents: 48799
diff changeset
   195
     Metis (full_type_enc, lam_trans false),
943bb96b4e12 improved set of reconstructor methods
blanchet
parents: 48799
diff changeset
   196
     Metis (no_typesN, lam_trans true),
943bb96b4e12 improved set of reconstructor methods
blanchet
parents: 48799
diff changeset
   197
     Metis (really_full_type_enc, lam_trans true),
943bb96b4e12 improved set of reconstructor methods
blanchet
parents: 48799
diff changeset
   198
     SMT]
45561
57227eedce81 don't propagate user-set "type_enc" or "lam_trans" to Metis calls
blanchet
parents: 45560
diff changeset
   199
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   200
fun extract_reconstructor ({type_enc, lam_trans, ...} : params) (Metis (type_enc', lam_trans')) =
45561
57227eedce81 don't propagate user-set "type_enc" or "lam_trans" to Metis calls
blanchet
parents: 45560
diff changeset
   201
    let
57227eedce81 don't propagate user-set "type_enc" or "lam_trans" to Metis calls
blanchet
parents: 45560
diff changeset
   202
      val override_params =
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   203
        (if is_none type_enc andalso type_enc' = hd partial_type_encs then []
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   204
         else [("type_enc", [hd (unalias_type_enc type_enc')])]) @
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   205
        (if is_none lam_trans andalso lam_trans' = default_metis_lam_trans then []
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   206
         else [("lam_trans", [lam_trans'])])
45561
57227eedce81 don't propagate user-set "type_enc" or "lam_trans" to Metis calls
blanchet
parents: 45560
diff changeset
   207
    in (metisN, override_params) end
57227eedce81 don't propagate user-set "type_enc" or "lam_trans" to Metis calls
blanchet
parents: 45560
diff changeset
   208
  | extract_reconstructor _ SMT = (smtN, [])
57227eedce81 don't propagate user-set "type_enc" or "lam_trans" to Metis calls
blanchet
parents: 45560
diff changeset
   209
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   210
(* based on "Mirabelle.can_apply" and generalized *)
43034
18259246abb5 try both "metis" and (on failure) "metisFT" in replay
blanchet
parents: 43033
diff changeset
   211
fun timed_apply timeout tac state i =
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   212
  let
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   213
    val {context = ctxt, facts, goal} = Proof.goal state
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   214
    val full_tac = Method.insert_tac facts i THEN tac ctxt i
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   215
  in
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   216
    TimeLimit.timeLimit timeout (try (Seq.pull o full_tac)) goal
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   217
  end
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   218
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   219
fun tac_of_reconstructor (Metis (type_enc, lam_trans)) = metis_tac [type_enc] lam_trans
51998
f732a674db1b renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents: 51879
diff changeset
   220
  | tac_of_reconstructor SMT = SMT_Solver.smt_tac
43034
18259246abb5 try both "metis" and (on failure) "metisFT" in replay
blanchet
parents: 43033
diff changeset
   221
45520
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
   222
fun timed_reconstructor reconstr debug timeout ths =
55170
cdb9435e3cae silenced reconstructors in Sledgehammer
blanchet
parents: 55168
diff changeset
   223
  timed_apply timeout (silence_reconstructors debug
cdb9435e3cae silenced reconstructors in Sledgehammer
blanchet
parents: 55168
diff changeset
   224
    #> (fn ctxt => tac_of_reconstructor reconstr ctxt ths))
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   225
48798
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48797
diff changeset
   226
fun is_fact_chained ((_, (sc, _)), _) = sc = Chained
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48797
diff changeset
   227
9152e66f98da be less aggressive at kicking out chained facts
blanchet
parents: 48797
diff changeset
   228
fun filter_used_facts keep_chained used =
54773
79f66cd15d57 fixed source of 'Subscript' exception
blanchet
parents: 54772
diff changeset
   229
  filter ((member (op =) used o fst) orf (if keep_chained then is_fact_chained else K false))
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   230
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   231
fun play_one_line_proof mode debug verbose timeout pairs state i preferred reconstrs =
43034
18259246abb5 try both "metis" and (on failure) "metisFT" in replay
blanchet
parents: 43033
diff changeset
   232
  let
45520
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
   233
    fun get_preferred reconstrs =
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
   234
      if member (op =) reconstrs preferred then preferred
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
   235
      else List.last reconstrs
43034
18259246abb5 try both "metis" and (on failure) "metisFT" in replay
blanchet
parents: 43033
diff changeset
   236
  in
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   237
    if timeout = Time.zeroTime then
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   238
      (get_preferred reconstrs, Not_Played)
45379
0147a4348ca1 try "smt" as a fallback for ATPs if "metis" fails/times out
blanchet
parents: 45378
diff changeset
   239
    else
50557
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   240
      let
54815
4f6ec8754bf5 simplified data structure
blanchet
parents: 54813
diff changeset
   241
        val _ = if mode = Minimize then Output.urgent_message "Preplaying proof..." else ()
50557
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   242
        val ths = pairs |> sort_wrt (fst o fst) |> map snd
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   243
        fun play [] [] = (get_preferred reconstrs, Play_Failed)
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   244
          | play timed_outs [] = (get_preferred timed_outs, Play_Timed_Out timeout)
50557
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   245
          | play timed_out (reconstr :: reconstrs) =
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   246
            let
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   247
              val _ =
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   248
                if verbose then
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   249
                  Output.urgent_message ("Trying \"" ^ string_of_reconstructor reconstr ^
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54815
diff changeset
   250
                    "\" for " ^ string_of_time timeout ^ "...")
50557
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   251
                else
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   252
                  ()
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   253
              val timer = Timer.startRealTimer ()
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   254
            in
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   255
              case timed_reconstructor reconstr debug timeout ths state i of
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   256
                SOME (SOME _) => (reconstr, Played (Timer.checkRealTimer timer))
50557
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   257
              | _ => play timed_out reconstrs
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   258
            end
31313171deb5 thread no timeout properly
blanchet
parents: 50494
diff changeset
   259
            handle TimeLimit.TimeOut => play (reconstr :: timed_out) reconstrs
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   260
      in
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   261
        play [] reconstrs
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   262
      end
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   263
  end
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43031
diff changeset
   264
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   265
val canonical_isar_supported_prover = eN
51013
2d07f0fdcb29 use the right filter in each slice
blanchet
parents: 51011
diff changeset
   266
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   267
fun isar_supported_prover_of thy name =
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   268
  if is_atp thy name then name
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   269
  else the_default name (remotify_atp_if_not_installed thy canonical_isar_supported_prover)
43051
d7075adac3bd minimize with Metis if possible
blanchet
parents: 43050
diff changeset
   270
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   271
(* FIXME: See the analogous logic in the function "maybe_minimize" in
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   272
   "sledgehammer_prover_minimize.ML". *)
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   273
fun choose_minimize_command thy (params as {isar_proofs, ...}) minimize_command name preplay =
45520
2b1dde0b1c30 thread in additional options to minimizer
blanchet
parents: 45519
diff changeset
   274
  let
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   275
    val maybe_isar_name = name |> isar_proofs = SOME true ? isar_supported_prover_of thy
51200
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   276
    val (min_name, override_params) =
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   277
      (case preplay of
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   278
        (reconstr, Played _) =>
51200
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   279
        if isar_proofs = SOME true then (maybe_isar_name, [])
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   280
        else extract_reconstructor params reconstr
54824
4e58a38b330b refactored preplaying outcome data structure
blanchet
parents: 54823
diff changeset
   281
      | _ => (maybe_isar_name, []))
51200
260cb10aac4b minimize SMT proofs with E if Isar proofs are desired and Metis managed to preplay
blanchet
parents: 51190
diff changeset
   282
  in minimize_command override_params min_name end
43051
d7075adac3bd minimize with Metis if possible
blanchet
parents: 43050
diff changeset
   283
53480
247817dbb990 limit the number of instances of a single theorem
blanchet
parents: 53478
diff changeset
   284
val max_fact_instances = 10 (* FUDGE *)
247817dbb990 limit the number of instances of a single theorem
blanchet
parents: 53478
diff changeset
   285
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   286
fun repair_monomorph_context max_iters best_max_iters max_new_instances best_max_new_instances =
52034
11b48e7a4e7e correctly 'repair' the monomorphization context for SMT solvers from Sledgehammer
blanchet
parents: 52031
diff changeset
   287
  Config.put Monomorph.max_rounds (max_iters |> the_default best_max_iters)
11b48e7a4e7e correctly 'repair' the monomorphization context for SMT solvers from Sledgehammer
blanchet
parents: 52031
diff changeset
   288
  #> Config.put Monomorph.max_new_instances
55205
8450622db0c5 refactor large ML file
blanchet
parents: 55202
diff changeset
   289
       (max_new_instances |> the_default best_max_new_instances)
53480
247817dbb990 limit the number of instances of a single theorem
blanchet
parents: 53478
diff changeset
   290
  #> Config.put Monomorph.max_thm_instances max_fact_instances
52034
11b48e7a4e7e correctly 'repair' the monomorphization context for SMT solvers from Sledgehammer
blanchet
parents: 52031
diff changeset
   291
55212
blanchet
parents: 55211
diff changeset
   292
fun supported_provers ctxt =
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43044
diff changeset
   293
  let
55212
blanchet
parents: 55211
diff changeset
   294
    val thy = Proof_Context.theory_of ctxt
blanchet
parents: 55211
diff changeset
   295
    val (remote_provers, local_provers) =
blanchet
parents: 55211
diff changeset
   296
      reconstructor_names @
blanchet
parents: 55211
diff changeset
   297
      sort_strings (supported_atps thy) @
blanchet
parents: 55211
diff changeset
   298
      sort_strings (SMT_Solver.available_solvers_of ctxt)
blanchet
parents: 55211
diff changeset
   299
      |> List.partition (String.isPrefix remote_prefix)
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43044
diff changeset
   300
  in
55212
blanchet
parents: 55211
diff changeset
   301
    Output.urgent_message ("Supported provers: " ^
blanchet
parents: 55211
diff changeset
   302
                           commas (local_provers @ remote_provers) ^ ".")
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43044
diff changeset
   303
  end
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43044
diff changeset
   304
55212
blanchet
parents: 55211
diff changeset
   305
fun kill_provers () = Async_Manager.kill_threads SledgehammerN "prover"
blanchet
parents: 55211
diff changeset
   306
fun running_provers () = Async_Manager.running_threads SledgehammerN "prover"
blanchet
parents: 55211
diff changeset
   307
val messages = Async_Manager.thread_messages SledgehammerN "prover"
blanchet
parents: 55211
diff changeset
   308
28582
c269a3045fdf info: back to plain printing;
wenzelm
parents: 28571
diff changeset
   309
end;