| author | desharna | 
| Fri, 17 Dec 2021 09:51:37 +0100 | |
| changeset 74948 | 15ce207f69c8 | 
| parent 74745 | f54c81fe84f2 | 
| child 74986 | fc664e4fbf6d | 
| 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}
 | 
| 
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 | 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  | 
fun read_actions str =  | 
| 74125 | 39  | 
let  | 
| 74558 | 40  | 
val thy = \<^theory>;  | 
41  | 
val ctxt = Proof_Context.init_global thy  | 
|
| 74567 | 42  | 
val keywords = Keyword.no_major_keywords (Thy_Header.get_keywords thy)  | 
| 74558 | 43  | 
|
| 74564 | 44  | 
fun read_actions () = Parse.read_embedded ctxt keywords  | 
| 74125 | 45  | 
(Parse.enum ";" (Parse.name -- Sledgehammer_Commands.parse_params))  | 
| 74558 | 46  | 
(Input.string str)  | 
| 74125 | 47  | 
fun split_name_label (name, args) labels =  | 
48  | 
(case String.tokens (fn c => c = #".") name of  | 
|
49  | 
          [name] => (("", name, args), labels)
 | 
|
50  | 
| [label, name] =>  | 
|
51  | 
(if Symtab.defined labels label then  | 
|
52  | 
             error ("Action label '" ^ label ^ "' already defined.")
 | 
|
53  | 
else  | 
|
54  | 
();  | 
|
55  | 
((label, name, args), Symtab.insert_set label labels))  | 
|
56  | 
| _ => error "Cannot parse action")  | 
|
57  | 
in  | 
|
| 74558 | 58  | 
try read_actions ()  | 
59  | 
|> Option.map (fn xs => fst (fold_map split_name_label xs Symtab.empty))  | 
|
| 74125 | 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 | 68  | 
  {index: int, label: string, name: string, arguments: Properties.T, timeout: Time.time,
 | 
69  | 
output_dir: Path.T};  | 
|
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
70  | 
type action = {run_action: command -> string, finalize: unit -> string};
 | 
| 32381 | 71  | 
|
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
72  | 
local  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
73  | 
val actions = Synchronized.var "Mirabelle.actions"  | 
| 
74948
 
15ce207f69c8
added support for initialization messages to Mirabelle
 
desharna 
parents: 
74745 
diff
changeset
 | 
74  | 
(Symtab.empty : (action_context -> string * action) Symtab.table);  | 
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
75  | 
in  | 
| 73694 | 76  | 
|
| 
73851
 
bb277f37c34a
added warnings when defining unamed or redefining Mirabelle action
 
desharna 
parents: 
73850 
diff
changeset
 | 
77  | 
fun register_action name make_action =  | 
| 
 
bb277f37c34a
added warnings when defining unamed or redefining Mirabelle action
 
desharna 
parents: 
73850 
diff
changeset
 | 
78  | 
(if name = "" then error "Registering unnamed Mirabelle action" else ();  | 
| 
 
bb277f37c34a
added warnings when defining unamed or redefining Mirabelle action
 
desharna 
parents: 
73850 
diff
changeset
 | 
79  | 
Synchronized.change actions (Symtab.map_default (name, make_action)  | 
| 
 
bb277f37c34a
added warnings when defining unamed or redefining Mirabelle action
 
desharna 
parents: 
73850 
diff
changeset
 | 
80  | 
     (fn f => (warning ("Redefining Mirabelle action: " ^ quote name); f))));
 | 
| 73694 | 81  | 
|
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
82  | 
fun get_action name = Symtab.lookup (Synchronized.value actions) name;  | 
| 73694 | 83  | 
|
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
84  | 
end  | 
| 73694 | 85  | 
|
86  | 
||
87  | 
(* apply actions *)  | 
|
88  | 
||
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
89  | 
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
 | 
90  | 
(case exn of  | 
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
91  | 
Timeout.TIMEOUT _ => "timeout"  | 
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
92  | 
| ERROR msg => "error: " ^ msg  | 
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
93  | 
| exn => "exception: " ^ General.exnMessage exn);  | 
| 
34035
 
08d34921b7dd
also consider the fully-typed version of metis for Mirabelle measurements
 
boehmes 
parents: 
33522 
diff
changeset
 | 
94  | 
|
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
95  | 
fun run_action_function f =  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
96  | 
f () handle exn =>  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
97  | 
if Exn.is_interrupt exn then Exn.reraise exn  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
98  | 
else print_exn exn;  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
99  | 
|
| 74745 | 100  | 
fun make_action_path ({index, label, name, ...} : action_context) =
 | 
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  | 
|
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
131  | 
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
 | 
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)));  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
138  | 
val export_name =  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
139  | 
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
 | 
