src/HOL/Tools/Sledgehammer/sledgehammer_prover_tactic.ML
author haftmann
Fri, 28 Mar 2025 14:13:38 +0100
changeset 82375 1972ae7da0d2
parent 82372 2db8a047b52c
child 82381 dd427ae513e2
permissions -rw-r--r--
tuned
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
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     3
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     4
Isabelle tactics as Sledgehammer provers.
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     5
*)
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
signature SLEDGEHAMMER_PROVER_TACTIC =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     8
sig
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
     9
  type stature = ATP_Problem_Generate.stature
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    10
  type mode = Sledgehammer_Prover.mode
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    11
  type prover = Sledgehammer_Prover.prover
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    12
  type base_slice = Sledgehammer_ATP_Systems.base_slice
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    13
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    14
  val algebraN : string
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    15
  val argoN : string
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    16
  val autoN : string
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    17
  val blastN : string
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    18
  val fastforceN : string
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    19
  val forceN : string
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    20
  val linarithN : string
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    21
  val mesonN : string
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    22
  val metisN : string
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    23
  val orderN : string
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    24
  val presburgerN : string
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    25
  val satxN : string
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    26
  val simpN : string
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    27
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    28
  val tactic_provers : string list
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    29
  val is_tactic_prover : string -> bool
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    30
  val good_slices_of_tactic_prover : string -> base_slice list
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    31
  val run_tactic_prover : mode -> string -> prover
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    32
end;
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    33
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    34
structure Sledgehammer_Prover_Tactic : SLEDGEHAMMER_PROVER_TACTIC =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    35
struct
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    36
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    37
open ATP_Problem_Generate
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    38
open ATP_Proof
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    39
open Sledgehammer_ATP_Systems
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    40
open Sledgehammer_Proof_Methods
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    41
open Sledgehammer_Prover
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    42
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    43
val algebraN = "algebra"
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    44
val argoN = "argo"
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    45
val autoN = "auto"
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    46
val blastN = "blast"
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    47
val fastforceN = "fastforce"
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    48
val forceN = "force"
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    49
val linarithN = "linarith"
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    50
val mesonN = "meson"
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    51
val metisN = "metis"
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    52
val orderN = "order"
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    53
val presburgerN = "presburger"
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    54
val satxN = "satx"
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    55
val simpN = "simp"
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    56
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    57
val tactic_provers =
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    58
  [algebraN, argoN, autoN, blastN, fastforceN, forceN, linarithN, mesonN,
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    59
   metisN, orderN, presburgerN, satxN, simpN]
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    60
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    61
val is_tactic_prover = member (op =) tactic_provers
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    62
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    63
val meshN = "mesh"
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    64
82207
7e45a83373c8 tuned time slicing (from Jasmin)
desharna
parents: 82206
diff changeset
    65
fun good_slices_of_tactic_prover _ =
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    66
  (* FUDGE *)
82206
80ced0c233d9 tuning time slices in Sledgehammer (from Jasmin)
desharna
parents: 82204
diff changeset
    67
  [(1, false, false, 0, meshN),
80ced0c233d9 tuning time slices in Sledgehammer (from Jasmin)
desharna
parents: 82204
diff changeset
    68
   (1, false, false, 2, meshN),
80ced0c233d9 tuning time slices in Sledgehammer (from Jasmin)
desharna
parents: 82204
diff changeset
    69
   (1, false, false, 8, meshN),
82207
7e45a83373c8 tuned time slicing (from Jasmin)
desharna
parents: 82206
diff changeset
    70
   (1, false, false, 32, meshN)]
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    71
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    72
fun meth_of name =
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    73
  if name = algebraN then Algebra_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    74
  else if name = argoN then Argo_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    75
  else if name = autoN then Auto_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    76
  else if name = blastN then Blast_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    77
  else if name = fastforceN then Fastforce_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    78
  else if name = forceN then Force_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    79
  else if name = linarithN then Linarith_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    80
  else if name = mesonN then Meson_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    81
  else if name = metisN then Metis_Method (NONE, NONE, [])
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    82
  else if name = orderN then Order_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    83
  else if name = presburgerN then Presburger_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    84
  else if name = satxN then SATx_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    85
  else if name = simpN then Simp_Method
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    86
  else error ("Unknown tactic: " ^ quote name)
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    87
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    88
fun tac_of ctxt name (local_facts, global_facts) =
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
    89
  Sledgehammer_Proof_Methods.tac_of_proof_method ctxt (local_facts, global_facts) (meth_of name)
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    90
82212
0b46bf0a434f compute right timeout (from Jasmin)
desharna
parents: 82210
diff changeset
    91
fun run_tactic_prover mode name ({slices, timeout, ...} : params)
82204
c819ee4cdea9 rescale Sledgehammer slice factor (to allow smaller time slices for tactics like auto) (from Jasmin)
desharna
parents: 82203
diff changeset
    92
    ({state, goal, subgoal, subgoal_count, factss, found_something, ...} : prover_problem) slice =
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    93
  let
82212
0b46bf0a434f compute right timeout (from Jasmin)
desharna
parents: 82210
diff changeset
    94
    val (basic_slice as (slice_size, _, _, _, _), No_Slice) = slice
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    95
    val facts = facts_of_basic_slice basic_slice factss
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    96
    val ctxt = Proof.context_of state
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    97
82369
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    98
    fun run_try0 () : Try0.result option =
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
    99
      let
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   100
        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
   101
        fun is_cartouche str = String.isPrefix "\<open>" str andalso String.isSuffix "\<close>" str
82372
desharna
parents: 82371
diff changeset
   102
        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
   103
            let
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   104
              val xref =
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   105
                if is_cartouche name then
82371
971613edfb94 removed debug commands
desharna
parents: 82369
diff changeset
   106
                  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
   107
                else
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   108
                  Facts.named name
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   109
            in
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   110
              (xref, [])
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   111
            end
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   112
        val xrefs = map xref_of_fact facts
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   113
        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
   114
      in
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   115
        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
   116
      end
82212
0b46bf0a434f compute right timeout (from Jasmin)
desharna
parents: 82210
diff changeset
   117
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   118
    val timer = Timer.startRealTimer ()
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   119
    val out =
82369
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   120
      (case run_try0 () of
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   121
        NONE => SOME GaveUp
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   122
      | SOME _ => NONE)
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   123
      handle ERROR _ => SOME GaveUp
82210
6c2a087159b7 tentatively catch Interrupt_Breakdown in Sledgehammer (from Jasmin)
desharna
parents: 82209
diff changeset
   124
           | Exn.Interrupt_Breakdown => SOME GaveUp
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   125
           | Timeout.TIMEOUT _ => SOME TimedOut
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   126
    val run_time = Timer.checkRealTimer timer
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   127
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   128
    val (outcome, used_facts) =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   129
      (case out of
82369
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82212
diff changeset
   130
        NONE => (found_something name; (NONE, map fst facts))
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   131
      | some_failure => (some_failure, []))
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   132
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   133
    val message = fn _ =>
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   134
      (case outcome of
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   135
        NONE =>
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
   136
        one_line_proof_text ((map (apfst Pretty.str) used_facts, (meth_of name, Played run_time)),
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
   137
          proof_banner mode name, subgoal, subgoal_count)
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   138
      | SOME failure => string_of_atp_failure failure)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   139
  in
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   140
    {outcome = outcome, used_facts = used_facts, used_from = facts,
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   141
     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
   142
  end
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   143
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   144
end;