| author | blanchet | 
| Fri, 20 Jul 2012 22:19:46 +0200 | |
| changeset 48406 | b002cc16aa99 | 
| parent 48404 | 0a261b4aa093 | 
| child 48438 | 3e45c98fe127 | 
| permissions | -rw-r--r-- | 
| 48285 | 1  | 
(* Title: HOL/TPTP/mash_eval.ML  | 
| 48234 | 2  | 
Author: Jasmin Blanchette, TU Muenchen  | 
3  | 
Copyright 2012  | 
|
4  | 
||
| 48285 | 5  | 
Evaluate proof suggestions from MaSh (Machine-learning for Sledgehammer).  | 
| 48234 | 6  | 
*)  | 
7  | 
||
| 48285 | 8  | 
signature MASH_EVAL =  | 
| 48234 | 9  | 
sig  | 
| 
48251
 
6cdcfbddc077
moved most of MaSh exporter code to Sledgehammer
 
blanchet 
parents: 
48250 
diff
changeset
 | 
10  | 
type params = Sledgehammer_Provers.params  | 
| 
 
6cdcfbddc077
moved most of MaSh exporter code to Sledgehammer
 
blanchet 
parents: 
48250 
diff
changeset
 | 
11  | 
|
| 48285 | 12  | 
val evaluate_mash_suggestions :  | 
| 
48251
 
6cdcfbddc077
moved most of MaSh exporter code to Sledgehammer
 
blanchet 
parents: 
48250 
diff
changeset
 | 
13  | 
Proof.context -> params -> theory -> string -> unit  | 
| 48234 | 14  | 
end;  | 
15  | 
||
| 48285 | 16  | 
structure MaSh_Eval : MASH_EVAL =  | 
| 48234 | 17  | 
struct  | 
| 48235 | 18  | 
|
| 
48315
 
82d6e46c673f
fixed order of accessibles + other tweaks to MaSh
 
blanchet 
parents: 
48313 
diff
changeset
 | 
19  | 
open Sledgehammer_Fact  | 
| 48381 | 20  | 
open Sledgehammer_MaSh  | 
| 48240 | 21  | 
|
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
22  | 
val MePoN = "MePo"  | 
| 
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
23  | 
val MaShN = "MaSh"  | 
| 
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
24  | 
val MeshN = "Mesh"  | 
| 
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
25  | 
val IsarN = "Isar"  | 
| 48241 | 26  | 
|
| 48293 | 27  | 
val max_facts_slack = 2  | 
| 48235 | 28  | 
|
| 48324 | 29  | 
val all_names =  | 
| 48333 | 30  | 
filter_out is_likely_tautology_or_too_meta  | 
| 48378 | 31  | 
#> map (rpair () o nickname_of) #> Symtab.make  | 
| 
48316
 
252f45c04042
drastic overhaul of MaSh data structures + fixed a few performance issues
 
blanchet 
parents: 
48315 
diff
changeset
 | 
32  | 
|
| 48285 | 33  | 
fun evaluate_mash_suggestions ctxt params thy file_name =  | 
| 48235 | 34  | 
let  | 
| 48293 | 35  | 
    val {provers, max_facts, slice, type_enc, lam_trans, timeout, ...} =
 | 
| 
48239
 
0016290f904c
generate Meng--Paulson facts for evaluation purposes
 
blanchet 
parents: 
48236 
diff
changeset
 | 
36  | 
Sledgehammer_Isar.default_params ctxt []  | 
| 48318 | 37  | 
val prover = hd provers  | 
| 
48313
 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 
blanchet 
parents: 
48312 
diff
changeset
 | 
38  | 
val slack_max_facts = max_facts_slack * the max_facts  | 
| 48235 | 39  | 
val path = file_name |> Path.explode  | 
40  | 
val lines = path |> File.read_lines  | 
|
| 48299 | 41  | 
val css_table = Sledgehammer_Fact.clasimpset_rule_table_of ctxt  | 
| 
48394
 
