src/HOL/Tools/Sledgehammer/sledgehammer_prover_tactic.ML
author desharna
Tue, 25 Feb 2025 17:43:48 +0100
changeset 82206 80ced0c233d9
parent 82204 c819ee4cdea9
child 82207 7e45a83373c8
permissions -rw-r--r--
tuning time slices in Sledgehammer (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
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    14
  val autoN : string
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    15
  val blastN : string
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    16
  val simpN : string
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    17
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    18
  val tactic_provers : string list
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    19
  val is_tactic_prover : string -> bool
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    20
  val good_slices_of_tactic_prover : string -> base_slice list
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    21
  val run_tactic_prover : mode -> string -> prover
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    22
end;
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    23
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    24
structure Sledgehammer_Prover_Tactic : SLEDGEHAMMER_PROVER_TACTIC =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    25
struct
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    26
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    27
open ATP_Problem_Generate
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    28
open ATP_Proof
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    29
open Sledgehammer_ATP_Systems
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    30
open Sledgehammer_Proof_Methods
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    31
open Sledgehammer_Prover
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    32
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    33
val autoN = "auto"
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    34
val blastN = "blast"
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    35
val simpN = "simp"
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
val tactic_provers = [autoN, blastN, simpN]
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    38
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    39
val is_tactic_prover = member (op =) tactic_provers
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    40
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    41
val meshN = "mesh"
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    42
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    43
fun good_slices_of_tactic_prover name =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    44
  (* FUDGE *)
82206
80ced0c233d9 tuning time slices in Sledgehammer (from Jasmin)
desharna
parents: 82204
diff changeset
    45
  [(1, false, false, 0, meshN),
80ced0c233d9 tuning time slices in Sledgehammer (from Jasmin)
desharna
parents: 82204
diff changeset
    46
   (1, false, false, 2, meshN),
80ced0c233d9 tuning time slices in Sledgehammer (from Jasmin)
desharna
parents: 82204
diff changeset
    47
   (1, false, false, 4, meshN),
80ced0c233d9 tuning time slices in Sledgehammer (from Jasmin)
desharna
parents: 82204
diff changeset
    48
   (1, false, false, 8, meshN),
80ced0c233d9 tuning time slices in Sledgehammer (from Jasmin)
desharna
parents: 82204
diff changeset
    49
   (1, false, false, 16, meshN)]
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    50
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    51
(* In sync with Sledgehammer_Proof_Methods.tac_of_proof_method *)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    52
fun tac_of ctxt name (local_facts, global_facts) =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    53
  if name = autoN then
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    54
    Method.insert_tac ctxt (local_facts @ global_facts) THEN'
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    55
    SELECT_GOAL (Clasimp.auto_tac ctxt)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    56
  else if name = blastN then
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    57
    Method.insert_tac ctxt (local_facts @ global_facts) THEN'
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    58
    blast_tac ctxt
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    59
  else if name = simpN then
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    60
    Method.insert_tac ctxt local_facts THEN'
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    61
    Simplifier.asm_full_simp_tac (ctxt addsimps global_facts)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    62
  else
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    63
    error ("Unknown tactic: " ^ quote name)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    64
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    65
fun meth_of name =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    66
  if name = autoN then
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    67
    Auto_Method
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    68
  else if name = blastN then
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    69
    Blast_Method
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    70
  else if name = simpN then
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    71
    Simp_Method
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    72
  else
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    73
    error ("Unknown tactic: " ^ quote name)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    74
82204
c819ee4cdea9 rescale Sledgehammer slice factor (to allow smaller time slices for tactics like auto) (from Jasmin)
desharna
parents: 82203
diff changeset
    75
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
    76
    ({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
    77
  let
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    78
    val (basic_slice, No_Slice) = slice
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    79
    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
    80
    val {facts = chained, ...} = Proof.goal state
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    81
    val ctxt = Proof.context_of state
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    82
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    83
    val (local_facts, global_facts) =
82203
c535cfba16db take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents: 82202
diff changeset
    84
      ([], [])
c535cfba16db take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents: 82202
diff changeset
    85
      |> fold (fn fact => if fst (snd (fst fact)) = Global then apsnd (cons (snd fact))
c535cfba16db take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents: 82202
diff changeset
    86
        else apfst (cons (snd fact))) facts
c535cfba16db take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents: 82202
diff changeset
    87
      |> apfst (append chained)
82202
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    88
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    89
    val timer = Timer.startRealTimer ()
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    90
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    91
    val out =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    92
      (Timeout.apply timeout
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    93
         (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
    94
         (fn {context = ctxt, ...} =>
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    95
            HEADGOAL (tac_of ctxt name (local_facts, global_facts)));
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    96
       NONE)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    97
      handle ERROR _ => SOME GaveUp
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    98
           | Timeout.TIMEOUT _ => SOME TimedOut
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
    99
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   100
    val run_time = Timer.checkRealTimer timer
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   101
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   102
    val (outcome, used_facts) =
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   103
      (case out of
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   104
        NONE =>
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   105
        (found_something name;
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   106
         (NONE, map fst facts))
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   107
      | some_failure => (some_failure, []))
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 message = fn _ =>
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   110
      (case outcome of
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   111
        NONE =>
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   112
        one_line_proof_text ((used_facts, (meth_of name, Played run_time)), proof_banner mode name,
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   113
          subgoal, subgoal_count)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   114
      | SOME failure => string_of_atp_failure failure)
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   115
  in
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   116
    {outcome = outcome, used_facts = used_facts, used_from = facts,
a1f85f579a07 initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff changeset
   117
     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
   118
  end
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
end;