src/HOL/Tools/try0.ML
author haftmann
Thu, 19 Jun 2025 17:15:40 +0200
changeset 82734 89347c0cc6a3
parent 82455 eaf0b4673ab2
permissions -rw-r--r--
treat map_filter similar to list_all, list_ex, list_ex1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
     1
(* Title:      HOL/Tools/try0.ML
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
     2
   Author:     Jasmin Blanchette, LMU Muenchen
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
     3
   Author:     Martin Desharnais, LMU Muenchen
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
     4
   Author:     Fabian Huch, TU Muenchen
38942
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
     5
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
     6
Try a combination of proof methods.
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
     7
*)
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
     8
46641
8801a24f9e9a renamed 'try_methods' to 'try0'
blanchet
parents: 45666
diff changeset
     9
signature TRY0 =
38942
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
    10
sig
82360
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    11
  val serial_commas : string -> string list -> string list
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    12
82355
4ace4f6f7101 tuned naming
desharna
parents: 82217
diff changeset
    13
  type xref = Facts.ref * Token.src list
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    14
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    15
  type facts =
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    16
    {usings: xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    17
     simps : xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    18
     intros : xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    19
     elims : xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    20
     dests : xref list}
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    21
  val empty_facts : facts
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    22
82213
559399b4de9f tuned to use stronger type Time.time
desharna
parents: 81470
diff changeset
    23
  type result = {name: string, command: string, time: Time.time, state: Proof.state}
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    24
  type proof_method = Time.time option -> facts -> Proof.state -> result option
82358
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    25
  type proof_method_options = {run_if_auto_try: bool}
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    26
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    27
  val register_proof_method : string -> proof_method_options -> proof_method -> unit
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    28
  val get_proof_method : string -> proof_method option
82369
eae75676ecd7 refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents: 82366
diff changeset
    29
  val get_proof_method_or_noop : string -> proof_method
82363
3a7fc54b50ca tuned and moved configuration of auto_try0 to theory HOL
desharna
parents: 82362
diff changeset
    30
  val get_all_proof_method_names : unit -> string list
82358
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    31
82396
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
    32
  val schedule : string Config.T
82455
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
    33
  val get_schedule : Proof.context -> string list list
82396
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
    34
82360
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    35
  datatype mode = Auto_Try | Try | Normal
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    36
  val generic_try0 : mode -> Time.time option -> facts -> Proof.state ->
82360
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    37
    (bool * (string * string list)) * result list
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    38
  val try0 : Time.time option -> facts -> Proof.state -> result list
81365
Fabian Huch <huch@in.tum.de>
parents: 81364
diff changeset
    39
end
38942
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
    40
46641
8801a24f9e9a renamed 'try_methods' to 'try0'
blanchet
parents: 45666
diff changeset
    41
structure Try0 : TRY0 =
38942
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
    42
struct
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
    43
82360
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    44
fun serial_commas _ [] = ["??"]
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    45
  | serial_commas _ [s] = [s]
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    46
  | serial_commas conj [s1, s2] = [s1, conj, s2]
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    47
  | serial_commas conj [s1, s2, s3] = [s1 ^ ",", s2 ^ ",", conj, s3]
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    48
  | serial_commas conj (s :: ss) = s ^ "," :: serial_commas conj ss;
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    49
81365
Fabian Huch <huch@in.tum.de>
parents: 81364
diff changeset
    50
val noneN = "none"
43026
0f15575a6465 handle non-auto try cases gracefully in Try Methods
blanchet
parents: 43024
diff changeset
    51
81365
Fabian Huch <huch@in.tum.de>
parents: 81364
diff changeset
    52
datatype mode = Auto_Try | Try | Normal
43020
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 43018
diff changeset
    53
81365
Fabian Huch <huch@in.tum.de>
parents: 81364
diff changeset
    54
val default_timeout = seconds 5.0
38944
827c98e8ba8b fiddling with "try"
blanchet
parents: 38942
diff changeset
    55
81369
0677712016b5 try0: add 'use' modifier for thms to insert;
Fabian Huch <huch@in.tum.de>
parents: 81368
diff changeset
    56
datatype modifier = Use | Simp | Intro | Elim | Dest
82355
4ace4f6f7101 tuned naming
desharna
parents: 82217
diff changeset
    57
type xref = Facts.ref * Token.src list
4ace4f6f7101 tuned naming
desharna
parents: 82217
diff changeset
    58
