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 |
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 = |