140  | 
line_path + offset_path);  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
141  | 
val s = run_action_function (fn () => run_action command);  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
142  | 
in  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
143  | 
if s <> "" then  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
144  | 
Export.export thy export_name [XML.Text s]  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
145  | 
else  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
146  | 
()  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
147  | 
end;  | 
| 
32515
 
e7c0d3c0494a
Mirabelle: actions are responsible for catching exceptions and producing suitable log messages (makes log message uniform),
 
boehmes 
parents: 
32504 
diff
changeset
 | 
148  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
149  | 
|
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
150  | 
(* theory line range *)  | 
| 32381 | 151  | 
|
152  | 
local  | 
|
153  | 
||
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
154  | 
val theory_name =  | 
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
155  | 
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
 | 
156  | 
>> Symbol_Pos.content;  | 
| 
32498
 
1132c7c13f36
Mirabelle: actions are responsible for handling exceptions,
 
boehmes 
parents: 
32497 
diff
changeset
 | 
157  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
158  | 
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
 | 
159  | 
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
 | 
160  | 
val range = Symbol_Pos.$$ "[" |-- line -- Scan.option end_line --| Symbol_Pos.$$ "]";  | 
| 32381 | 161  | 
|
162  | 
in  | 
|
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 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
 | 
165  | 
(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
 | 
166  | 
SOME res => res  | 
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
167  | 
  | 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
 | 
168  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
169  | 
end;  | 
| 32381 | 170  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
171  | 
fun check_theories strs =  | 
| 32521 | 172  | 
let  | 
| 74069 | 173  | 
fun theory_import_name s =  | 
174  | 
#theory_name (Resources.import_name (Session.get_name ()) Path.current s);  | 
|
175  | 
val theories = map read_theory_range strs  | 
|
176  | 
|> 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
 | 
177  | 
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
 | 
178  | 
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
 | 
179  | 
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
 | 
180  | 
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
 | 
181  | 
| 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
 | 
182  | 
| 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
 | 
183  | 
| 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
 | 
184  | 
| 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
 | 
185  | 
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
 | 
186  | 
in check_pos o get_theory end;  | 
| 32521 | 187  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
188  | 
|
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
189  | 
(* presentation hook *)  | 
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
190  | 
|
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
191  | 
val whitelist = ["apply", "by", "proof"];  | 
| 32381 | 192  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
193  | 
val _ =  | 
| 
73822
 
1192c68ebe1c
suppress theories from other sessions, unless explicitly specified via mirabelle_theories;
 
wenzelm 
parents: 
73821 
diff
changeset
 | 
194  | 
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
 | 
195  | 
let  | 
| 
73820
 
745e2cd1f5f5
refer to theory "segments" only, according to global Build.build_theories and Thy_Info.use_theories;
 
wenzelm 
parents: 
73808 
diff
changeset
 | 
196  | 
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
 | 
197  | 
val actions =  | 
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
198  | 
(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
 | 
199  | 
SOME actions => actions  | 
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
200  | 
        | 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
 | 
201  | 
in  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
202  | 
if null actions then  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
203  | 
()  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
204  | 
else  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
205  | 
let  | 
| 73849 | 206  | 
val mirabelle_timeout = Options.default_seconds \<^system_option>\<open>mirabelle_timeout\<close>;  | 
207  | 
val mirabelle_stride = Options.default_int \<^system_option>\<open>mirabelle_stride\<close>;  | 
|
208  | 
val mirabelle_max_calls = Options.default_int \<^system_option>\<open>mirabelle_max_calls\<close>;  | 
|
209  | 
val mirabelle_theories = Options.default_string \<^system_option>\<open>mirabelle_theories\<close>;  | 
|
| 74745 | 210  | 
val mirabelle_output_dir = Options.default_string \<^system_option>\<open>mirabelle_output_dir\<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 | 212  | 
|
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
213  | 
fun make_commands (thy_index, (thy, segments)) =  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
214  | 
let  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
215  | 
val thy_long_name = Context.theory_long_name thy;  | 
| 74069 | 216  | 
val check_thy = check_theory thy_long_name;  | 
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
217  | 
              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
 | 
218  | 
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
 | 
219  | 
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
 | 
220  | 
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
 | 
221  | 
in  | 
| 73824 | 222  | 
if Context.proper_subthy (\<^theory>, thy) andalso  | 
223  | 
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
 | 
224  | 
member (op =) whitelist name andalso check_thy pos  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
225  | 
                  then SOME {theory_index = thy_index, name = name, pos = pos,
 | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
226  | 
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
 | 
227  | 
else NONE  | 
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
228  | 
end;  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
229  | 
in  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
230  | 
if Resources.theory_qualifier thy_long_name = qualifier then  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
231  | 
map_filter make_command segments  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
232  | 
else  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
233  | 
[]  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
234  | 
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
 | 
235  | 
|
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
236  | 
(* initialize actions *)  | 
| 74125 | 237  | 
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
 | 
238  | 
let  | 
| 74514 | 239  | 
val make_action =  | 
240  | 
(case get_action name of  | 
|
241  | 
SOME f => f  | 
|
242  | 
| NONE => error "Unknown action");  | 
|
| 
74511
 
6d111935299c
produced Mirabelle output directly in ML until Scala output gets fixed
 
desharna 
parents: 
74125 
diff
changeset
 | 
243  | 
val action_subdir = if label = "" then string_of_int n ^ "." ^ name else label;  | 
| 74745 | 244  | 
val output_dir =  | 
245  | 
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
 | 
246  | 
val context =  | 
| 74125 | 247  | 
                {index = n, label = label, name = name, arguments = args,
 | 
248  | 
timeout = mirabelle_timeout, output_dir = output_dir};  | 
|
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
249  | 
in  | 
| 
74948
 
15ce207f69c8
added support for initialization messages to Mirabelle
 
desharna 
parents: 
74745 
diff
changeset
 | 
250  | 
(initialize_action make_action context, context)  | 
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
251  | 
end);  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
252  | 
in  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
253  | 
(* run actions on all relevant goals *)  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
254  | 
loaded_theories  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
255  | 
|> map_index I  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
256  | 
|> maps make_commands  | 
| 
74077
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
257  | 
|> (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
 | 
258  | 
|> (fn (indexed_commands, commands_length) =>  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
259  | 
let  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
260  | 
val stride =  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
261  | 
if mirabelle_stride <= 0 then  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
262  | 
Integer.max 1 (commands_length div mirabelle_max_calls)  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
263  | 
else  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
264  | 
mirabelle_stride  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
265  | 
in  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
266  | 
maps (fn (n, command) =>  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
267  | 
let val (m, k) = Integer.div_mod (n + 1) stride in  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
268  | 
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
 | 
269  | 
map (fn context => (context, command)) contexts  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
270  | 
else  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
271  | 
[]  | 
| 
 
b93d8c2ebab0
added automatic uniform stride option to Mirabelle
 
desharna 
parents: 
74069 
diff
changeset
 | 
272  | 
end) indexed_commands  | 
| 
73847
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
273  | 
end)  | 
| 73849 | 274  | 
|> 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
 | 
275  | 
|
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
276  | 
(* finalize actions *)  | 
| 
 
58f6b41efe88
refactored Mirabelle to produce output in real time
 
desharna 
parents: 
73822 
diff
changeset
 | 
277  | 
List.app (uncurry finalize_action) contexts  | 
| 73850 | 278  | 
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
 | 
279  | 
end);  | 
| 32381 | 280  | 
|
281  | 
||
282  | 
(* Mirabelle utility functions *)  | 
|
283  | 
||
| 
32472
 
7b92a8b8daaf
Mirabelle: actions are responsible for their log messages, output is better readable
 
boehmes 
parents: 
32469 
diff
changeset
 | 
284  | 
fun can_apply time tac st =  | 
| 32469 | 285  | 
let  | 
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
286  | 
    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
 | 
287  | 
val full_tac = HEADGOAL (Method.insert_tac ctxt facts THEN' tac ctxt);  | 
| 32381 | 288  | 
in  | 
| 62519 | 289  | 
(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
 | 
290  | 
SOME (SOME _) => true  | 
| 
 
8893562a954b
prevent exception when calling "Mirabelle.can_apply" on empty proof sequence;
 
blanchet 
parents: 
39377 
diff
changeset
 | 
291  | 
| _ => false)  | 
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
292  | 
end;  | 
| 32381 | 293  | 
|
294  | 
local  | 
|
295  | 
||
296  | 
fun fold_body_thms f =  | 
|
297  | 
let  | 
|
| 64573 | 298  | 
    fun app n (PBody {thms, ...}) = thms |> fold (fn (i, thm_node) =>
 | 
| 32381 | 299  | 
fn (x, seen) =>  | 
300  | 
if Inttab.defined seen i then (x, seen)  | 
|
301  | 
else  | 
|
302  | 
let  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
303  | 
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
 | 
304  | 
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
 | 
305  | 
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
 | 
306  | 
val (x', seen') =  | 
| 
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
307  | 
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
 | 
308  | 
(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
 | 
309  | 
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
 | 
310  | 
in fn bodies => fn x => #1 (fold (app 0) bodies (x, Inttab.empty)) end;  | 
| 32381 | 311  | 
|
312  | 
in  | 
|
313  | 
||
| 60361 | 314  | 
fun theorems_in_proof_term thy thm =  | 
| 32381 | 315  | 
let  | 
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
316  | 
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
 | 
317  | 
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
 | 
318  | 
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
 | 
319  | 
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
 | 
320  | 
in resolve_thms (fold_body_thms collect [Thm.proof_body_of thm] []) end;  | 
| 32381 | 321  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
322  | 
end;  | 
| 32381 | 323  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
324  | 
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
 | 
325  | 
(case try Toplevel.proof_of st of  | 
| 32381 | 326  | 
NONE => []  | 
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
327  | 
| SOME prf => theorems_in_proof_term (Proof.theory_of prf) (#goal (Proof.goal prf)));  | 
| 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_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  | 
the_default default (AList.lookup (op =) arguments key);  | 
| 32381 | 331  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
332  | 
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
 | 
333  | 
(case Option.map Int.fromString (AList.lookup (op =) arguments key) of  | 
| 32381 | 334  | 
SOME (SOME i) => i  | 
335  | 
  | 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
 | 
336  | 
| NONE => default);  | 
| 32381 | 337  | 
|
| 
73691
 
2f9877db82a1
reimplemented Mirabelle as Isabelle/ML presentation hook + Isabelle/Scala tool, but sledgehammer is still inactive;
 
wenzelm 
parents: 
73685 
diff
changeset
 | 
338  | 
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
 | 
339  | 
(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
 | 
340  | 
SOME (SOME i) => i  | 
| 
 
f84a93f1de2f
tuned Mirabelle to parse option check_trivial only once
 
desharna 
parents: 
69597 
diff
changeset
 | 
341  | 
  | 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
 | 
342  | 
| NONE => default);  | 
| 
73292
 
f84a93f1de2f
tuned Mirabelle to parse option check_trivial only once
 
desharna 
parents: 
69597 
diff
changeset
 | 
343  | 
|
| 
42014
 
75417ef605ba
simplified various cpu_time clones (!): eliminated odd Exn.capture/Exn.release (no need to "stop" timing);
 
wenzelm 
parents: 
42012 
diff
changeset
 | 
344  | 
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
 | 
345  | 
  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
 | 
346  | 
in (y, Time.toMilliseconds cpu) end;  | 
| 
32498
 
1132c7c13f36
Mirabelle: actions are responsible for handling exceptions,
 
boehmes 
parents: 
32497 
diff
changeset
 | 
347  | 
|
| 32381 | 348  | 
end  |