50 smt_filter: (string * locality) SMT_Solver.smt_filter_data option} |
50 smt_filter: (string * locality) SMT_Solver.smt_filter_data option} |
51 |
51 |
52 type prover_result = |
52 type prover_result = |
53 {outcome: failure option, |
53 {outcome: failure option, |
54 used_facts: (string * locality) list, |
54 used_facts: (string * locality) list, |
55 run_time_in_msecs: int, |
55 run_time: Time.time, |
56 preplay: unit -> play, |
56 preplay: unit -> play, |
57 message: play -> string, |
57 message: play -> string, |
58 message_tail: string} |
58 message_tail: string} |
59 |
59 |
60 type prover = |
60 type prover = |
321 smt_filter: (string * locality) SMT_Solver.smt_filter_data option} |
321 smt_filter: (string * locality) SMT_Solver.smt_filter_data option} |
322 |
322 |
323 type prover_result = |
323 type prover_result = |
324 {outcome: failure option, |
324 {outcome: failure option, |
325 used_facts: (string * locality) list, |
325 used_facts: (string * locality) list, |
326 run_time_in_msecs: int, |
326 run_time: Time.time, |
327 preplay: unit -> play, |
327 preplay: unit -> play, |
328 message: play -> string, |
328 message: play -> string, |
329 message_tail: string} |
329 message_tail: string} |
330 |
330 |
331 type prover = |
331 type prover = |
795 "")) |
795 "")) |
796 end |
796 end |
797 | SOME failure => |
797 | SOME failure => |
798 ([], K (Failed_to_Play Metis), fn _ => string_for_failure failure, "") |
798 ([], K (Failed_to_Play Metis), fn _ => string_for_failure failure, "") |
799 in |
799 in |
800 {outcome = outcome, used_facts = used_facts, run_time_in_msecs = msecs, |
800 {outcome = outcome, used_facts = used_facts, run_time = Time.fromMilliseconds msecs, (*###*) |
801 preplay = preplay, message = message, message_tail = message_tail} |
801 preplay = preplay, message = message, message_tail = message_tail} |
802 end |
802 end |
803 |
803 |
804 (* "SMT_Failure.Abnormal_Termination" carries the solver's return code. Until |
804 (* "SMT_Failure.Abnormal_Termination" carries the solver's return code. Until |
805 these are sorted out properly in the SMT module, we have to interpret these |
805 these are sorted out properly in the SMT module, we have to interpret these |
926 facts |> take new_num_facts |
926 facts |> take new_num_facts |
927 |> do_slice timeout (slice + 1) outcome0 time_so_far |
927 |> do_slice timeout (slice + 1) outcome0 time_so_far |
928 end |
928 end |
929 else |
929 else |
930 {outcome = if is_none outcome then NONE else the outcome0, |
930 {outcome = if is_none outcome then NONE else the outcome0, |
931 used_facts = used_facts, |
931 used_facts = used_facts, run_time = time_so_far} |
932 run_time_in_msecs = Time.toMilliseconds time_so_far} |
|
933 end |
932 end |
934 in do_slice timeout 1 NONE Time.zeroTime end |
933 in do_slice timeout 1 NONE Time.zeroTime end |
935 |
934 |
936 fun run_smt_solver mode name (params as {debug, verbose, preplay_timeout, ...}) |
935 fun run_smt_solver mode name (params as {debug, verbose, preplay_timeout, ...}) |
937 minimize_command |
936 minimize_command |
940 let |
939 let |
941 val ctxt = Proof.context_of state |
940 val ctxt = Proof.context_of state |
942 val num_facts = length facts |
941 val num_facts = length facts |
943 val facts = facts ~~ (0 upto num_facts - 1) |
942 val facts = facts ~~ (0 upto num_facts - 1) |
944 |> map (smt_weighted_fact ctxt num_facts) |
943 |> map (smt_weighted_fact ctxt num_facts) |
945 val {outcome, used_facts, run_time_in_msecs} = |
944 val {outcome, used_facts, run_time} = |
946 smt_filter_loop ctxt name params state subgoal smt_filter facts |
945 smt_filter_loop ctxt name params state subgoal smt_filter facts |
947 val (used_facts, used_ths) = used_facts |> ListPair.unzip |
946 val (used_facts, used_ths) = used_facts |> ListPair.unzip |
948 val outcome = outcome |> Option.map failure_from_smt_failure |
947 val outcome = outcome |> Option.map failure_from_smt_failure |
949 val (preplay, message, message_tail) = |
948 val (preplay, message, message_tail) = |
950 case outcome of |
949 case outcome of |
966 (preplay, proof_banner mode name, used_facts, |
965 (preplay, proof_banner mode name, used_facts, |
967 choose_minimize_command minimize_command name preplay, |
966 choose_minimize_command minimize_command name preplay, |
968 subgoal, subgoal_count) |
967 subgoal, subgoal_count) |
969 in one_line_proof_text one_line_params end, |
968 in one_line_proof_text one_line_params end, |
970 if verbose then |
969 if verbose then |
971 "\nSMT solver real CPU time: " ^ |
970 "\nSMT solver real CPU time: " ^ string_from_time run_time ^ "." |
972 string_from_time (Time.fromMilliseconds run_time_in_msecs) ^ "." |
|
973 else |
971 else |
974 "") |
972 "") |
975 | SOME failure => |
973 | SOME failure => |
976 (K (Failed_to_Play Metis), fn _ => string_for_failure failure, "") |
974 (K (Failed_to_Play Metis), fn _ => string_for_failure failure, "") |
977 in |
975 in |
978 {outcome = outcome, used_facts = used_facts, |
976 {outcome = outcome, used_facts = used_facts, run_time = run_time, |
979 run_time_in_msecs = run_time_in_msecs, preplay = preplay, |
977 preplay = preplay, message = message, message_tail = message_tail} |
980 message = message, message_tail = message_tail} |
|
981 end |
978 end |
982 |
979 |
983 fun run_metis mode name ({debug, timeout, ...} : params) minimize_command |
980 fun run_metis mode name ({debug, timeout, ...} : params) minimize_command |
984 ({state, subgoal, subgoal_count, facts, ...} : prover_problem) = |
981 ({state, subgoal, subgoal_count, facts, ...} : prover_problem) = |
985 let |
982 let |
991 facts |> map untranslated_fact |> ListPair.unzip |
988 facts |> map untranslated_fact |> ListPair.unzip |
992 in |
989 in |
993 case play_one_line_proof debug timeout used_ths state subgoal |
990 case play_one_line_proof debug timeout used_ths state subgoal |
994 [reconstructor] of |
991 [reconstructor] of |
995 play as Played (_, time) => |
992 play as Played (_, time) => |
996 {outcome = NONE, used_facts = used_facts, |
993 {outcome = NONE, used_facts = used_facts, run_time = time, |
997 run_time_in_msecs = Time.toMilliseconds time, |
|
998 preplay = K play, |
994 preplay = K play, |
999 message = fn play => |
995 message = fn play => |
1000 let |
996 let |
1001 val one_line_params = |
997 val one_line_params = |
1002 (play, proof_banner mode name, used_facts, |
998 (play, proof_banner mode name, used_facts, |
1005 message_tail = ""} |
1001 message_tail = ""} |
1006 | play => |
1002 | play => |
1007 let |
1003 let |
1008 val failure = case play of Failed_to_Play _ => GaveUp | _ => TimedOut |
1004 val failure = case play of Failed_to_Play _ => GaveUp | _ => TimedOut |
1009 in |
1005 in |
1010 {outcome = SOME failure, used_facts = [], run_time_in_msecs = ~1, |
1006 {outcome = SOME failure, used_facts = [], run_time = Time.zeroTime, |
1011 preplay = K play, message = fn _ => string_for_failure failure, |
1007 preplay = K play, message = fn _ => string_for_failure failure, |
1012 message_tail = ""} |
1008 message_tail = ""} |
1013 end |
1009 end |
1014 end |
1010 end |
1015 |
1011 |