82fc8c956cdc
fixed various issues with MaSh's file handling + tune output + generate local facts again + handle nameless facts gracefully
 
blanchet 
parents: 
48392 
diff
changeset
 | 
42  | 
val facts = all_facts_of (Proof_Context.init_global thy) css_table  | 
| 48324 | 43  | 
val all_names = all_names (facts |> map snd)  | 
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
44  | 
val mepo_ok = Unsynchronized.ref 0  | 
| 48241 | 45  | 
val mash_ok = Unsynchronized.ref 0  | 
| 48298 | 46  | 
val mesh_ok = Unsynchronized.ref 0  | 
| 48300 | 47  | 
val isar_ok = Unsynchronized.ref 0  | 
| 48289 | 48  | 
fun with_index facts s = (find_index (curry (op =) s) facts + 1, s)  | 
| 48235 | 49  | 
fun index_string (j, s) = s ^ "@" ^ string_of_int j  | 
| 48240 | 50  | 
    fun str_of_res label facts {outcome, run_time, used_facts, ...} =
 | 
| 48289 | 51  | 
let val facts = facts |> map (fn ((name, _), _) => name ()) in  | 
52  | 
" " ^ label ^ ": " ^  | 
|
53  | 
(if is_none outcome then  | 
|
54  | 
           "Success (" ^ ATP_Util.string_from_time run_time ^ "): " ^
 | 
|
55  | 
(used_facts |> map (with_index facts o fst)  | 
|
56  | 
|> sort (int_ord o pairself fst)  | 
|
57  | 
|> map index_string  | 
|
58  | 
|> space_implode " ") ^  | 
|
| 48293 | 59  | 
(if length facts < the max_facts then  | 
| 48289 | 60  | 
" (of " ^ string_of_int (length facts) ^ ")"  | 
61  | 
else  | 
|
62  | 
"")  | 
|
63  | 
else  | 
|
64  | 
"Failure: " ^  | 
|
| 48293 | 65  | 
(facts |> take (the max_facts) |> tag_list 1  | 
| 48289 | 66  | 
|> map index_string  | 
67  | 
|> space_implode " "))  | 
|
68  | 
end  | 
|
| 48311 | 69  | 
fun solve_goal (j, line) =  | 
| 48235 | 70  | 
let  | 
| 48311 | 71  | 
val (name, suggs) = extract_query line  | 
| 48235 | 72  | 
val th =  | 
| 48378 | 73  | 
case find_first (fn (_, th) => nickname_of th = name) facts of  | 
| 48235 | 74  | 
SOME (_, th) => th  | 
75  | 
          | NONE => error ("No fact called \"" ^ name ^ "\"")
 | 
|
| 
48250
 
1065c307fafe
further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
 
blanchet 
parents: 
48245 
diff
changeset
 | 
76  | 
val goal = goal_of_thm thy th  | 
| 48245 | 77  | 
val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal ctxt goal 1  | 
| 48404 | 78  | 
val isar_deps = isar_dependencies_of all_names th |> these  | 
| 48235 | 79  | 
val facts = facts |> filter (fn (_, th') => thm_ord (th', th) = LESS)  | 
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
80  | 
val mepo_facts =  | 
| 48406 | 81  | 
Sledgehammer_MePo.mepo_suggested_facts ctxt params prover  | 
| 48381 | 82  | 
slack_max_facts NONE hyp_ts concl_t facts  | 
| 48406 | 83  | 
|> Sledgehammer_MePo.weight_mepo_facts  | 
84  | 
val mash_facts = suggested_facts suggs facts  | 
|
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
85  | 
val mess = [(mepo_facts, []), (mash_facts, [])]  | 
| 
48313
 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 
blanchet 
parents: 
48312 
diff
changeset
 | 
86  | 
val mesh_facts = mesh_facts slack_max_facts mess  | 
| 48406 | 87  | 
val isar_facts = suggested_facts (map (rpair 1.0) isar_deps) facts  | 
88  | 
fun prove ok heading get facts =  | 
|
| 
48313
 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 
