src/HOL/Tools/Mirabelle/mirabelle.ML
author haftmann
Fri, 27 Jun 2025 08:09:26 +0200
changeset 82775 61c39a9e5415
parent 81529 92a3017f7d1a
permissions -rw-r--r--
typo
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
76183
8089593a364a proper file headers;
wenzelm
parents: 75080
diff changeset
     1
(*  Title:      HOL/Tools/Mirabelle/mirabelle.ML
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
     2
    Author:     Jasmin Blanchette, TU Munich
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
     3
    Author:     Sascha Boehme, TU Munich
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
     4
    Author:     Makarius
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
     5
    Author:     Martin Desharnais, UniBw Munich
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
     6
*)
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
     7
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
     8
signature MIRABELLE =
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
     9
sig
32564
378528d2f7eb standard headers and text sections;
wenzelm
parents: 32551
diff changeset
    10
  (*core*)
74078
a2cbe81e1e32 changed Mirabelle_Sledgehammer keep option from path to boolean
desharna
parents: 74077
diff changeset
    11
  type action_context =
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    12
    {index: int, label: string, name: string, arguments: Properties.T, timeout: Time.time,
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    13
     output_dir: Path.T}
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    14
  type command =
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    15
    {theory_index: int, name: string, pos: Position.T, pre: Proof.state, post: Toplevel.state}
75003
f21e7e6172a0 renamed run_action to run in Mirabelle.action record
desharna
parents: 74991
diff changeset
    16
  type action = {run: command -> string, finalize: unit -> string}
74948
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
    17
  val register_action: string -> (action_context -> string * action) -> unit
32495
6decc1ffdbed removed unused signature
boehmes
parents: 32489
diff changeset
    18
32564
378528d2f7eb standard headers and text sections;
wenzelm
parents: 32551
diff changeset
    19
  (*utility functions*)
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    20
  val print_exn: exn -> string
32469
1ad7d4fc0954 Mirabelle: added preliminary documentation,
boehmes
parents: 32468
diff changeset
    21
  val can_apply : Time.time -> (Proof.context -> int -> tactic) ->
1ad7d4fc0954 Mirabelle: added preliminary documentation,
boehmes
parents: 32468
diff changeset
    22
    Proof.state -> bool
60361
88505460fde7 clarified context;
wenzelm
parents: 56161
diff changeset
    23
  val theorems_in_proof_term : theory -> thm -> thm list
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    24
  val theorems_of_sucessful_proof: Toplevel.state -> thm list
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    25
  val get_argument : (string * string) list -> string * string -> string
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    26
  val get_int_argument : (string * string) list -> string * int -> int
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    27
  val get_bool_argument : (string * string) list -> string * bool -> bool
32498
1132c7c13f36 Mirabelle: actions are responsible for handling exceptions,
boehmes
parents: 32497
diff changeset
    28
  val cpu_time : ('a -> 'b) -> 'a -> 'b * int
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
    29
end
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
    30
32497
922718ac81e4 removed errors overseen in previous changes
boehmes
parents: 32496
diff changeset
    31
structure Mirabelle : MIRABELLE =
32495
6decc1ffdbed removed unused signature
boehmes
parents: 32489
diff changeset
    32
struct
6decc1ffdbed removed unused signature
boehmes
parents: 32489
diff changeset
    33
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    34
(** Mirabelle core **)
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    35
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    36
(* concrete syntax *)
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    37
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    38
fun read_actions str =
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    39
  let
74558
44dc1661a5cb clarified signature;
wenzelm
parents: 74514
diff changeset
    40
    val thy = \<^theory>;
44dc1661a5cb clarified signature;
wenzelm
parents: 74514
diff changeset
    41
    val ctxt = Proof_Context.init_global thy
74567
40910c47d7a1 tuned signature;
wenzelm
parents: 74564
diff changeset
    42
    val keywords = Keyword.no_major_keywords (Thy_Header.get_keywords thy)
74558
44dc1661a5cb clarified signature;
wenzelm
parents: 74514
diff changeset
    43
74564
0a66a61e740c clarified modules;
wenzelm
parents: 74558
diff changeset
    44
    fun read_actions () = Parse.read_embedded ctxt keywords
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    45
      (Parse.enum ";" (Parse.name -- Sledgehammer_Commands.parse_params))
