src/HOL/Tools/Sledgehammer/sledgehammer_provers.ML
changeset 45370 bab52dafa63a
parent 45369 fbf2e1bdbf16
child 45376 4b3caf1701a0
equal deleted inserted replaced
45369:fbf2e1bdbf16 45370:bab52dafa63a
    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