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 |