| author | wenzelm |
| Sat, 16 Oct 2021 20:21:13 +0200 | |
| changeset 74532 | 64d1b02327a4 |
| parent 74511 | 6d111935299c |
| child 74514 | 9a2d290a3a0b |
| permissions | -rw-r--r-- |
| 47847 | 1 |
(* Title: HOL/Mirabelle/Tools/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 | 6 |
*) |
7 |
||
8 |
signature MIRABELLE = |
|
9 |
sig |
|
| 32564 | 10 |
(*core*) |
|
74078
a2cbe81e1e32
changed Mirabelle_Sledgehammer keep option from path to boolean
desharna
parents:
74077
diff
changeset
|
11 |
type action_context = |
| 74125 | 12 |
{index: int, label: string, name: string, arguments: Properties.T, timeout: Time.time,
|
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}
|
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
16 |
type action = {run_action: command -> string, finalize: unit -> string}
|
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
17 |
val register_action: string -> (action_context -> action) -> unit |
| 32495 | 18 |
|
| 32564 | 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 | 21 |
val can_apply : Time.time -> (Proof.context -> int -> tactic) -> |
22 |
Proof.state -> bool |
|
| 60361 | 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 | 29 |
end |
30 |
||
| 32497 | 31 |
structure Mirabelle : MIRABELLE = |
| 32495 | 32 |
struct |
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 |
val keywords = Keyword.no_command_keywords (Thy_Header.get_keywords \<^theory>); |
| 32495 | 39 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
40 |
fun read_actions str = |
| 74125 | 41 |
let |
42 |
val actions = Token.read_body keywords |
|
43 |
(Parse.enum ";" (Parse.name -- Sledgehammer_Commands.parse_params)) |
|
44 |
(Symbol_Pos.explode0 str) |
|
45 |
fun split_name_label (name, args) labels = |
|
46 |
(case String.tokens (fn c => c = #".") name of |
|
47 |
[name] => (("", name, args), labels)
|
|
48 |
| [label, name] => |
|
49 |
(if Symtab.defined labels label then |
|
50 |
error ("Action label '" ^ label ^ "' already defined.")
|
|
51 |
else |
|
52 |
(); |
|
53 |
((label, name, args), Symtab.insert_set label labels)) |
|
54 |
| _ => error "Cannot parse action") |
|
55 |
in |
|
56 |
Option.map (fn xs => fst (fold_map split_name_label xs Symtab.empty)) actions |
|
57 |
end |
|
|
32385
594890623c46
split actions from Mirabelle core (Mirabelle may thus be applied to basic theories in HOL)
boehmes
parents:
32383
diff
changeset
|
58 |
|
|
594890623c46
split actions from Mirabelle core (Mirabelle may thus be applied to basic theories in HOL)
boehmes
parents:
32383
diff
changeset
|
59 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
60 |
(* actions *) |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
61 |
|
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
62 |
type command = |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
63 |
{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
|
64 |
type action_context = |
| 74125 | 65 |
{index: int, label: string, name: string, arguments: Properties.T, timeout: Time.time,
|
66 |
output_dir: Path.T}; |
|
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
67 |
type action = {run_action: command -> string, finalize: unit -> string};
|
| 32381 | 68 |
|
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
69 |
local |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
70 |
val actions = Synchronized.var "Mirabelle.actions" |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
71 |
(Symtab.empty : (action_context -> action) Symtab.table); |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
72 |
in |
| 73694 | 73 |
|
|
73851
bb277f37c34a
added warnings when defining unamed or redefining Mirabelle action
desharna
parents:
73850
diff
changeset
|
74 |
fun register_action name make_action = |
|
bb277f37c34a
added warnings when defining unamed or redefining Mirabelle action
desharna
parents:
73850
diff
changeset
|
75 |
(if name = "" then error "Registering unnamed Mirabelle action" else (); |
|
bb277f37c34a
added warnings when defining unamed or redefining Mirabelle action
desharna
parents:
73850
diff
changeset
|
76 |
Synchronized.change actions (Symtab.map_default (name, make_action) |
|
bb277f37c34a
added warnings when defining unamed or redefining Mirabelle action
desharna
parents:
73850
diff
changeset
|
77 |
(fn f => (warning ("Redefining Mirabelle action: " ^ quote name); f))));
|
| 73694 | 78 |
|
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
79 |
fun get_action name = Symtab.lookup (Synchronized.value actions) name; |
| 73694 | 80 |
|
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
81 |
end |
| 73694 | 82 |
|
83 |
||
84 |
(* apply actions *) |
|
85 |
||
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
86 |
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
|
87 |
(case exn of |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
88 |
Timeout.TIMEOUT _ => "timeout" |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
89 |
| ERROR msg => "error: " ^ msg |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
90 |
| exn => "exception: " ^ General.exnMessage exn); |
|
34035
08d34921b7dd
also consider the fully-typed version of metis for Mirabelle measurements
boehmes
parents:
33522
diff
changeset
|
91 |
|
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
92 |
fun run_action_function f = |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
93 |
f () handle exn => |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
94 |
if Exn.is_interrupt exn then Exn.reraise exn |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
95 |
else print_exn exn; |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
96 |
|
|
74511
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
97 |
fun make_action_string ({index, label, name, ...} : action_context) =
|
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
98 |
if label = "" then string_of_int index ^ "." ^ name else label; |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
99 |
|
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
100 |
val make_action_path = Path.basic o make_action_string; |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
101 |
|
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
102 |
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
|
103 |
let |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
104 |
val s = run_action_function finalize; |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
105 |
val action_path = make_action_path context; |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
106 |
val export_name = |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
107 |
Path.binding0 (Path.basic "mirabelle" + action_path + Path.basic "finalize"); |
|
74511
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
108 |
val () = File.append ((Path.dir (#output_dir context)) + Path.basic "mirabelle_ML.log") |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
109 |
(prefix_lines (make_action_string context ^ " finalize ") (YXML.content_of s) ^ "\n") |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
110 |
in |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
111 |
if s <> "" then |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
112 |
Export.export \<^theory> export_name [XML.Text s] |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
113 |
else |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
114 |
() |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
115 |
end |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
116 |
|
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
117 |
fun apply_action ({run_action, ...} : action) context (command as {pos, pre, ...} : command) =
|
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
118 |
let |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
119 |
val thy = Proof.theory_of pre; |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
120 |
val action_path = make_action_path context; |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
121 |
val goal_name_path = Path.basic (#name command) |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
122 |
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
|
123 |
val offset_path = Path.basic (string_of_int (the (Position.offset_of pos))); |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
124 |
val export_name = |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
125 |
Path.binding0 (Path.basic "mirabelle" + action_path + Path.basic "goal" + goal_name_path + |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
126 |
line_path + offset_path); |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
127 |
val s = run_action_function (fn () => run_action command); |
|
74511
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
128 |
val prefix = make_action_string context ^ " goal." ^ StringCvt.padRight #" " 6 (#name command) ^ |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
129 |
Context.theory_long_name thy ^ " " ^ |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
130 |
string_of_int (the (Position.line_of pos)) ^ ":" ^ |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
131 |
string_of_int (the (Position.offset_of pos)) ^ " " |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
132 |
val _ = Substring.triml |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
133 |
val () = File.append ((Path.dir (#output_dir context)) + Path.basic "mirabelle_ML.log") |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
134 |
(prefix_lines prefix (YXML.content_of s) ^ "\n") |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
135 |
in |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
136 |
if s <> "" then |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
137 |
Export.export thy export_name [XML.Text s] |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
138 |
else |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
139 |
() |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
140 |
end; |
|
32515
e7c0d3c0494a
Mirabelle: actions are responsible for catching exceptions and producing suitable log messages (makes log message uniform),
boehmes
parents:
32504
diff
changeset
|
141 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
142 |
|
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
143 |
(* theory line range *) |
| 32381 | 144 |
|
145 |
local |
|
146 |
||
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
147 |
val theory_name = |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
148 |
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
|
149 |
>> Symbol_Pos.content; |
|
32498
1132c7c13f36
Mirabelle: actions are responsible for handling exceptions,
boehmes
parents:
32497
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 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
|
152 |
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
|
153 |
val range = Symbol_Pos.$$ "[" |-- line -- Scan.option end_line --| Symbol_Pos.$$ "]"; |
| 32381 | 154 |
|
155 |
in |
|
156 |
||
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
157 |
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
|
158 |
(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
|
159 |
SOME res => res |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
160 |
| 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
|
161 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
162 |
end; |
| 32381 | 163 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
164 |
fun check_theories strs = |
| 32521 | 165 |
let |
| 74069 | 166 |
fun theory_import_name s = |
167 |
#theory_name (Resources.import_name (Session.get_name ()) Path.current s); |
|
168 |
val theories = map read_theory_range strs |
|
169 |
|> 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
|
170 |
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
|
171 |
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
|
172 |
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
|
173 |
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
|
174 |
| 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
|
175 |
| 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
|
176 |
| 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
|
177 |
| 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
|
178 |
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
|
179 |
in check_pos o get_theory end; |
| 32521 | 180 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
181 |
|
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
182 |
(* presentation hook *) |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
183 |
|
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
184 |
val whitelist = ["apply", "by", "proof"]; |
| 32381 | 185 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
186 |
val _ = |
|
73822
1192c68ebe1c
suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
wenzelm
parents:
73821
diff
changeset
|
187 |
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
|
188 |
let |
|
73820
745e2cd1f5f5
refer to theory "segments" only, according to global Build.build_theories and Thy_Info.use_theories;
wenzelm
parents:
73808
diff
changeset
|
189 |
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
|
190 |
val actions = |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
191 |
(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
|
192 |
SOME actions => actions |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
193 |
| 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
|
194 |
in |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
195 |
if null actions then |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
196 |
() |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
197 |
else |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
198 |
let |
| 73849 | 199 |
val mirabelle_timeout = Options.default_seconds \<^system_option>\<open>mirabelle_timeout\<close>; |
200 |
val mirabelle_stride = Options.default_int \<^system_option>\<open>mirabelle_stride\<close>; |
|
201 |
val mirabelle_max_calls = Options.default_int \<^system_option>\<open>mirabelle_max_calls\<close>; |
|
202 |
val mirabelle_theories = Options.default_string \<^system_option>\<open>mirabelle_theories\<close>; |
|
|
74511
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
203 |
val mirabelle_output_dir = Options.default_string \<^system_option>\<open>mirabelle_output_dir\<close> |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
204 |
|> Path.explode |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
205 |
|> Isabelle_System.make_directory; |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
206 |
val check_theory = check_theories (space_explode "," mirabelle_theories); |
| 32381 | 207 |
|
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
208 |
fun make_commands (thy_index, (thy, segments)) = |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
209 |
let |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
210 |
val thy_long_name = Context.theory_long_name thy; |
| 74069 | 211 |
val check_thy = check_theory thy_long_name; |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
212 |
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
|
213 |
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
|
214 |
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
|
215 |
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
|
216 |
in |
| 73824 | 217 |
if Context.proper_subthy (\<^theory>, thy) andalso |
218 |
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
|
219 |
member (op =) whitelist name andalso check_thy pos |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
220 |
then SOME {theory_index = thy_index, name = name, pos = pos,
|
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
221 |
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
|
222 |
else NONE |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
223 |
end; |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
224 |
in |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
225 |
if Resources.theory_qualifier thy_long_name = qualifier then |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
226 |
map_filter make_command segments |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
227 |
else |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
228 |
[] |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
229 |
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
|
230 |
|
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
231 |
(* initialize actions *) |
| 74125 | 232 |
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
|
233 |
let |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
234 |
val make_action = the (get_action name); |
|
74511
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
235 |
val action_subdir = if label = "" then string_of_int n ^ "." ^ name else label; |
|
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
desharna
parents:
74125
diff
changeset
|
236 |
val output_dir = Path.append mirabelle_output_dir (Path.basic action_subdir); |
|
74078
a2cbe81e1e32
changed Mirabelle_Sledgehammer keep option from path to boolean
desharna
parents:
74077
diff
changeset
|
237 |
val context = |
| 74125 | 238 |
{index = n, label = label, name = name, arguments = args,
|
239 |
timeout = mirabelle_timeout, output_dir = output_dir}; |
|
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
240 |
in |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
241 |
(make_action context, context) |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
242 |
end); |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
243 |
in |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
244 |
(* run actions on all relevant goals *) |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
245 |
loaded_theories |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
246 |
|> map_index I |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
247 |
|> maps make_commands |
|
74077
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
248 |
|> (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
|
249 |
|> (fn (indexed_commands, commands_length) => |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
250 |
let |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
251 |
val stride = |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
252 |
if mirabelle_stride <= 0 then |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
253 |
Integer.max 1 (commands_length div mirabelle_max_calls) |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
254 |
else |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
255 |
mirabelle_stride |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
256 |
in |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
257 |
maps (fn (n, command) => |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
258 |
let val (m, k) = Integer.div_mod (n + 1) stride in |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
259 |
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
|
260 |
map (fn context => (context, command)) contexts |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
261 |
else |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
262 |
[] |
|
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
desharna
parents:
74069
diff
changeset
|
263 |
end) indexed_commands |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
264 |
end) |
| 73849 | 265 |
|> Par_List.map (fn ((action, context), command) => apply_action action context command); |
|
73847
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
266 |
|
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
267 |
(* finalize actions *) |
|
58f6b41efe88
refactored Mirabelle to produce output in real time
desharna
parents:
73822
diff
changeset
|
268 |
List.app (uncurry finalize_action) contexts |
| 73850 | 269 |
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
|
270 |
end); |
| 32381 | 271 |
|
272 |
||
273 |
(* Mirabelle utility functions *) |
|
274 |
||
|
32472
7b92a8b8daaf
Mirabelle: actions are responsible for their log messages, output is better readable
boehmes
parents:
32469
diff
changeset
|
275 |
fun can_apply time tac st = |
| 32469 | 276 |
let |
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
277 |
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
|
278 |
val full_tac = HEADGOAL (Method.insert_tac ctxt facts THEN' tac ctxt); |
| 32381 | 279 |
in |
| 62519 | 280 |
(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
|
281 |
SOME (SOME _) => true |
|
8893562a954b
prevent exception when calling "Mirabelle.can_apply" on empty proof sequence;
blanchet
parents:
39377
diff
changeset
|
282 |
| _ => false) |
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
283 |
end; |
| 32381 | 284 |
|
285 |
local |
|
286 |
||
287 |
fun fold_body_thms f = |
|
288 |
let |
|
| 64573 | 289 |
fun app n (PBody {thms, ...}) = thms |> fold (fn (i, thm_node) =>
|
| 32381 | 290 |
fn (x, seen) => |
291 |
if Inttab.defined seen i then (x, seen) |
|
292 |
else |
|
293 |
let |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
294 |
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
|
295 |
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
|
296 |
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
|
297 |
val (x', seen') = |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
298 |
app (n + (if name = "" then 0 else 1)) body |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
299 |
(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
|
300 |
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
|
301 |
in fn bodies => fn x => #1 (fold (app 0) bodies (x, Inttab.empty)) end; |
| 32381 | 302 |
|
303 |
in |
|
304 |
||
| 60361 | 305 |
fun theorems_in_proof_term thy thm = |
| 32381 | 306 |
let |
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
307 |
val all_thms = Global_Theory.all_thms_of thy true; |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
308 |
fun collect (s, _, _) = if s <> "" then insert (op =) s else I; |
|
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
309 |
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
|
310 |
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
|
311 |
in resolve_thms (fold_body_thms collect [Thm.proof_body_of thm] []) end; |
| 32381 | 312 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
313 |
end; |
| 32381 | 314 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
315 |
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
|
316 |
(case try Toplevel.proof_of st of |
| 32381 | 317 |
NONE => [] |
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
318 |
| SOME prf => theorems_in_proof_term (Proof.theory_of prf) (#goal (Proof.goal prf))); |
| 32381 | 319 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
320 |
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
|
321 |
the_default default (AList.lookup (op =) arguments key); |
| 32381 | 322 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
323 |
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
|
324 |
(case Option.map Int.fromString (AList.lookup (op =) arguments key) of |
| 32381 | 325 |
SOME (SOME i) => i |
326 |
| 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
|
327 |
| NONE => default); |
| 32381 | 328 |
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
329 |
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
|
330 |
(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
|
331 |
SOME (SOME i) => i |
|
f84a93f1de2f
tuned Mirabelle to parse option check_trivial only once
desharna
parents:
69597
diff
changeset
|
332 |
| 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
|
333 |
| NONE => default); |
|
73292
f84a93f1de2f
tuned Mirabelle to parse option check_trivial only once
desharna
parents:
69597
diff
changeset
|
334 |
|
|
42014
75417ef605ba
simplified various cpu_time clones (!): eliminated odd Exn.capture/Exn.release (no need to "stop" timing);
wenzelm
parents:
42012
diff
changeset
|
335 |
fun cpu_time f x = |
|
75417ef605ba
simplified various cpu_time clones (!): eliminated odd Exn.capture/Exn.release (no need to "stop" timing);
wenzelm
parents:
42012
diff
changeset
|
336 |
let val ({cpu, ...}, y) = Timing.timing f x
|
|
73691
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
wenzelm
parents:
73685
diff
changeset
|
337 |
in (y, Time.toMilliseconds cpu) end; |
|
32498
1132c7c13f36
Mirabelle: actions are responsible for handling exceptions,
boehmes
parents:
32497
diff
changeset
|
338 |
|
| 32381 | 339 |
end |