src/HOL/Tools/Mirabelle/mirabelle_sledgehammer.ML
changeset 74950 b350a1f2115d
parent 74948 15ce207f69c8
child 74951 0b6f795d3b78
equal deleted inserted replaced
74949:90290869796f 74950:b350a1f2115d
   302 datatype sh_result =
   302 datatype sh_result =
   303   SH_OK of int * int * (string * stature) list |
   303   SH_OK of int * int * (string * stature) list |
   304   SH_FAIL of int * int |
   304   SH_FAIL of int * int |
   305   SH_ERROR
   305   SH_ERROR
   306 
   306 
   307 fun run_sh (params as {max_facts, minimize, preplay_timeout, ...}) prover_name e_selection_heuristic
   307 fun run_sh (params as {max_facts, minimize, preplay_timeout, induction_rules, ...}) prover_name
   308     term_order force_sos hard_timeout dir pos st =
   308     e_selection_heuristic term_order force_sos hard_timeout dir pos state =
   309   let
   309   let
   310     val thy = Proof.theory_of st
       
   311     val {context = ctxt, facts = chained_ths, goal} = Proof.goal st
       
   312     val i = 1
   310     val i = 1
   313     fun set_file_name (SOME dir) =
   311     fun set_file_name (SOME dir) =
   314         let
   312         let
   315           val filename = "prob_" ^
   313           val filename = "prob_" ^
   316             StringCvt.padLeft #"0" 5 (str0 (Position.line_of pos)) ^ "_" ^
   314             StringCvt.padLeft #"0" 5 (str0 (Position.line_of pos)) ^ "_" ^
   319           Config.put Sledgehammer_Prover_ATP.atp_dest_dir dir
   317           Config.put Sledgehammer_Prover_ATP.atp_dest_dir dir
   320           #> Config.put Sledgehammer_Prover_ATP.atp_problem_prefix (filename ^ "__")
   318           #> Config.put Sledgehammer_Prover_ATP.atp_problem_prefix (filename ^ "__")
   321           #> Config.put SMT_Config.debug_files (dir ^ "/" ^ filename ^ "__" ^ serial_string ())
   319           #> Config.put SMT_Config.debug_files (dir ^ "/" ^ filename ^ "__" ^ serial_string ())
   322         end
   320         end
   323       | set_file_name NONE = I
   321       | set_file_name NONE = I
   324     val st' =
   322     val state' =
   325       st
   323       state
   326       |> Proof.map_context
   324       |> Proof.map_context
   327            (set_file_name dir
   325            (set_file_name dir
   328             #> (Option.map (Config.put Sledgehammer_ATP_Systems.e_selection_heuristic)
   326             #> (Option.map (Config.put Sledgehammer_ATP_Systems.e_selection_heuristic)
   329                   e_selection_heuristic |> the_default I)
   327                   e_selection_heuristic |> the_default I)
   330             #> (Option.map (Config.put Sledgehammer_ATP_Systems.term_order)
   328             #> (Option.map (Config.put Sledgehammer_ATP_Systems.term_order)
   331                   term_order |> the_default I)
   329                   term_order |> the_default I)
   332             #> (Option.map (Config.put Sledgehammer_ATP_Systems.force_sos)
   330             #> (Option.map (Config.put Sledgehammer_ATP_Systems.force_sos)
   333                   force_sos |> the_default I))
   331                   force_sos |> the_default I))
   334     val default_max_facts =
       
   335       Sledgehammer_Prover_Minimize.default_max_facts_of_prover ctxt prover_name
       
   336     val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal goal i ctxt
       
   337     val time_limit =
   332     val time_limit =
   338       (case hard_timeout of
   333       (case hard_timeout of
   339         NONE => I
   334         NONE => I
   340       | SOME t => Timeout.apply t)
   335       | SOME t => Timeout.apply t)
   341     fun failed failure =
   336     fun failed failure =
   344         message = K ""}, ~1)
   339         message = K ""}, ~1)
   345     val ({outcome, used_facts, preferred_methss, run_time, message, ...}
   340     val ({outcome, used_facts, preferred_methss, run_time, message, ...}
   346          : Sledgehammer_Prover.prover_result,
   341          : Sledgehammer_Prover.prover_result,
   347          time_isa) = time_limit (Mirabelle.cpu_time (fn () =>
   342          time_isa) = time_limit (Mirabelle.cpu_time (fn () =>
   348       let
   343       let
   349         val ho_atp = Sledgehammer_Prover_ATP.is_ho_atp ctxt prover_name
   344         val ctxt = Proof.context_of state
   350         val keywords = Thy_Header.get_keywords' ctxt
   345         val inst_inducts = induction_rules = SOME Sledgehammer_Prover.Instantiate
   351         val css_table = Sledgehammer_Fact.clasimpset_rule_table_of ctxt
   346         val fact_override = Sledgehammer_Fact.no_fact_override
   352         val facts =
   347         val {facts = chained_thms, goal, ...} = Proof.goal state
   353           Sledgehammer_Fact.nearly_all_facts ctxt ho_atp
   348         val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal goal i ctxt
   354               Sledgehammer_Fact.no_fact_override keywords css_table chained_ths
   349         val facts = Sledgehammer_Fact.nearly_all_facts_of_context ctxt inst_inducts fact_override
   355               hyp_ts concl_t
   350           chained_thms hyp_ts concl_t
       
   351         val default_max_facts =
       
   352           Sledgehammer_Prover_Minimize.default_max_facts_of_prover ctxt prover_name
   356         val factss =
   353         val factss =
   357           facts
   354           facts
   358           |> Sledgehammer_MaSh.relevant_facts ctxt params prover_name
   355           |> Sledgehammer_MaSh.relevant_facts ctxt params prover_name
   359                  (the_default default_max_facts max_facts)
   356                  (the_default default_max_facts max_facts)
   360                  Sledgehammer_Fact.no_fact_override hyp_ts concl_t
   357                  Sledgehammer_Fact.no_fact_override hyp_ts concl_t
   361           |> tap (fn factss =>
       
   362                      "Line " ^ str0 (Position.line_of pos) ^ ": " ^
       
   363                      Sledgehammer.string_of_factss factss
       
   364                      |> writeln)
       
   365         val prover = get_prover ctxt prover_name params goal
   358         val prover = get_prover ctxt prover_name params goal
   366         val problem =
   359         val problem =
   367           {comment = "", state = st', goal = goal, subgoal = i,
   360           {comment = "", state = state', goal = goal, subgoal = i,
   368            subgoal_count = Sledgehammer_Util.subgoal_count st, factss = factss, found_proof = I}
   361            subgoal_count = Sledgehammer_Util.subgoal_count state, factss = factss, found_proof = I}
   369       in prover params problem end)) ()
   362       in prover params problem end)) ()
   370       handle Timeout.TIMEOUT _ => failed ATP_Proof.TimedOut
   363       handle Timeout.TIMEOUT _ => failed ATP_Proof.TimedOut
   371            | Fail "inappropriate" => failed ATP_Proof.Inappropriate
   364            | Fail "inappropriate" => failed ATP_Proof.Inappropriate
   372     val time_prover = run_time |> Time.toMilliseconds
   365     val time_prover = run_time |> Time.toMilliseconds
   373     val msg = message (fn () => Sledgehammer.play_one_line_proof minimize preplay_timeout used_facts
   366     val msg = message (fn () => Sledgehammer.play_one_line_proof minimize preplay_timeout used_facts
   374       st' i preferred_methss)
   367       state' i preferred_methss)
   375   in
   368   in
   376     (case outcome of
   369     (case outcome of
   377       NONE => (msg, SH_OK (time_isa, time_prover, used_facts))
   370       NONE => (msg, SH_OK (time_isa, time_prover, used_facts))
   378     | SOME _ => (msg, SH_FAIL (time_isa, time_prover)))
   371     | SOME _ => (msg, SH_FAIL (time_isa, time_prover)))
   379   end
   372   end