src/HOL/Tools/try0.ML
author desharna
Thu, 27 Mar 2025 16:35:41 +0100
changeset 82364 5af097d05e99
parent 82363 3a7fc54b50ca
child 82366 7816e7be7bc7
permissions -rw-r--r--
tuned signature
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
82363
3a7fc54b50ca tuned and moved configuration of auto_try0 to theory HOL
desharna
parents: 82362
diff changeset
    29
  val get_all_proof_method_names : unit -> string list
82358
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    30
82360
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    31
  datatype mode = Auto_Try | Try | Normal
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    32
  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
    33
    (bool * (string * string list)) * result list
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    34
  val try0 : Time.time option -> facts -> Proof.state -> result list
81365
Fabian Huch <huch@in.tum.de>
parents: 81364
diff changeset
    35
end
38942
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
    36
46641
8801a24f9e9a renamed 'try_methods' to 'try0'
blanchet
parents: 45666
diff changeset
    37
structure Try0 : TRY0 =
38942
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
    38
struct
e10c11971fa7 "try" -- a new diagnosis tool that tries to apply several methods in parallel
blanchet
parents:
diff changeset
    39
82360
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    40
fun serial_commas _ [] = ["??"]
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    41
  | serial_commas _ [s] = [s]
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    42
  | serial_commas conj [s1, s2] = [s1, conj, s2]
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
    43
  | 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
    44
  | 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
    45
81365
Fabian Huch <huch@in.tum.de>
parents: 81364
diff changeset
    46
val noneN = "none"
43026
0f15575a6465 handle non-auto try cases gracefully in Try Methods
blanchet
parents: 43024
diff changeset
    47
81365
Fabian Huch <huch@in.tum.de>
parents: 81364
diff changeset
    48
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
    49
81365
Fabian Huch <huch@in.tum.de>
parents: 81364
diff changeset
    50
val default_timeout = seconds 5.0
38944
827c98e8ba8b fiddling with "try"
blanchet
parents: 38942
diff changeset
    51
81369
0677712016b5 try0: add 'use' modifier for thms to insert;
Fabian Huch <huch@in.tum.de>
parents: 81368
diff changeset
    52
datatype modifier = Use | Simp | Intro | Elim | Dest
82355
4ace4f6f7101 tuned naming
desharna
parents: 82217
diff changeset
    53
type xref = Facts.ref * Token.src list
4ace4f6f7101 tuned naming
desharna
parents: 82217
diff changeset
    54
