src/HOL/Tools/Sledgehammer/sledgehammer_minimize.ML
changeset 41265 a393d6d8e198
parent 41259 13972ced98d9
child 41267 958fee9ec275
equal deleted inserted replaced
41264:a96b0b62f588 41265:a393d6d8e198
    10   type locality = Sledgehammer_Filter.locality
    10   type locality = Sledgehammer_Filter.locality
    11   type params = Sledgehammer_Provers.params
    11   type params = Sledgehammer_Provers.params
    12 
    12 
    13   val filter_used_facts : ''a list -> (''a * 'b) list -> (''a * 'b) list
    13   val filter_used_facts : ''a list -> (''a * 'b) list -> (''a * 'b) list
    14   val minimize_facts :
    14   val minimize_facts :
    15     params -> bool -> int -> int -> Proof.state
    15     string -> params -> bool -> int -> int -> Proof.state
    16     -> ((string * locality) * thm list) list
    16     -> ((string * locality) * thm list) list
    17     -> ((string * locality) * thm list) list option * string
    17     -> ((string * locality) * thm list) list option * string
    18   val run_minimize :
    18   val run_minimize :
    19     params -> int -> (Facts.ref * Attrib.src list) list -> Proof.state -> unit
    19     params -> int -> (Facts.ref * Attrib.src list) list -> Proof.state -> unit
    20 end;
    20 end;
   122 (* Give the external prover some slack. The ATP gets further slack because the
   122 (* Give the external prover some slack. The ATP gets further slack because the
   123    Sledgehammer preprocessing time is included in the estimate below but isn't
   123    Sledgehammer preprocessing time is included in the estimate below but isn't
   124    part of the timeout. *)
   124    part of the timeout. *)
   125 val fudge_msecs = 1000
   125 val fudge_msecs = 1000
   126 
   126 
   127 fun minimize_facts {provers = [], ...} _ _ _ _ _ = error "No prover is set."
   127 fun minimize_facts prover_name (params as {timeout, ...}) silent i n state
   128   | minimize_facts (params as {provers = prover_name :: _, timeout, ...}) silent
   128                    facts =
   129                    i n state facts =
       
   130   let
   129   let
   131     val thy = Proof.theory_of state
   130     val thy = Proof.theory_of state
   132     val ctxt = Proof.context_of state
   131     val ctxt = Proof.context_of state
   133     val prover = get_prover ctxt false prover_name
   132     val prover = get_prover ctxt false prover_name
   134     val msecs = Time.toMilliseconds timeout
   133     val msecs = Time.toMilliseconds timeout
   175               string_of_int (10 + msecs div 1000) ^ "\").")
   174               string_of_int (10 + msecs div 1000) ^ "\").")
   176      | {message, ...} => (NONE, "Prover error: " ^ message))
   175      | {message, ...} => (NONE, "Prover error: " ^ message))
   177     handle ERROR msg => (NONE, "Error: " ^ msg)
   176     handle ERROR msg => (NONE, "Error: " ^ msg)
   178   end
   177   end
   179 
   178 
   180 fun run_minimize params i refs state =
   179 fun run_minimize (params as {provers, ...}) i refs state =
   181   let
   180   let
   182     val ctxt = Proof.context_of state
   181     val ctxt = Proof.context_of state
   183     val reserved = reserved_isar_keyword_table ()
   182     val reserved = reserved_isar_keyword_table ()
   184     val chained_ths = #facts (Proof.goal state)
   183     val chained_ths = #facts (Proof.goal state)
   185     val facts =
   184     val facts =
   186       refs
   185       refs
   187       |> maps (map (apsnd single) o fact_from_ref ctxt reserved chained_ths)
   186       |> maps (map (apsnd single) o fact_from_ref ctxt reserved chained_ths)
   188   in
   187   in
   189     case subgoal_count state of
   188     case subgoal_count state of
   190       0 => Output.urgent_message "No subgoal!"
   189       0 => Output.urgent_message "No subgoal!"
   191     | n =>
   190     | n => case provers of
   192       (kill_provers ();
   191              [] => error "No prover is set."
   193        Output.urgent_message (#2 (minimize_facts params false i n state facts)))
   192            | prover :: _ =>
       
   193              (kill_provers ();
       
   194               minimize_facts prover params false i n state facts
       
   195               |> #2 |> Output.urgent_message)
   194   end
   196   end
   195 
   197 
   196 end;
   198 end;