type tagged_xref = xref * modifier list
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    59
type facts =
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    60
  {usings: xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    61
   simps : xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    62
   intros : xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    63
   elims : xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    64
   dests : xref list}
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    65
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    66
val empty_facts: facts = {usings = [], simps = [], intros = [], elims = [], dests = []}
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    67
fun union_facts (left : facts) (right : facts) : facts =
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    68
  {usings = #usings left @ #usings right,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    69
   simps = #simps left @ #simps right,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    70
   intros = #intros left @ #intros right,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    71
   elims = #elims left @ #elims right,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    72
   dests = #dests left @ #dests right}
81366
e020e7bfbbfa clarified: proper type;
Fabian Huch <huch@in.tum.de>
parents: 81365
diff changeset
    73
82213
559399b4de9f tuned to use stronger type Time.time
desharna
parents: 81470
diff changeset
    74
type result = {name: string, command: string, time: Time.time, state: Proof.state}
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    75
type proof_method = Time.time option -> facts -> Proof.state -> result option
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    76
type proof_method_options = {run_if_auto_try: bool}
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    77
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    78
val noop_proof_method : proof_method = fn _ => fn _ => fn _ => NONE
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    79
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    80
local
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    81
  val proof_methods =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    82
    Synchronized.var "Try0.proof_methods" (Symtab.empty : proof_method Symtab.table);
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    83
  val auto_try_proof_methods_names =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    84
    Synchronized.var "Try0.auto_try_proof_methods" (Symset.empty : Symset.T);
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    85
in
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    86
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    87
fun register_proof_method name ({run_if_auto_try} : proof_method_options) proof_method =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    88
  let
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    89
    val () = if name = "" then error "Registering unnamed proof method" else ()
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    90
    val () = Synchronized.change proof_methods (Symtab.update (name, proof_method))
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    91
    val () =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    92
      if run_if_auto_try then
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    93
        Synchronized.change auto_try_proof_methods_names (Symset.insert name)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    94
      else
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    95
        ()
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    96
  in () end
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    97
82358
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    98
fun get_proof_method (name : string) : proof_method option =
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    99
  Symtab.lookup (Synchronized.value proof_methods) name;
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   100
82358
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
   101
fun get_all_proof_method_names () : string list =
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   102
  Symtab.fold (fn (name, _) => fn names => name :: names) (Synchronized.value proof_methods) []
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   103
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   104
fun should_auto_try_proof_method (name : string) : bool =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   105
  Symset.member (Synchronized.value auto_try_proof_methods_names) name
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   106
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   107
end
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   108
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   109
fun get_proof_method_or_noop name =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   110
  (case get_proof_method name of
82397
ae2af2e085fd added proof method "iprover" to try0
desharna
parents: 82396
diff changeset
   111
    NONE => (warning ("Proof method \"" ^ name ^ "\" is undefined"); noop_proof_method)
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   112
  | SOME proof_method => proof_method)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   113
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   114
fun maybe_apply_proof_method name mode : proof_method =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   115
  if mode <> Auto_Try orelse should_auto_try_proof_method name then
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   116
    get_proof_method_or_noop name
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   117
  else
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   118
    noop_proof_method
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   119
82396
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   120
val schedule = Attrib.setup_config_string \<^binding>\<open>try0_schedule\<close> (K "")
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   121
82455
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   122
fun get_schedule (ctxt : Proof.context) : string list list =
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   123
  let
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   124
    fun some_nonempty_string sub =
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   125
      if Substring.isEmpty sub then
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   126
        NONE
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   127
      else
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   128
        SOME (Substring.string sub)
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   129
  in
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   130
    Config.get ctxt schedule
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   131
    |> Substring.full
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   132
    |> Substring.tokens (fn c => c = #"|")
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   133
    |> map (map_filter some_nonempty_string o Substring.tokens Char.isSpace)
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   134
  end
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   135
82396
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   136
local
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   137
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   138
fun time_string time = string_of_int (Time.toMilliseconds time) ^ " ms"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   139
fun tool_time_string (s, time) = s ^ ": " ^ time_string time
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   140
82396
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   141
fun generic_try0_step mode (timeout_opt : Time.time option) (facts : facts) (st : Proof.state)
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   142
  (proof_methods : string list) =
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   143
  let
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   144
    fun try_method (method : mode -> proof_method) = method mode timeout_opt facts st
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   145
    fun get_message {command, time, ...} = "Found proof: " ^ Active.sendback_markup_command
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   146
      command ^ " (" ^ time_string time ^ ")"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   147
    val print_step = Option.map (tap (writeln o get_message))
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   148
    fun get_results methods : result list =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   149
      if mode = Normal then
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   150
        methods
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   151
        |> Par_List.map (try_method #> print_step)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   152
        |> map_filter I
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   153
        |> sort (Time.compare o apply2 #time)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   154
      else
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   155
        methods
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   156
        |> Par_List.get_some try_method
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   157
        |> the_list
82396
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   158
    val maybe_apply_methods = map maybe_apply_proof_method proof_methods
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   159
  in
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   160
    if mode = Normal then
82396
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   161
      let val names = map quote proof_methods in
82360
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
   162
        writeln ("Trying " ^ implode_space (serial_commas "and" names) ^ "...")
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   163
      end
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   164
    else
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   165
      ();
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   166
    (case get_results maybe_apply_methods of
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   167
      [] => (if mode = Normal then writeln "No proof found" else (); ((false, (noneN, [])), []))
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   168
    | results as {name, command, ...} :: _ =>
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   169
      let
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   170
        val method_times =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   171
          results
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   172
          |> map (fn {name, time, ...} => (time, name))
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   173
          |> AList.coalesce (op =)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   174
          |> map (swap o apsnd commas)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   175
        val message =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   176
          (case mode of
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   177
             Auto_Try => "Auto Try0 found a proof"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   178
           | Try => "Try0 found a proof"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   179
           | Normal => "Try this") ^ ": " ^
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   180
          Active.sendback_markup_command command ^
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   181
          (case method_times of
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   182
            [(_, ms)] => " (" ^ time_string ms ^ ")"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   183
          | method_times => "\n(" ^ space_implode "; " (map tool_time_string method_times) ^ ")")
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   184
      in
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   185
        ((true, (name, if mode = Auto_Try then [message] else (writeln message; []))), results)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   186
      end)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   187
  end
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   188
82396
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   189
in
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   190
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   191
fun generic_try0 mode (timeout_opt : Time.time option) (facts : facts) (st : Proof.state) =
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   192
  let
82455
eaf0b4673ab2 clarified signature
desharna
parents: 82397
diff changeset
   193
    val schedule = get_schedule (Proof.context_of st)
82396
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   194
    fun iterate [] = ((false, (noneN, [])), [])
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   195
      | iterate (proof_methods :: proof_methodss) =
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   196
        (case generic_try0_step mode timeout_opt facts st proof_methods of
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   197
          (_, []) => iterate proof_methodss
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   198
        | result as (_, _ :: _) => result)
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   199
  in
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   200
    iterate (if null schedule then [get_all_proof_method_names ()] else schedule)
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   201
  end;
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   202
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   203
end
7230281bde03 added a user-configurable schedule to try0
desharna
parents: 82369
diff changeset
   204
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   205
fun try0 timeout_opt = snd oo generic_try0 Normal timeout_opt
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   206
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   207
fun try0_trans (facts : facts) =
82366
desharna
parents: 82364
diff changeset
   208
  Toplevel.keep_proof (ignore o try0 (SOME default_timeout) facts o Toplevel.proof_of)
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   209
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   210
val parse_fact_refs = Scan.repeat1 (Scan.unless (Parse.name -- Args.colon) Parse.thm)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   211
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   212
val parse_attr =
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   213
  Args.$$$ "simp" |-- Args.colon |-- parse_fact_refs >> (fn xrefs =>
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   214
    {usings = [], simps = xrefs, intros = [], elims = [], dests = []})
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   215
  || Args.$$$ "intro" |-- Args.colon |-- parse_fact_refs >> (fn xrefs =>
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   216
    {usings = [], simps = [], intros = xrefs, elims = [], dests = []})
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   217
  || Args.$$$ "elim" |-- Args.colon |-- parse_fact_refs >> (fn xrefs =>
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   218
    {usings = [], simps = [], intros = [], elims = xrefs, dests = []})
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   219
  || Args.$$$ "dest" |-- Args.colon |-- parse_fact_refs >> (fn xrefs =>
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   220
    {usings = [], simps = [], intros = [], elims = [], dests = xrefs})
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   221
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   222
fun parse_attrs x =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   223
  (Args.parens parse_attrs
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   224
   || Scan.repeat parse_attr >> (fn factss => fold union_facts factss empty_facts)) x
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   225
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   226
val _ =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   227
  Outer_Syntax.command \<^command_keyword>\<open>try0\<close> "try a combination of proof methods"
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   228
    (Scan.optional parse_attrs empty_facts #>> try0_trans)
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   229
82216
9807c44f5d57 tuned: restricted visibility of definitions
desharna
parents: 82215
diff changeset
   230
end