src/HOL/Tools/Sledgehammer/sledgehammer.ML
changeset 75034 890b70f96fe4
parent 75033 b55d84e41d61
child 75035 ed510a3693e2
equal deleted inserted replaced
75033:b55d84e41d61 75034:890b70f96fe4
   257       | _ => ())
   257       | _ => ())
   258   in
   258   in
   259     (outcome, message)
   259     (outcome, message)
   260   end
   260   end
   261 
   261 
   262 fun string_of_facts facts =
   262 fun string_of_facts filter facts =
   263   "Including " ^ string_of_int (length facts) ^ " relevant fact" ^ plural_s (length facts) ^ ": " ^
   263   "Selected " ^ string_of_int (length facts) ^ " " ^ (if filter = "" then "" else filter ^ " ") ^
   264   (facts |> map (fst o fst) |> space_implode " ")
   264   "fact" ^ plural_s (length facts) ^ ": " ^ (space_implode " " (map (fst o fst) facts))
   265 
   265 
   266 fun string_of_factss factss =
   266 fun string_of_factss factss =
   267   if forall (null o snd) factss then
   267   if forall (null o snd) factss then
   268     "Found no relevant facts"
   268     "Found no relevant facts"
   269   else
   269   else
   270     cat_lines (map (fn (filter, facts) =>
   270     cat_lines (map (fn (filter, facts) => string_of_facts filter facts) factss)
   271       (if filter = "" then "" else filter ^ ": ") ^ string_of_facts facts) factss)
       
   272 
   271 
   273 val default_slice_schedule =
   272 val default_slice_schedule =
   274   (* FUDGE (based on Seventeen evaluation) *)
   273   (* FUDGE (based on Seventeen evaluation) *)
   275   [cvc4N, zipperpositionN, vampireN, veritN, eN, cvc4N, zipperpositionN, cvc4N, vampireN, cvc4N,
   274   [cvc4N, zipperpositionN, vampireN, veritN, eN, cvc4N, zipperpositionN, cvc4N, vampireN, cvc4N,
   276    cvc4N, vampireN, cvc4N, eN, iproverN, zipperpositionN, vampireN, eN, vampireN, zipperpositionN,
   275    cvc4N, vampireN, cvc4N, eN, iproverN, zipperpositionN, vampireN, eN, vampireN, zipperpositionN,
   277    z3N, cvc4N, vampireN, iproverN, vampireN, zipperpositionN, z3N, z3N, cvc4N, cvc4N]
   276    z3N, cvc4N, vampireN, iproverN, vampireN, zipperpositionN, z3N, z3N, cvc4N, cvc4N]
   278 
   277 
   279 fun schedule_of_provers provers num_slices =
   278 fun schedule_of_provers provers num_slices =
   280   let
   279   let
   281     val num_default_slices = length default_slice_schedule
       
   282     val (known_provers, unknown_provers) =
   280     val (known_provers, unknown_provers) =
   283       List.partition (member (op =) default_slice_schedule) provers
   281       List.partition (member (op =) default_slice_schedule) provers
       
   282 
       
   283     val default_slice_schedule = filter (member (op =) known_provers) default_slice_schedule
       
   284     val num_default_slices = length default_slice_schedule
   284 
   285 
   285     fun round_robin _ [] = []
   286     fun round_robin _ [] = []
   286       | round_robin 0 _ = []
   287       | round_robin 0 _ = []
   287       | round_robin n (prover :: provers) = prover :: round_robin (n - 1) (provers @ [prover])
   288       | round_robin n (prover :: provers) = prover :: round_robin (n - 1) (provers @ [prover])
   288   in
   289   in
   291     else
   292     else
   292       default_slice_schedule
   293       default_slice_schedule
   293       @ round_robin (num_slices - num_default_slices) (unknown_provers @ known_provers)
   294       @ round_robin (num_slices - num_default_slices) (unknown_provers @ known_provers)
   294   end
   295   end
   295 
   296 
   296 fun prover_slices_of_schedule ctxt schedule =
   297 fun prover_slices_of_schedule ctxt ({max_facts, fact_filter, ...} : params) schedule =
   297   let
   298   let
   298     fun triplicate_slices original =
   299     fun triplicate_slices original =
   299       let
   300       let
   300         val shift =
   301         val shift =
   301           map (apfst (apsnd (fn fact_filter =>
   302           map (apfst (apsnd (fn fact_filter =>
   307         val shifted_twice = shift shifted_once
   308         val shifted_twice = shift shifted_once
   308       in
   309       in
   309         original @ shifted_once @ shifted_twice
   310         original @ shifted_once @ shifted_twice
   310       end
   311       end
   311 
   312 
       
   313     fun adjust_extra XXX = XXX (* ### FIXME *)
       
   314 
       
   315     fun adjust_slice ((num_facts0, fact_filter0), extra) =
       
   316       ((case max_facts of
       
   317          NONE => num_facts0
       
   318        | SOME max_facts => Int.min (num_facts0, max_facts),
       
   319         the_default fact_filter0 fact_filter),
       
   320        Option.map adjust_extra extra)
       
   321 
   312     val provers = distinct (op =) schedule
   322     val provers = distinct (op =) schedule
   313     val prover_slices =
   323     val prover_slices =
   314       map (fn prover => (prover, triplicate_slices (get_slices ctxt prover))) provers
   324       map (fn prover => (prover,
       
   325           (is_none fact_filter ? triplicate_slices)
       
   326             (map adjust_slice (get_slices ctxt prover))))
       
   327         provers
   315 
   328 
   316     fun translate _ [] = []
   329     fun translate _ [] = []
   317       | translate prover_slices (prover :: schedule) =
   330       | translate prover_slices (prover :: schedule) =
   318         (case AList.lookup (op =) prover_slices prover of
   331         (case AList.lookup (op =) prover_slices prover of
   319           SOME (slice :: slices) =>
   332           SOME (slice :: slices) =>
   321             (prover, slice) :: translate prover_slices' schedule
   334             (prover, slice) :: translate prover_slices' schedule
   322           end
   335           end
   323         | _ => translate prover_slices schedule)
   336         | _ => translate prover_slices schedule)
   324   in
   337   in
   325     translate prover_slices schedule
   338     translate prover_slices schedule
       
   339     |> distinct (op =)
   326   end
   340   end
   327 
   341 
   328 fun run_sledgehammer (params as {verbose, spy, provers, induction_rules, max_facts, max_proofs,
   342 fun run_sledgehammer (params as {verbose, spy, provers, induction_rules, max_facts, max_proofs,
   329       slices, ...})
   343       slices, ...})
   330     mode writeln_result i (fact_override as {only, ...}) state =
   344     mode writeln_result i (fact_override as {only, ...}) state =
   373                 SOME n => n
   387                 SOME n => n
   374               | NONE =>
   388               | NONE =>
   375                 fold (fn prover =>
   389                 fold (fn prover =>
   376                     fold (fn ((n, _), _) => Integer.max n) (get_slices ctxt prover))
   390                     fold (fn ((n, _), _) => Integer.max n) (get_slices ctxt prover))
   377                   provers 0)
   391                   provers 0)
       
   392               * 51 div 50  (* some slack to account for filtering of induction facts below *)
   378 
   393 
   379             val ({elapsed, ...}, factss) = Timing.timing
   394             val ({elapsed, ...}, factss) = Timing.timing
   380               (relevant_facts ctxt params (hd provers) max_max_facts fact_override hyp_ts concl_t)
   395               (relevant_facts ctxt params (hd provers) max_max_facts fact_override hyp_ts concl_t)
   381               all_facts
   396               all_facts
   382 
   397 
   404             val schedule =
   419             val schedule =
   405               if mode = Auto_Try then
   420               if mode = Auto_Try then
   406                 provers
   421                 provers
   407               else
   422               else
   408                 schedule_of_provers provers slices
   423                 schedule_of_provers provers slices
   409             val prover_slices = prover_slices_of_schedule ctxt schedule
   424             val prover_slices = prover_slices_of_schedule ctxt params schedule
   410           in
   425           in
   411             if mode = Auto_Try then
   426             if mode = Auto_Try then
   412               (SH_Unknown, "")
   427               (SH_Unknown, "")
   413               |> fold (fn (prover, slice) =>
   428               |> fold (fn (prover, slice) =>
   414                   fn accum as (SH_Some _, _) => accum
   429                   fn accum as (SH_Some _, _) => accum