74558
44dc1661a5cb clarified signature;
wenzelm
parents: 74514
diff changeset
    46
      (Input.string str)
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    47
    fun split_name_label (name, args) labels =
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    48
        (case String.tokens (fn c => c = #".") name of
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    49
          [name] => (("", name, args), labels)
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    50
        | [label, name] =>
77723
b761c91c2447 performance tuning: prefer functor Set() over Table();
wenzelm
parents: 76183
diff changeset
    51
          (if Symset.member labels label then
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    52
             error ("Action label '" ^ label ^ "' already defined.")
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    53
           else
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    54
             ();
77723
b761c91c2447 performance tuning: prefer functor Set() over Table();
wenzelm
parents: 76183
diff changeset
    55
           ((label, name, args), Symset.insert label labels))
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    56
        | _ => error "Cannot parse action")
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    57
  in
74558
44dc1661a5cb clarified signature;
wenzelm
parents: 74514
diff changeset
    58
    try read_actions ()
77723
b761c91c2447 performance tuning: prefer functor Set() over Table();
wenzelm
parents: 76183
diff changeset
    59
    |> Option.map (fn xs => fst (fold_map split_name_label xs Symset.empty))
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    60
  end
32385
594890623c46 split actions from Mirabelle core (Mirabelle may thus be applied to basic theories in HOL)
boehmes
parents: 32383
diff changeset
    61
594890623c46 split actions from Mirabelle core (Mirabelle may thus be applied to basic theories in HOL)
boehmes
parents: 32383
diff changeset
    62
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    63
(* actions *)
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    64
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    65
type command =
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    66
  {theory_index: int, name: string, pos: Position.T, pre: Proof.state, post: Toplevel.state};
74078
a2cbe81e1e32 changed Mirabelle_Sledgehammer keep option from path to boolean
desharna
parents: 74077
diff changeset
    67
type action_context =
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    68
  {index: int, label: string, name: string, arguments: Properties.T, timeout: Time.time,
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
    69
   output_dir: Path.T};
75003
f21e7e6172a0 renamed run_action to run in Mirabelle.action record
desharna
parents: 74991
diff changeset
    70
type action = {run: command -> string, finalize: unit -> string};
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
    71
75003
f21e7e6172a0 renamed run_action to run in Mirabelle.action record
desharna
parents: 74991
diff changeset
    72
val dry_run_action : action = {run = K "", finalize = K ""}
74989
003f378b78a5 added Mirabelle option "-y" for dry run
desharna
parents: 74987
diff changeset
    73
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    74
local
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    75
  val actions = Synchronized.var "Mirabelle.actions"
74948
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
    76
    (Symtab.empty : (action_context -> string * action) Symtab.table);
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    77
in
73694
60519a7bfc53 clarified signature;
wenzelm
parents: 73691
diff changeset
    78
73851
bb277f37c34a added warnings when defining unamed or redefining Mirabelle action
desharna
parents: 73850
diff changeset
    79
fun register_action name make_action =
bb277f37c34a added warnings when defining unamed or redefining Mirabelle action
desharna
parents: 73850
diff changeset
    80
  (if name = "" then error "Registering unnamed Mirabelle action" else ();
bb277f37c34a added warnings when defining unamed or redefining Mirabelle action
desharna
parents: 73850
diff changeset
    81
   Synchronized.change actions (Symtab.map_default (name, make_action)
bb277f37c34a added warnings when defining unamed or redefining Mirabelle action
desharna
parents: 73850
diff changeset
    82
     (fn f => (warning ("Redefining Mirabelle action: " ^ quote name); f))));
73694
60519a7bfc53 clarified signature;
wenzelm
parents: 73691
diff changeset
    83
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    84
fun get_action name = Symtab.lookup (Synchronized.value actions) name;
73694
60519a7bfc53 clarified signature;
wenzelm
parents: 73691
diff changeset
    85
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    86
end
73694
60519a7bfc53 clarified signature;
wenzelm
parents: 73691
diff changeset
    87
60519a7bfc53 clarified signature;
wenzelm
parents: 73691
diff changeset
    88
60519a7bfc53 clarified signature;
wenzelm
parents: 73691
diff changeset
    89
(* apply actions *)
60519a7bfc53 clarified signature;
wenzelm
parents: 73691
diff changeset
    90
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    91
fun print_exn exn =
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    92
  (case exn of
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    93
    Timeout.TIMEOUT _ => "timeout"
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
    94
  | ERROR msg => "error: " ^ msg
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    95
  | exn => "exception: " ^ General.exnMessage exn);
34035
08d34921b7dd also consider the fully-typed version of metis for Mirabelle measurements
boehmes
parents: 33522
diff changeset
    96
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    97
fun run_action_function f =
78709
ebafb2daabb7 tuned: prefer antiquotation for try-catch;
wenzelm
parents: 77866
diff changeset
    98
  \<^try>\<open>f () catch exn => print_exn exn\<close>;
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
    99
74745
f54c81fe84f2 revert temporary workaround 6d111935299c;
wenzelm
parents: 74567
diff changeset
   100
fun make_action_path ({index, label, name, ...} : action_context) =
f54c81fe84f2 revert temporary workaround 6d111935299c;
wenzelm
parents: 74567
diff changeset
   101
  Path.basic (if label = "" then string_of_int index ^ "." ^ name else label);
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   102
74948
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   103
fun initialize_action (make_action : action_context -> string * action) context =
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   104
  let
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   105
    val (s, action) = make_action context
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   106
    val action_path = make_action_path context;
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   107
    val export_name =
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   108
      Path.binding0 (Path.basic "mirabelle" + action_path + Path.basic "initialize");
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   109
    val () =
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   110
      if s <> "" then
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   111
        Export.export \<^theory> export_name [XML.Text s]
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   112
      else
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   113
        ()
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   114
  in
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   115
    action
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   116
  end
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   117
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   118
fun finalize_action ({finalize, ...} : action) context =
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   119
  let
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   120
    val s = run_action_function finalize;
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   121
    val action_path = make_action_path context;
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   122
    val export_name =
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   123
      Path.binding0 (Path.basic "mirabelle" + action_path + Path.basic "finalize");
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   124
  in
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   125
    if s <> "" then
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   126
      Export.export \<^theory> export_name [XML.Text s]
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   127
    else
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   128
      ()
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   129
  end
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   130
75003
f21e7e6172a0 renamed run_action to run in Mirabelle.action record
desharna
parents: 74991
diff changeset
   131
fun apply_action ({run, ...} : action) context (command as {pos, pre, ...} : command) =
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   132
  let
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   133
    val thy = Proof.theory_of pre;
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   134
    val action_path = make_action_path context;
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   135
    val goal_name_path = Path.basic (#name command)
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   136
    val line_path = Path.basic (string_of_int (the (Position.line_of pos)));
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   137
    val offset_path = Path.basic (string_of_int (the (Position.offset_of pos)));
75003
f21e7e6172a0 renamed run_action to run in Mirabelle.action record
desharna
parents: 74991
diff changeset
   138
    val ({elapsed, ...}, s) = Timing.timing run_action_function (fn () => run command);
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   139
    val export_name =
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   140
      Path.binding0 (Path.basic "mirabelle" + action_path + Path.basic "goal" + goal_name_path +
74991
d699eb2d26ad used elapsed time instead of cpu time in Mirabelle because the latter contain cpu time of all threads
desharna
parents: 74989
diff changeset
   141
        line_path + offset_path + Path.basic (string_of_int (Time.toMilliseconds elapsed)));
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   142
  in
74989
003f378b78a5 added Mirabelle option "-y" for dry run
desharna
parents: 74987
diff changeset
   143
    Export.export thy export_name [XML.Text s]
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   144
  end;
32515
e7c0d3c0494a Mirabelle: actions are responsible for catching exceptions and producing suitable log messages (makes log message uniform),
boehmes
parents: 32504
diff changeset
   145
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   146
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   147
(* theory line range *)
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   148
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   149
local
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   150
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   151
val theory_name =
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   152
  Scan.many1 (Symbol_Pos.symbol #> (fn s => Symbol.not_eof s andalso s <> "["))
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   153
    >> Symbol_Pos.content;
32498
1132c7c13f36 Mirabelle: actions are responsible for handling exceptions,
boehmes
parents: 32497
diff changeset
   154
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   155
val line = Symbol_Pos.scan_nat >> (Symbol_Pos.content #> Value.parse_nat);
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   156
val end_line = Symbol_Pos.$$ ":" |-- line;
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   157
val range = Symbol_Pos.$$ "[" |-- line -- Scan.option end_line --| Symbol_Pos.$$ "]";
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   158
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   159
in
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   160
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   161
fun read_theory_range str =
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   162
  (case Scan.read Symbol_Pos.stopper (theory_name -- Scan.option range) (Symbol_Pos.explode0 str) of
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   163
    SOME res => res
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   164
  | NONE => error ("Malformed specification of theory line range: " ^ quote str));
32472
7b92a8b8daaf Mirabelle: actions are responsible for their log messages, output is better readable
boehmes
parents: 32469
diff changeset
   165
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   166
end;
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   167
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   168
fun check_theories strs =
32521
f20cc66b2c74 added initialization and cleanup of actions,
boehmes
parents: 32515
diff changeset
   169
  let
74069
ffbd1b7e5439 tuned Mirabelle's theory selection
desharna
parents: 73854
diff changeset
   170
    fun theory_import_name s =
ffbd1b7e5439 tuned Mirabelle's theory selection
desharna
parents: 73854
diff changeset
   171
      #theory_name (Resources.import_name (Session.get_name ()) Path.current s);
ffbd1b7e5439 tuned Mirabelle's theory selection
desharna
parents: 73854
diff changeset
   172
    val theories = map read_theory_range strs
ffbd1b7e5439 tuned Mirabelle's theory selection
desharna
parents: 73854
diff changeset
   173
      |> map (apfst theory_import_name);
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   174
    fun get_theory name =
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   175
      if null theories then SOME NONE
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   176
      else get_first (fn (a, b) => if a = name then SOME b else NONE) theories;
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   177
    fun check_line NONE _ = false
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   178
      | check_line _ NONE = true
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   179
      | check_line (SOME NONE) _ = true
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   180
      | check_line (SOME (SOME (line, NONE))) (SOME i) = line <= i
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   181
      | check_line (SOME (SOME (line, SOME end_line))) (SOME i) = line <= i andalso i <= end_line;
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   182
    fun check_pos range = check_line range o Position.line_of;
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   183
  in check_pos o get_theory end;
32521
f20cc66b2c74 added initialization and cleanup of actions,
boehmes
parents: 32515
diff changeset
   184
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   185
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   186
(* presentation hook *)
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   187
75080
1dae5cbcd358 Mirabelle now considers goals preceding "unfolding" and "using" commands
desharna
parents: 75003
diff changeset
   188
val whitelist = ["apply", "by", "proof", "unfolding", "using"];
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   189
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   190
val _ =
73822
1192c68ebe1c suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents: 73821
diff changeset
   191
  Build.add_hook (fn qualifier => fn loaded_theories =>
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   192
    let
73820
745e2cd1f5f5 refer to theory "segments" only, according to global Build.build_theories and Thy_Info.use_theories;
wenzelm
parents: 73808
diff changeset
   193
      val mirabelle_actions = Options.default_string \<^system_option>\<open>mirabelle_actions\<close>;
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   194
      val actions =
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   195
        (case read_actions mirabelle_actions of
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   196
          SOME actions => actions
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   197
        | NONE => error ("Failed to parse mirabelle_actions: " ^ quote mirabelle_actions));
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   198
    in
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   199
      if null actions then
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   200
        ()
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   201
      else
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   202
        let
74989
003f378b78a5 added Mirabelle option "-y" for dry run
desharna
parents: 74987
diff changeset
   203
          val mirabelle_dry_run = Options.default_bool \<^system_option>\<open>mirabelle_dry_run\<close>;
73849
4eac16052a94 tuned Mirabelle
desharna
parents: 73848
diff changeset
   204
          val mirabelle_timeout = Options.default_seconds \<^system_option>\<open>mirabelle_timeout\<close>;
4eac16052a94 tuned Mirabelle
desharna
parents: 73848
diff changeset
   205
          val mirabelle_stride = Options.default_int \<^system_option>\<open>mirabelle_stride\<close>;
4eac16052a94 tuned Mirabelle
desharna
parents: 73848
diff changeset
   206
          val mirabelle_max_calls = Options.default_int \<^system_option>\<open>mirabelle_max_calls\<close>;
74986
fc664e4fbf6d added Mirabelle option -r to randomize the goals before selection
desharna
parents: 74948
diff changeset
   207
          val mirabelle_randomize = Options.default_int \<^system_option>\<open>mirabelle_randomize\<close>;
73849
4eac16052a94 tuned Mirabelle
desharna
parents: 73848
diff changeset
   208
          val mirabelle_theories = Options.default_string \<^system_option>\<open>mirabelle_theories\<close>;
74745
f54c81fe84f2 revert temporary workaround 6d111935299c;
wenzelm
parents: 74567
diff changeset
   209
          val mirabelle_output_dir = Options.default_string \<^system_option>\<open>mirabelle_output_dir\<close>;
81528
e4b4141e6954 added parallel_group_size option to Mirabelle
desharna
parents: 78709
diff changeset
   210
          val mirabelle_parallel_group_size = Options.default_int \<^system_option>\<open>mirabelle_parallel_group_size\<close>;
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   211
          val check_theory = check_theories (space_explode "," mirabelle_theories);
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   212
81528
e4b4141e6954 added parallel_group_size option to Mirabelle
desharna
parents: 78709
diff changeset
   213
          fun parallel_app (f : 'a -> unit) (xs : 'a list) : unit =
e4b4141e6954 added parallel_group_size option to Mirabelle
desharna
parents: 78709
diff changeset
   214
            chop_groups mirabelle_parallel_group_size xs
e4b4141e6954 added parallel_group_size option to Mirabelle
desharna
parents: 78709
diff changeset
   215
            |> List.app (ignore o Par_List.map f)
e4b4141e6954 added parallel_group_size option to Mirabelle
desharna
parents: 78709
diff changeset
   216
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   217
          fun make_commands (thy_index, (thy, segments)) =
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   218
            let
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   219
              val thy_long_name = Context.theory_long_name thy;
74069
ffbd1b7e5439 tuned Mirabelle's theory selection
desharna
parents: 73854
diff changeset
   220
              val check_thy = check_theory thy_long_name;
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   221
              fun make_command {command = tr, prev_state = st, state = st', ...} =
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73820
diff changeset
   222
                let
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73820
diff changeset
   223
                  val name = Toplevel.name_of tr;
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73820
diff changeset
   224
                  val pos = Toplevel.pos_of tr;
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73820
diff changeset
   225
                in
73824
6e9a47d3850c more robust within session "HOL";
wenzelm
parents: 73822
diff changeset
   226
                  if Context.proper_subthy (\<^theory>, thy) andalso
6e9a47d3850c more robust within session "HOL";
wenzelm
parents: 73822
diff changeset
   227
                    can (Proof.assert_backward o Toplevel.proof_of) st andalso
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   228
                    member (op =) whitelist name andalso check_thy pos
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   229
                  then SOME {theory_index = thy_index, name = name, pos = pos,
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   230
                    pre = Toplevel.proof_of st, post = st'}
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73820
diff changeset
   231
                  else NONE
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   232
                end;
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   233
            in
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   234
              if Resources.theory_qualifier thy_long_name = qualifier then
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   235
                map_filter make_command segments
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   236
              else
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   237
                []
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   238
            end;
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73820
diff changeset
   239
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   240
          (* initialize actions *)
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
   241
          val contexts = actions |> map_index (fn (n, (label, name, args)) =>
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   242
            let
74514
9a2d290a3a0b added error message on invalid Mirabelle action
desharna
parents: 74511
diff changeset
   243
              val make_action =
9a2d290a3a0b added error message on invalid Mirabelle action
desharna
parents: 74511
diff changeset
   244
                (case get_action name of
9a2d290a3a0b added error message on invalid Mirabelle action
desharna
parents: 74511
diff changeset
   245
                  SOME f => f
9a2d290a3a0b added error message on invalid Mirabelle action
desharna
parents: 74511
diff changeset
   246
                | NONE => error "Unknown action");
74511
6d111935299c produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents: 74125
diff changeset
   247
              val action_subdir = if label = "" then string_of_int n ^ "." ^ name else label;
74745
f54c81fe84f2 revert temporary workaround 6d111935299c;
wenzelm
parents: 74567
diff changeset
   248
              val output_dir =
f54c81fe84f2 revert temporary workaround 6d111935299c;
wenzelm
parents: 74567
diff changeset
   249
                Path.append (Path.explode mirabelle_output_dir) (Path.basic action_subdir);
74078
a2cbe81e1e32 changed Mirabelle_Sledgehammer keep option from path to boolean
desharna
parents: 74077
diff changeset
   250
              val context =
74125
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
   251
                {index = n, label = label, name = name, arguments = args,
94c27a7a0d39 added option labels to Mirabelle actions
desharna
parents: 74078
diff changeset
   252
                 timeout = mirabelle_timeout, output_dir = output_dir};
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   253
            in
74948
15ce207f69c8 added support for initialization messages to Mirabelle
desharna
parents: 74745
diff changeset
   254
              (initialize_action make_action context, context)
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   255
            end);
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   256
        in
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   257
          (* run actions on all relevant goals *)
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   258
          loaded_theories
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   259
          |> map_index I
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   260
          |> maps make_commands
74986
fc664e4fbf6d added Mirabelle option -r to randomize the goals before selection
desharna
parents: 74948
diff changeset
   261
          |> (if mirabelle_randomize <= 0 then
fc664e4fbf6d added Mirabelle option -r to randomize the goals before selection
desharna
parents: 74948
diff changeset
   262
                I
fc664e4fbf6d added Mirabelle option -r to randomize the goals before selection
desharna
parents: 74948
diff changeset
   263
              else
fc664e4fbf6d added Mirabelle option -r to randomize the goals before selection
desharna
parents: 74948
diff changeset
   264
                fst o MLCG.shuffle (MLCG.initialize mirabelle_randomize))
74077
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   265
          |> (fn xs => fold_map (fn x => fn i => ((i, x), i + 1)) xs 0)
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   266
          |> (fn (indexed_commands, commands_length) =>
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   267
            let
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   268
              val stride =
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   269
                if mirabelle_stride <= 0 then
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   270
                  Integer.max 1 (commands_length div mirabelle_max_calls)
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   271
                else
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   272
                  mirabelle_stride
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   273
            in
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   274
              maps (fn (n, command) =>
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   275
              let val (m, k) = Integer.div_mod (n + 1) stride in
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   276
                if k = 0 andalso (mirabelle_max_calls <= 0 orelse m <= mirabelle_max_calls) then
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   277
                  map (fn context => (context, command)) contexts
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   278
                else
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   279
                  []
b93d8c2ebab0 added automatic uniform stride option to Mirabelle
desharna
parents: 74069
diff changeset
   280
              end) indexed_commands
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   281
            end)
74989
003f378b78a5 added Mirabelle option "-y" for dry run
desharna
parents: 74987
diff changeset
   282
          (* Don't use multithreading for a dry run because of the high per-thread overhead. *)
81528
e4b4141e6954 added parallel_group_size option to Mirabelle
desharna
parents: 78709
diff changeset
   283
          |> (if mirabelle_dry_run then List.app else parallel_app) (fn ((action, context), command) =>
74989
003f378b78a5 added Mirabelle option "-y" for dry run
desharna
parents: 74987
diff changeset
   284
              apply_action (if mirabelle_dry_run then dry_run_action else action) context command);
73847
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   285
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   286
          (* finalize actions *)
58f6b41efe88 refactored Mirabelle to produce output in real time
desharna
parents: 73822
diff changeset
   287
          List.app (uncurry finalize_action) contexts
73850
93228ff7aa67 tuned whitespace;
wenzelm
parents: 73849
diff changeset
   288
        end
73821
9ead8d9be3ab clarified hook for Mirabelle: provide all loaded theories at once (for each 'theories' section within the session ROOT);
wenzelm
parents: 73820
diff changeset
   289
    end);
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   290
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   291
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   292
(* Mirabelle utility functions *)
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   293
32472
7b92a8b8daaf Mirabelle: actions are responsible for their log messages, output is better readable
boehmes
parents: 32469
diff changeset
   294
fun can_apply time tac st =
32469
1ad7d4fc0954 Mirabelle: added preliminary documentation,
boehmes
parents: 32468
diff changeset
   295
  let
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   296
    val {context = ctxt, facts, goal} = Proof.goal st;
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   297
    val full_tac = HEADGOAL (Method.insert_tac ctxt facts THEN' tac ctxt);
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   298
  in
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62505
diff changeset
   299
    (case try (Timeout.apply time (Seq.pull o full_tac)) goal of
39451
8893562a954b prevent exception when calling "Mirabelle.can_apply" on empty proof sequence;
blanchet
parents: 39377
diff changeset
   300
      SOME (SOME _) => true
8893562a954b prevent exception when calling "Mirabelle.can_apply" on empty proof sequence;
blanchet
parents: 39377
diff changeset
   301
    | _ => false)
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   302
  end;
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   303
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   304
local
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   305
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   306
fun fold_body_thms f =
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   307
  let
77866
3bd1aa2f3517 backout 61f652dd955a;
wenzelm
parents: 77825
diff changeset
   308
    fun app n (PBody {thms, ...}) = thms |> fold (fn (i, thm_node) =>
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   309
      fn (x, seen) =>
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   310
        if Inttab.defined seen i then (x, seen)
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   311
        else
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   312
          let
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   313
            val name = Proofterm.thm_node_name thm_node;
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   314
            val prop = Proofterm.thm_node_prop thm_node;
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   315
            val body = Future.join (Proofterm.thm_node_body thm_node);
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   316
            val (x', seen') =
80306
c2537860ccf8 more accurate thm "name_hint", using Thm_Name.T;
wenzelm
parents: 80295
diff changeset
   317
              app (n + (if Thm_Name.is_empty name then 0 else 1)) body
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   318
                (x, Inttab.update (i, ()) seen);
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   319
        in (x' |> n = 0 ? f (name, prop, body), seen') end);
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   320
  in fn bodies => fn x => #1 (fold (app 0) bodies (x, Inttab.empty)) end;
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   321
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   322
in
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   323
60361
88505460fde7 clarified context;
wenzelm
parents: 56161
diff changeset
   324
fun theorems_in_proof_term thy thm =
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   325
  let
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   326
    val all_thms = Global_Theory.all_thms_of thy true;
80306
c2537860ccf8 more accurate thm "name_hint", using Thm_Name.T;
wenzelm
parents: 80295
diff changeset
   327
    fun collect (name, _, _) = if Thm_Name.is_empty name then I else insert (op =) name;
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   328
    fun member_of xs (x, y) = if member (op =) xs x then SOME y else NONE;
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   329
    fun resolve_thms names = map_filter (member_of names) all_thms;
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   330
  in resolve_thms (fold_body_thms collect [Thm.proof_body_of thm] []) end;
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   331
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   332
end;
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   333
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   334
fun theorems_of_sucessful_proof st =
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   335
  (case try Toplevel.proof_of st of
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   336
    NONE => []
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   337
  | SOME prf => theorems_in_proof_term (Proof.theory_of prf) (#goal (Proof.goal prf)));
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   338
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   339
fun get_argument arguments (key, default) =
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   340
  the_default default (AList.lookup (op =) arguments key);
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   341
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   342
fun get_int_argument arguments (key, default) =
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   343
  (case Option.map Int.fromString (AList.lookup (op =) arguments key) of
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   344
    SOME (SOME i) => i
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   345
  | SOME NONE => error ("bad option: " ^ key)
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   346
  | NONE => default);
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   347
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   348
fun get_bool_argument arguments (key, default) =
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   349
  (case Option.map Bool.fromString (AList.lookup (op =) arguments key) of
73292
f84a93f1de2f tuned Mirabelle to parse option check_trivial only once
desharna
parents: 69597
diff changeset
   350
    SOME (SOME i) => i
f84a93f1de2f tuned Mirabelle to parse option check_trivial only once
desharna
parents: 69597
diff changeset
   351
  | SOME NONE => error ("bad option: " ^ key)
73691
2f9877db82a1 reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents: 73685
diff changeset
   352
  | NONE => default);
73292
f84a93f1de2f tuned Mirabelle to parse option check_trivial only once
desharna
parents: 69597
diff changeset
   353
42014
75417ef605ba simplified various cpu_time clones (!): eliminated odd Exn.capture/Exn.release (no need to "stop" timing);
wenzelm
parents: 42012
diff changeset
   354
fun cpu_time f x =
74991
d699eb2d26ad used elapsed time instead of cpu time in Mirabelle because the latter contain cpu time of all threads
desharna
parents: 74989
diff changeset
   355
  (* CPU time is problematics with multithreading as it refers to the per-process CPU time. *)
d699eb2d26ad used elapsed time instead of cpu time in Mirabelle because the latter contain cpu time of all threads
desharna
parents: 74989
diff changeset
   356
  let val ({elapsed, ...}, y) = Timing.timing f x
d699eb2d26ad used elapsed time instead of cpu time in Mirabelle because the latter contain cpu time of all threads
desharna
parents: 74989
diff changeset
   357
  in (y, Time.toMilliseconds elapsed) end;
32498
1132c7c13f36 Mirabelle: actions are responsible for handling exceptions,
boehmes
parents: 32497
diff changeset
   358
32381
11542bebe4d4 made Mirabelle a component
boehmes
parents:
diff changeset
   359
end