src/HOL/Tools/Sledgehammer/sledgehammer_prover_tactic.ML
author wenzelm
Mon, 21 Jul 2025 16:21:37 +0200
changeset 82892 45107da819fc
parent 82620 2d854f1cd830
permissions -rw-r--r--
eliminate odd Unicode characters (amending e9f3b94eb6a0, b69e4da2604b, 8f0b2daa7eaa, 8d1e295aab70);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     1
(*  Title:      HOL/Tools/Sledgehammer/sledgehammer_prover_tactic.ML
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, LMU Muenchen
82386
desharna
parents: 82385
diff changeset
     3
    Author:     Martin Desharnais, LMU Muenchen
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     4
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     5
Isabelle tactics as Sledgehammer provers.
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     6
*)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     7
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     8
signature SLEDGEHAMMER_PROVER_TACTIC =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     9
sig
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    10
  type stature = ATP_Problem_Generate.stature
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    11
  type mode = Sledgehammer_Prover.mode
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    12
  type prover = Sledgehammer_Prover.prover
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    13
  type base_slice = Sledgehammer_ATP_Systems.base_slice
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    14
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    15
  val is_tactic_prover : string -> bool
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    16
  val good_slices_of_tactic_prover : string -> base_slice list
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    17
  val run_tactic_prover : mode -> string -> prover
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    18
end;
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    19
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    20
structure Sledgehammer_Prover_Tactic : SLEDGEHAMMER_PROVER_TACTIC =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    21
struct
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    22
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    23
open ATP_Proof
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    24
open Sledgehammer_Proof_Methods
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    25
open Sledgehammer_Prover
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    26
82385
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    27
val is_tactic_prover : string -> bool = is_some o Try0.get_proof_method
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    28
82457
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    29
local
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    30
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    31
val slices_of_max_facts = map (fn max_facts => (1, false, false, max_facts, "mesh"))
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    32
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    33
in
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    34
82457
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    35
(* FUDGE *)
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    36
fun good_slices_of_tactic_prover "metis" = slices_of_max_facts [0, 64, 32, 8, 16, 4, 2, 1]
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    37
  | good_slices_of_tactic_prover "fastforce" = slices_of_max_facts [0, 16, 32, 8, 4, 64, 2, 1]
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    38
  | good_slices_of_tactic_prover "simp" = slices_of_max_facts [0, 16, 32, 8, 64, 4, 1, 2]
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    39
  | good_slices_of_tactic_prover "auto" = slices_of_max_facts [0, 16, 32, 8, 4, 64, 2, 1]
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    40
  | good_slices_of_tactic_prover _ = slices_of_max_facts [0, 2, 8, 16, 32, 64]
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    41
5a0d1075911c expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents: 82386
diff changeset
    42
end
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    43
82385
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    44
fun meth_of "algebra" = Algebra_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    45
  | meth_of "argo" = Argo_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    46
  | meth_of "auto" = Auto_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    47
  | meth_of "blast" = Blast_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    48
  | meth_of "fastforce" = Fastforce_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    49
  | meth_of "force" = Force_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    50
  | meth_of "linarith" = Linarith_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    51
  | meth_of "meson" = Meson_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    52
  | meth_of "metis" = Metis_Method (NONE, NONE, [])
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    53
  | meth_of "order" = Order_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    54
  | meth_of "presburger" = Presburger_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    55
  | meth_of "satx" = SATx_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    56
  | meth_of "simp" = Simp_Method
44440263d847 tuned signature
desharna
parents: 82381
diff changeset
    57
  | meth_of _ = Metis_Method (NONE, NONE, [])
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    58
82212
0b46bf0a434f compute right timeout (from Jasmin)
desharna
parents: 82210
diff changeset
    59
fun run_tactic_prover mode name ({slices, timeout, ...} : params)
82386
desharna
parents: 82385
diff changeset
    60
    ({state, subgoal, subgoal_count, factss, found_something, ...} : prover_problem) slice =
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    61
  let
82212
0b46bf0a434f compute right timeout (from Jasmin)
desharna
parents: 82210
diff changeset
    62
    val (basic_slice as (slice_size, _, _, _, _), No_Slice) = slice
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    63
    val facts = facts_of_basic_slice basic_slice factss
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    64
    val ctxt = Proof.context_of state
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    65
82369
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    66
    fun run_try0 () : Try0.result option =
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    67
      let
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    68
        val run_timeout = slice_timeout slice_size slices timeout
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    69
        fun is_cartouche str = String.isPrefix "\<open>" str andalso String.isSuffix "\<close>" str
82372
desharna
parents: 82371
diff changeset
    70
        fun xref_of_fact (((name, _), thm) : Sledgehammer_Fact.fact) =
82369
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    71
            let
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    72
              val xref =
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    73
                if is_cartouche name then
82371
971613edfb94 removed debug commands
desharna
parents: 82369
diff changeset
    74
                  Facts.Fact (Pretty.pure_string_of (Thm.pretty_thm ctxt thm))
82369
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    75
                else
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    76
                  Facts.named name
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    77
            in
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    78
              (xref, [])
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    79
            end
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    80
        val xrefs = map xref_of_fact facts
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    81
        val facts : Try0.facts = {usings = xrefs, simps = [], intros = [], elims = [], dests = []}
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    82
      in
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    83
        Try0.get_proof_method_or_noop name (SOME run_timeout) facts state
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    84
      end
82212
0b46bf0a434f compute right timeout (from Jasmin)
desharna
parents: 82210
diff changeset
    85
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    86
    val timer = Timer.startRealTimer ()
82576
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    87
    val (outcome, command) =
82369
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    88
      (case run_try0 () of
82576
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    89
        NONE => (SOME GaveUp, "")
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    90
      | SOME {command, ...} => (NONE, command))
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    91
      handle ERROR _ => (SOME GaveUp, "")
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    92
           | Exn.Interrupt_Breakdown => (SOME GaveUp, "")
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    93
           | Timeout.TIMEOUT _ => (SOME TimedOut, "")
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    94
    val run_time = Timer.checkRealTimer timer
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    95
82576
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    96
    val used_facts =
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    97
      (case outcome of
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    98
        NONE => (found_something name; map fst facts)
a310d5b6c696 proper command message for Sledgehammer's proof methods
desharna
parents: 82457
diff changeset
    99
      | SOME _ => [])
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   100
82620
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   101
    val message = fn preplay_outcome =>
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   102
      (case outcome of
82620
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   103
        NONE =>
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   104
        let
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   105
          val banner = proof_banner mode name
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   106
        in
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   107
          (case preplay_outcome of
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   108
            NONE => try_command_line banner (Played run_time) command
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   109
          | SOME preplay_result =>
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   110
              one_line_proof_text (preplay_result, banner, subgoal, subgoal_count))
2d854f1cd830 clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents: 82576
diff changeset
   111
        end
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   112
      | SOME failure => string_of_atp_failure failure)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   113
  in
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   114
    {outcome = outcome, used_facts = used_facts, used_from = facts,
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   115
     preferred_methss = (meth_of name, []), run_time = run_time, message = message}
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   116
  end
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   117
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   118
end;