9 val prover_timeoutK = "prover_timeout" |
9 val prover_timeoutK = "prover_timeout" |
10 val keepK = "keep" |
10 val keepK = "keep" |
11 val type_encK = "type_enc" |
11 val type_encK = "type_enc" |
12 val soundK = "sound" |
12 val soundK = "sound" |
13 val slicingK = "slicing" |
13 val slicingK = "slicing" |
14 val lambda_transK = "lambda_trans" |
14 val lam_transK = "lam_trans" |
15 val e_weight_methodK = "e_weight_method" |
15 val e_weight_methodK = "e_weight_method" |
16 val force_sosK = "force_sos" |
16 val force_sosK = "force_sos" |
17 val max_relevantK = "max_relevant" |
17 val max_relevantK = "max_relevant" |
18 val max_callsK = "max_calls" |
18 val max_callsK = "max_calls" |
19 val minimizeK = "minimize" |
19 val minimizeK = "minimize" |
353 datatype sh_result = |
353 datatype sh_result = |
354 SH_OK of int * int * (string * locality) list | |
354 SH_OK of int * int * (string * locality) list | |
355 SH_FAIL of int * int | |
355 SH_FAIL of int * int | |
356 SH_ERROR |
356 SH_ERROR |
357 |
357 |
358 fun run_sh prover_name prover type_enc sound max_relevant slicing lambda_trans |
358 fun run_sh prover_name prover type_enc sound max_relevant slicing lam_trans |
359 e_weight_method force_sos hard_timeout timeout dir pos st = |
359 e_weight_method force_sos hard_timeout timeout dir pos st = |
360 let |
360 let |
361 val {context = ctxt, facts = chained_ths, goal} = Proof.goal st |
361 val {context = ctxt, facts = chained_ths, goal} = Proof.goal st |
362 val i = 1 |
362 val i = 1 |
363 fun set_file_name (SOME dir) = |
363 fun set_file_name (SOME dir) = |
369 ^ serial_string ()) |
369 ^ serial_string ()) |
370 | set_file_name NONE = I |
370 | set_file_name NONE = I |
371 val st' = |
371 val st' = |
372 st |> Proof.map_context |
372 st |> Proof.map_context |
373 (set_file_name dir |
373 (set_file_name dir |
374 #> (Option.map (Config.put |
|
375 Sledgehammer_Provers.atp_lambda_trans) |
|
376 lambda_trans |> the_default I) |
|
377 #> (Option.map (Config.put ATP_Systems.e_weight_method) |
374 #> (Option.map (Config.put ATP_Systems.e_weight_method) |
378 e_weight_method |> the_default I) |
375 e_weight_method |> the_default I) |
379 #> (Option.map (Config.put ATP_Systems.force_sos) |
376 #> (Option.map (Config.put ATP_Systems.force_sos) |
380 force_sos |> the_default I)) |
377 force_sos |> the_default I)) |
381 val params as {relevance_thresholds, max_relevant, slicing, ...} = |
378 val params as {relevance_thresholds, max_relevant, slicing, ...} = |
382 Sledgehammer_Isar.default_params ctxt |
379 Sledgehammer_Isar.default_params ctxt |
383 [("verbose", "true"), |
380 [("verbose", "true"), |
384 ("type_enc", type_enc), |
381 ("type_enc", type_enc), |
385 ("sound", sound), |
382 ("sound", sound), |
|
383 ("lam_trans", lam_trans |> the_default "smart"), |
386 ("preplay_timeout", preplay_timeout), |
384 ("preplay_timeout", preplay_timeout), |
387 ("max_relevant", max_relevant), |
385 ("max_relevant", max_relevant), |
388 ("slicing", slicing), |
386 ("slicing", slicing), |
389 ("timeout", string_of_int timeout), |
387 ("timeout", string_of_int timeout), |
390 ("preplay_timeout", preplay_timeout)] |
388 ("preplay_timeout", preplay_timeout)] |
463 val (prover_name, prover) = get_prover (Proof.context_of st) args |
461 val (prover_name, prover) = get_prover (Proof.context_of st) args |
464 val type_enc = AList.lookup (op =) args type_encK |> the_default "smart" |
462 val type_enc = AList.lookup (op =) args type_encK |> the_default "smart" |
465 val sound = AList.lookup (op =) args soundK |> the_default "false" |
463 val sound = AList.lookup (op =) args soundK |> the_default "false" |
466 val max_relevant = AList.lookup (op =) args max_relevantK |> the_default "smart" |
464 val max_relevant = AList.lookup (op =) args max_relevantK |> the_default "smart" |
467 val slicing = AList.lookup (op =) args slicingK |> the_default "true" |
465 val slicing = AList.lookup (op =) args slicingK |> the_default "true" |
468 val lambda_trans = AList.lookup (op =) args lambda_transK |
466 val lam_trans = AList.lookup (op =) args lam_transK |
469 val e_weight_method = AList.lookup (op =) args e_weight_methodK |
467 val e_weight_method = AList.lookup (op =) args e_weight_methodK |
470 val force_sos = AList.lookup (op =) args force_sosK |
468 val force_sos = AList.lookup (op =) args force_sosK |
471 |> Option.map (curry (op <>) "false") |
469 |> Option.map (curry (op <>) "false") |
472 val dir = AList.lookup (op =) args keepK |
470 val dir = AList.lookup (op =) args keepK |
473 val timeout = Mirabelle.get_int_setting args (prover_timeoutK, 30) |
471 val timeout = Mirabelle.get_int_setting args (prover_timeoutK, 30) |
474 (* always use a hard timeout, but give some slack so that the automatic |
472 (* always use a hard timeout, but give some slack so that the automatic |
475 minimizer has a chance to do its magic *) |
473 minimizer has a chance to do its magic *) |
476 val hard_timeout = SOME (2 * timeout) |
474 val hard_timeout = SOME (2 * timeout) |
477 val (msg, result) = |
475 val (msg, result) = |
478 run_sh prover_name prover type_enc sound max_relevant slicing lambda_trans |
476 run_sh prover_name prover type_enc sound max_relevant slicing lam_trans |
479 e_weight_method force_sos hard_timeout timeout dir pos st |
477 e_weight_method force_sos hard_timeout timeout dir pos st |
480 in |
478 in |
481 case result of |
479 case result of |
482 SH_OK (time_isa, time_prover, names) => |
480 SH_OK (time_isa, time_prover, names) => |
483 let |
481 let |
574 if !reconstructor = "sledgehammer_tac" then |
572 if !reconstructor = "sledgehammer_tac" then |
575 sledge_tac 0.2 ATP_Systems.z3_tptpN "mono_simple" |
573 sledge_tac 0.2 ATP_Systems.z3_tptpN "mono_simple" |
576 ORELSE' sledge_tac 0.2 ATP_Systems.eN "mono_guards??" |
574 ORELSE' sledge_tac 0.2 ATP_Systems.eN "mono_guards??" |
577 ORELSE' sledge_tac 0.2 ATP_Systems.vampireN "mono_guards??" |
575 ORELSE' sledge_tac 0.2 ATP_Systems.vampireN "mono_guards??" |
578 ORELSE' sledge_tac 0.2 ATP_Systems.spassN "poly_tags" |
576 ORELSE' sledge_tac 0.2 ATP_Systems.spassN "poly_tags" |
579 ORELSE' Metis_Tactic.metis_tac [] ctxt thms |
577 ORELSE' Metis_Tactic.metis_tac [] ATP_Translate.combinatorsN ctxt thms |
580 else if !reconstructor = "smt" then |
578 else if !reconstructor = "smt" then |
581 SMT_Solver.smt_tac ctxt thms |
579 SMT_Solver.smt_tac ctxt thms |
582 else if full orelse !reconstructor = "metis (full_types)" then |
580 else if full orelse !reconstructor = "metis (full_types)" then |
583 Metis_Tactic.metis_tac [Metis_Tactic.full_type_enc] ctxt thms |
581 Metis_Tactic.metis_tac [Metis_Tactic.full_type_enc] |
|
582 ATP_Translate.combinatorsN ctxt thms |
584 else if !reconstructor = "metis (no_types)" then |
583 else if !reconstructor = "metis (no_types)" then |
585 Metis_Tactic.metis_tac [Metis_Tactic.no_type_enc] ctxt thms |
584 Metis_Tactic.metis_tac [Metis_Tactic.no_type_enc] |
|
585 ATP_Translate.combinatorsN ctxt thms |
586 else if !reconstructor = "metis" then |
586 else if !reconstructor = "metis" then |
587 Metis_Tactic.metis_tac [] ctxt thms |
587 Metis_Tactic.metis_tac [] ATP_Translate.combinatorsN ctxt thms |
588 else |
588 else |
589 K all_tac |
589 K all_tac |
590 end |
590 end |
591 fun apply_reconstructor named_thms = |
591 fun apply_reconstructor named_thms = |
592 Mirabelle.can_apply timeout (do_reconstructor named_thms) st |
592 Mirabelle.can_apply timeout (do_reconstructor named_thms) st |