src/HOL/Tools/Sledgehammer/sledgehammer_prover_tactic.ML
author desharna
Tue, 25 Feb 2025 17:44:01 +0100
changeset 82209 a8e92f663481
parent 82207 7e45a83373c8
child 82210 6c2a087159b7
permissions -rw-r--r--
more tactics in tactic hammer (from Jasmin)
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
82204
c819ee4cdea9 rescale Sledgehammer slice factor (to allow smaller time slices for tactics like auto) (from Jasmin)
desharna
parents: 82203
diff changeset
    91
fun run_tactic_prover mode name ({timeout, ...} : params)
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
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    94
    val (basic_slice, No_Slice) = slice
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    95
    val facts = facts_of_basic_slice basic_slice factss
82203
c535cfba16db take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents: 82202
diff changeset
    96
    val {facts = chained, ...} = Proof.goal state
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    97
    val ctxt = Proof.context_of state
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    98
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    99
    val (local_facts, global_facts) =
82203
c535cfba16db take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents: 82202
diff changeset
   100
      ([], [])
82207
7e45a83373c8 tuned time slicing (from Jasmin)
desharna
parents: 82206
diff changeset
   101
      |> fold (fn ((_, (scope, _)), thm) =>
7e45a83373c8 tuned time slicing (from Jasmin)
desharna
parents: 82206
diff changeset
   102
        if scope = Global then apsnd (cons thm)
7e45a83373c8 tuned time slicing (from Jasmin)
desharna
parents: 82206
diff changeset
   103
        else if scope = Chained then I
7e45a83373c8 tuned time slicing (from Jasmin)
desharna
parents: 82206
diff changeset
   104
        else apfst (cons thm)) facts
82203
c535cfba16db take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents: 82202
diff changeset
   105
      |> apfst (append chained)
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   106
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   107
    val timer = Timer.startRealTimer ()
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   108
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   109
    val out =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   110
      (Timeout.apply timeout
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   111
         (Goal.prove ctxt [] [] (Logic.get_goal (Thm.prop_of goal) subgoal))
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   112
         (fn {context = ctxt, ...} =>
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   113
            HEADGOAL (tac_of ctxt name (local_facts, global_facts)));
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   114
       NONE)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   115
      handle ERROR _ => SOME GaveUp
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   116
           | Timeout.TIMEOUT _ => SOME TimedOut
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
    val run_time = Timer.checkRealTimer timer
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   119
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   120
    val (outcome, used_facts) =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   121
      (case out of
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   122
        NONE =>
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   123
        (found_something name;
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   124
         (NONE, map fst facts))
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   125
      | some_failure => (some_failure, []))
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   126
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   127
    val message = fn _ =>
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   128
      (case outcome of
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   129
        NONE =>
82209
a8e92f663481 more tactics in tactic hammer (from Jasmin)
desharna
parents: 82207
diff changeset
   130
        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
   131
          proof_banner mode name, subgoal, subgoal_count)
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   132
      | SOME failure => string_of_atp_failure failure)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   133
  in
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   134
    {outcome = outcome, used_facts = used_facts, used_from = facts,
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   135
     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
   136
  end
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   137
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   138
end;