blanchet 
parents: 
48312 
diff
changeset
 | 
89  | 
let  | 
| 
 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 
blanchet 
parents: 
48312 
diff
changeset
 | 
90  | 
val facts =  | 
| 48406 | 91  | 
facts |> map get  | 
92  | 
|> Sledgehammer_Fact.maybe_instantiate_inducts ctxt hyp_ts  | 
|
93  | 
concl_t  | 
|
94  | 
|> take (the max_facts)  | 
|
| 48321 | 95  | 
            val res as {outcome, ...} =
 | 
96  | 
run_prover_for_mash ctxt params prover facts goal  | 
|
| 
48313
 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 
blanchet 
parents: 
48312 
diff
changeset
 | 
97  | 
val _ = if is_none outcome then ok := !ok + 1 else ()  | 
| 
 
0faafdffa662
mesh facts by taking into consideration whether a fact is known to MeSh
 
blanchet 
parents: 
48312 
diff
changeset
 | 
98  | 
in str_of_res heading facts res end  | 
| 48406 | 99  | 
val mepo_s = prove mepo_ok MePoN fst mepo_facts  | 
100  | 
val mash_s = prove mash_ok MaShN fst mash_facts  | 
|
101  | 
val mesh_s = prove mesh_ok MeshN I mesh_facts  | 
|
102  | 
val isar_s = prove isar_ok IsarN fst isar_facts  | 
|
| 48235 | 103  | 
in  | 
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
104  | 
["Goal " ^ string_of_int j ^ ": " ^ name, mepo_s, mash_s, mesh_s,  | 
| 48300 | 105  | 
isar_s]  | 
| 48241 | 106  | 
|> cat_lines |> tracing  | 
| 48235 | 107  | 
end  | 
| 48241 | 108  | 
fun total_of heading ok n =  | 
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
109  | 
      "  " ^ heading ^ ": " ^ string_of_int (!ok) ^ " (" ^
 | 
| 48241 | 110  | 
Real.fmt (StringCvt.FIX (SOME 1))  | 
111  | 
(100.0 * Real.fromInt (!ok) / Real.fromInt n) ^ "%)"  | 
|
| 
48250
 
1065c307fafe
further ML structure split to permit finer-grained loading/reordering (problem to solve: MaSh needs most of Sledgehammer)
 
blanchet 
parents: 
48245 
diff
changeset
 | 
112  | 
val inst_inducts = Config.get ctxt Sledgehammer_Fact.instantiate_inducts  | 
| 48245 | 113  | 
val options =  | 
| 48318 | 114  | 
[prover, string_of_int (the max_facts) ^ " facts",  | 
| 48241 | 115  | 
"slice" |> not slice ? prefix "dont_", the_default "smart" type_enc,  | 
116  | 
the_default "smart" lam_trans, ATP_Util.string_from_time timeout,  | 
|
117  | 
"instantiate_inducts" |> not inst_inducts ? prefix "dont_"]  | 
|
118  | 
val n = length lines  | 
|
119  | 
in  | 
|
120  | 
tracing " * * *";  | 
|
| 48245 | 121  | 
    tracing ("Options: " ^ commas options);
 | 
| 48311 | 122  | 
List.app solve_goal (tag_list 1 lines);  | 
| 48241 | 123  | 
["Successes (of " ^ string_of_int n ^ " goals)",  | 
| 
48379
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
124  | 
total_of MePoN mepo_ok n,  | 
| 
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
125  | 
total_of MaShN mash_ok n,  | 
| 
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
126  | 
total_of MeshN mesh_ok n,  | 
| 
 
2b5ad61e2ccc
renamed "iter" fact filter to "MePo" (Meng--Paulson)
 
blanchet 
parents: 
48378 
diff
changeset
 | 
127  | 
total_of IsarN isar_ok n]  | 
| 48241 | 128  | 
|> cat_lines |> tracing  | 
129  | 
end  | 
|
| 48235 | 130  | 
|
| 48234 | 131  | 
end;  |