type tagged_xref = xref * modifier list
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    55
type facts =
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    56
  {usings: xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    57
   simps : xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    58
   intros : xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    59
   elims : xref list,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    60
   dests : xref list}
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    61
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    62
val empty_facts: facts = {usings = [], simps = [], intros = [], elims = [], dests = []}
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    63
fun union_facts (left : facts) (right : facts) : facts =
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    64
  {usings = #usings left @ #usings right,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    65
   simps = #simps left @ #simps right,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    66
   intros = #intros left @ #intros right,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    67
   elims = #elims left @ #elims right,
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    68
   dests = #dests left @ #dests right}
81366
e020e7bfbbfa clarified: proper type;
Fabian Huch <huch@in.tum.de>
parents: 81365
diff changeset
    69
82213
559399b4de9f tuned to use stronger type Time.time
desharna
parents: 81470
diff changeset
    70
type result = {name: string, command: string, time: Time.time, state: Proof.state}
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    71
type proof_method = Time.time option -> facts -> Proof.state -> result option
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    72
type proof_method_options = {run_if_auto_try: bool}
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    73
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    74
val noop_proof_method : proof_method = fn _ => fn _ => fn _ => NONE
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    75
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    76
local
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    77
  val proof_methods =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    78
    Synchronized.var "Try0.proof_methods" (Symtab.empty : proof_method Symtab.table);
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    79
  val auto_try_proof_methods_names =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    80
    Synchronized.var "Try0.auto_try_proof_methods" (Symset.empty : Symset.T);
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    81
in
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    82
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    83
fun register_proof_method name ({run_if_auto_try} : proof_method_options) proof_method =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    84
  let
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    85
    val () = if name = "" then error "Registering unnamed proof method" else ()
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
    86
    val () = Synchronized.change proof_methods (Symtab.update (name, proof_method))
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    87
    val () =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    88
      if run_if_auto_try then
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    89
        Synchronized.change auto_try_proof_methods_names (Symset.insert name)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    90
      else
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    91
        ()
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    92
  in () end
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    93
82358
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    94
fun get_proof_method (name : string) : proof_method option =
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    95
  Symtab.lookup (Synchronized.value proof_methods) name;
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    96
82358
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
    97
fun get_all_proof_methods () : (string * proof_method) list =
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    98
  Symtab.fold (fn x => fn xs => x :: xs) (Synchronized.value proof_methods) []
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
    99
82358
cc85ccb1a6b2 tuned signature
desharna
parents: 82357
diff changeset
   100
fun get_all_proof_method_names () : string list =
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   101
  Symtab.fold (fn (name, _) => fn names => name :: names) (Synchronized.value proof_methods) []
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   102
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   103
fun get_all_auto_try_proof_method_names () : string list =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   104
  Symset.dest (Synchronized.value auto_try_proof_methods_names)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   105
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   106
fun should_auto_try_proof_method (name : string) : bool =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   107
  Symset.member (Synchronized.value auto_try_proof_methods_names) name
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   108
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   109
end
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   110
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   111
fun get_proof_method_or_noop name =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   112
  (case get_proof_method name of
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   113
    NONE => noop_proof_method
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   114
  | SOME proof_method => proof_method)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   115
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   116
fun maybe_apply_proof_method name mode : proof_method =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   117
  if mode <> Auto_Try orelse should_auto_try_proof_method name then
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   118
    get_proof_method_or_noop name
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   119
  else
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   120
    noop_proof_method
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   121
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   122
fun time_string time = string_of_int (Time.toMilliseconds time) ^ " ms"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   123
fun tool_time_string (s, time) = s ^ ": " ^ time_string time
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   124
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   125
fun generic_try0 mode timeout_opt (facts : facts) st =
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   126
  let
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   127
    fun try_method (method : mode -> proof_method) = method mode timeout_opt facts st
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   128
    fun get_message {command, time, ...} = "Found proof: " ^ Active.sendback_markup_command
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   129
      command ^ " (" ^ time_string time ^ ")"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   130
    val print_step = Option.map (tap (writeln o get_message))
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   131
    fun get_results methods : result list =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   132
      if mode = Normal then
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   133
        methods
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   134
        |> Par_List.map (try_method #> print_step)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   135
        |> map_filter I
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   136
        |> sort (Time.compare o apply2 #time)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   137
      else
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   138
        methods
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   139
        |> Par_List.get_some try_method
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   140
        |> the_list
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   141
    val proof_method_names = get_all_proof_method_names ()
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   142
    val maybe_apply_methods = map maybe_apply_proof_method proof_method_names
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   143
  in
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   144
    if mode = Normal then
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   145
      let val names = map quote proof_method_names in
82360
6a09257afd06 moved try0's HOL-specific stuff into own theory
desharna
parents: 82359
diff changeset
   146
        writeln ("Trying " ^ implode_space (serial_commas "and" names) ^ "...")
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   147
      end
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   148
    else
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   149
      ();
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   150
    (case get_results maybe_apply_methods of
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   151
      [] => (if mode = Normal then writeln "No proof found" else (); ((false, (noneN, [])), []))
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   152
    | results as {name, command, ...} :: _ =>
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   153
      let
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   154
        val method_times =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   155
          results
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   156
          |> map (fn {name, time, ...} => (time, name))
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   157
          |> AList.coalesce (op =)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   158
          |> map (swap o apsnd commas)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   159
        val message =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   160
          (case mode of
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   161
             Auto_Try => "Auto Try0 found a proof"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   162
           | Try => "Try0 found a proof"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   163
           | Normal => "Try this") ^ ": " ^
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   164
          Active.sendback_markup_command command ^
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   165
          (case method_times of
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   166
            [(_, ms)] => " (" ^ time_string ms ^ ")"
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   167
          | method_times => "\n(" ^ space_implode "; " (map tool_time_string method_times) ^ ")")
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   168
      in
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   169
        ((true, (name, if mode = Auto_Try then [message] else (writeln message; []))), results)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   170
      end)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   171
  end
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   172
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   173
fun try0 timeout_opt = snd oo generic_try0 Normal timeout_opt
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   174
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   175
fun try0_trans (facts : facts) =
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   176
  Toplevel.keep_proof
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   177
    (ignore o generic_try0 Normal (SOME default_timeout) facts o Toplevel.proof_of)
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   178
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   179
val parse_fact_refs = Scan.repeat1 (Scan.unless (Parse.name -- Args.colon) Parse.thm)
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   180
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   181
val parse_attr =
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   182
  Args.$$$ "simp" |-- Args.colon |-- parse_fact_refs >> (fn xrefs =>
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   183
    {usings = [], simps = xrefs, intros = [], elims = [], dests = []})
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   184
  || Args.$$$ "intro" |-- Args.colon |-- parse_fact_refs >> (fn xrefs =>
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   185
    {usings = [], simps = [], intros = xrefs, elims = [], dests = []})
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   186
  || Args.$$$ "elim" |-- Args.colon |-- parse_fact_refs >> (fn xrefs =>
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   187
    {usings = [], simps = [], intros = [], elims = xrefs, dests = []})
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   188
  || Args.$$$ "dest" |-- Args.colon |-- parse_fact_refs >> (fn xrefs =>
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   189
    {usings = [], simps = [], intros = [], elims = [], dests = xrefs})
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   190
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   191
fun parse_attrs x =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   192
  (Args.parens parse_attrs
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   193
   || Scan.repeat parse_attr >> (fn factss => fold union_facts factss empty_facts)) x
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   194
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   195
val _ =
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   196
  Outer_Syntax.command \<^command_keyword>\<open>try0\<close> "try a combination of proof methods"
82364
5af097d05e99 tuned signature
desharna
parents: 82363
diff changeset
   197
    (Scan.optional parse_attrs empty_facts #>> try0_trans)
82356
79a86a1ecb3d refactored try0's internals
desharna
parents: 82355
diff changeset
   198
82216
9807c44f5d57 tuned: restricted visibility of definitions
desharna
parents: 82215
diff changeset
   199
end