(* Title: HOL/TPTP/mash_export.ML Author: Jasmin Blanchette, TU Muenchen Copyright 2012
Export Isabelle theory information for MaSh (Machine-learning for Sledgehammer).
*)
signature MASH_EXPORT = sig type params = Sledgehammer_Prover.params
val in_range : int * int option -> int -> bool val extract_suggestions : string -> string * (string * real) list
val generate_accessibility : Proof.context -> theory list -> string -> unit val generate_features : Proof.context -> theory list -> string -> unit val generate_isar_dependencies : Proof.context -> int * int option -> theory list -> string ->
unit val generate_prover_dependencies : Proof.context -> params -> int * int option -> theory list -> string -> unit val generate_isar_commands : Proof.context -> string -> (int * int option) * int -> theory list ->
int -> string -> unit val generate_prover_commands : Proof.context -> params -> (int * int option) * int ->
theory list -> int -> string -> unit val generate_mepo_suggestions : Proof.context -> params -> (int * int option) * int ->
theory list -> int -> string -> unit val generate_mash_suggestions : string -> Proof.context -> params -> (int * int option) * int ->
theory list -> int -> string -> unit val generate_mesh_suggestions : int -> string -> string -> string -> unit end;
structure MaSh_Export : MASH_EXPORT = struct
open Sledgehammer_Fact open Sledgehammer_Prover_ATP open Sledgehammer_MePo open Sledgehammer_MaSh
fun in_range (from, to) j =
j >= from andalso (to = NONE orelse j <= the to)
val encode_features = map encode_feature #> implode_space
(* The suggested weights do not make much sense. *) fun extract_suggestion sugg =
(case space_explode "=" sugg of
[name, weight] => SOME (decode_str name, Real.fromString weight |> the_default 1.0)
| [name] => SOME (decode_str name, 1.0)
| _ => NONE)
fun extract_suggestions line =
(case space_explode ":" line of
[goal, suggs] => (decode_str goal, map_filter extract_suggestion (space_explode " " suggs))
| _ => ("", []))
fun has_thm_thy th thy =
Context.theory_base_name thy = Thm.theory_base_name th
fun has_thys thys th = exists (has_thm_thy th) thys
fun all_facts ctxt = letval css = Sledgehammer_Fact.clasimpset_rule_table_of ctxt in
Sledgehammer_Fact.all_facts ctxt true Keyword.empty_keywords [] [] css
|> sort (crude_thm_ord ctxt o apply2 snd) end
fun generate_accessibility ctxt thys file_name = let val path = Path.explode file_name
fun do_fact (parents, fact) = letval s = encode_str fact ^ ": " ^ encode_strs parents ^ "\n"in
File.append path s end
val facts =
all_facts ctxt
|> filter_out (has_thys thys o snd)
|> attach_parents_to_facts []
|> map (apsnd (nickname_of_thm o snd)) in
File.write path ""; List.app do_fact facts end
fun generate_features ctxt thys file_name = let val path = Path.explode file_name val _ = File.write path "" val facts = all_facts ctxt |> filter_out (has_thys thys o snd)
fun do_fact ((_, stature), th) = let val name = nickname_of_thm th val feats = features_of ctxt (Thm.theory_base_name th) stature [Thm.prop_of th] val s = encode_str name ^ ": " ^ encode_strs (sort string_ord feats) ^ "\n" in
File.append path s end in List.app do_fact facts end
val prover_marker = "$a" val isar_marker = "$i" val omitted_marker = "$o" val unprovable_marker = "$u"(* axiom or definition or characteristic theorem *) val prover_failed_marker = "$x"
fun smart_dependencies_of ctxt params_opt facts name_tabs th isar_deps_opt = let val (marker, deps) =
(case params_opt of
SOME (params as {provers = prover :: _, ...}) =>
prover_dependencies_of ctxt params prover 0 facts name_tabs th
|>> (fn true => prover_marker | false => prover_failed_marker)
| NONE => let val deps =
(case isar_deps_opt of
NONE => isar_dependencies_of name_tabs th
| deps => deps) in
(case deps of
NONE => (omitted_marker, [])
| SOME [] => (unprovable_marker, [])
| SOME deps => (isar_marker, deps)) end) in
(case trim_dependencies deps of
SOME deps => (marker, deps)
| NONE => (omitted_marker, [])) end
fun generate_isar_or_prover_dependencies ctxt params_opt range thys file_name = let val path = Path.explode file_name val facts = filter_out (has_thys thys o snd) (all_facts ctxt) val name_tabs = build_name_tables nickname_of_thm facts
fun do_fact (j, (_, th)) = if in_range range j then let val name = nickname_of_thm th val _ = tracing ("Fact " ^ string_of_int j ^ ": " ^ name) val access_facts = filter_accessible_from th facts val (marker, deps) = smart_dependencies_of ctxt params_opt access_facts name_tabs th NONE in
encode_str name ^ ": " ^ marker ^ " " ^ encode_strs deps ^ "\n" end else ""
val lines = map do_fact (tag_list 1 facts) in
File.write_list path lines end
fun generate_isar_dependencies ctxt =
generate_isar_or_prover_dependencies ctxt NONE
fun generate_prover_dependencies ctxt params =
generate_isar_or_prover_dependencies ctxt (SOME params)
val query = if do_query then let val query_feats =
new_facts
|> drop (j - num_extra_feature_facts)
|> take num_extra_feature_facts
|> rev
|> weight_facts_steeply
|> map extra_features_of
|> rpair (map (rpair 1.0) goal_feats)
|-> fold (union (eq_fst (op =))) in "? " ^ string_of_int max_suggs ^ " # " ^ encode_str name ^ ": " ^
encode_strs parents ^ "; " ^ encode_features query_feats ^ "\n" end else "" val update = "! " ^ encode_str name ^ ": " ^ encode_strs parents ^ "; " ^ encode_strs goal_feats ^ "; " ^ marker ^ " " ^ encode_strs deps ^ "\n" in query ^ update end else ""
val new_facts =
new_facts
|> attach_parents_to_facts old_facts
|> map (`(nickname_of_thm o snd o snd)) val lines = map do_fact (tag_list 1 new_facts) in
File.write_list path lines end
fun generate_isar_commands ctxt prover =
generate_isar_or_prover_commands ctxt prover NONE
fun generate_prover_commands ctxt (params as {provers = prover :: _, ...}) =
generate_isar_or_prover_commands ctxt prover (SOME params)
fun generate_mepo_or_mash_suggestions mepo_or_mash_suggested_facts ctxt
(params as {provers = prover :: _, ...}) (range, step) thys max_suggs file_name = let val path = Path.explode file_name val facts = all_facts ctxt val (new_facts, old_facts) = facts |> List.partition (has_thys thys o snd) val name_tabs = build_name_tables nickname_of_thm facts
fun do_fact (j, ((_, th), old_facts)) = if in_range range j then let val name = nickname_of_thm th val _ = tracing ("Fact " ^ string_of_int j ^ ": " ^ name) val goal = goal_of_thm (Proof_Context.theory_of ctxt) th val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal goal 1 ctxt val isar_deps = isar_dependencies_of name_tabs th in if is_bad_query ctxt step j th isar_deps then "" else let val suggs =
old_facts
|> filter_accessible_from th
|> mepo_or_mash_suggested_facts ctxt (Thm.theory_base_name th)
params max_suggs hyp_ts concl_t
|> map (nickname_of_thm o snd) in
encode_str name ^ ": " ^ encode_strs suggs ^ "\n" end end else ""
fun accum x (yss as ys :: _) = (x :: ys) :: yss val old_factss = tl (fold accum new_facts [rev old_facts]) val lines = map do_fact (tag_list 1 (new_facts ~~ rev (map rev old_factss))) in
File.write_list path lines end
fun generate_mesh_suggestions max_suggs mash_file_name mepo_file_name mesh_file_name = let val mesh_path = Path.explode mesh_file_name val _ = File.write mesh_path ""
fun do_fact (mash_line, mepo_line) = let val (name, mash_suggs) =
extract_suggestions mash_line
||> (map fst #> weight_facts_steeply) val (name', mepo_suggs) =
extract_suggestions mepo_line
||> (map fst #> weight_facts_steeply) val _ = if name = name' then () else error "Input files out of sync" val mess =
[(mepo_weight, (mepo_suggs, [])),
(mash_weight, (mash_suggs, []))] val mesh_suggs = mesh_facts I (op =) max_suggs mess val mesh_line = encode_str name ^ ": " ^ encode_strs mesh_suggs ^ "\n" in File.append mesh_path mesh_line end
val mash_lines = Path.explode mash_file_name |> File.read_lines val mepo_lines = Path.explode mepo_file_name |> File.read_lines in if length mash_lines = length mepo_lines thenList.app do_fact (mash_lines ~~ mepo_lines) else warning "Skipped: MaSh file missing or out of sync with MePo file" end
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.