From 7aaeaf51e72f38e816707b10b66b6114d24d9225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Fri, 6 Sep 2019 14:27:04 +0200 Subject: [PATCH] [wp/why3] re-arrange code --- src/plugins/wp/ProverWhy3.ml | 54 +++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml index cbe30c4322b..076226d7092 100644 --- a/src/plugins/wp/ProverWhy3.ml +++ b/src/plugins/wp/ProverWhy3.ml @@ -41,8 +41,8 @@ module Env = WpContext.Index(struct type data = Why3.Env.env end) -let get_why3_env = - Env.memoize (fun () -> +let get_why3_env = Env.memoize + begin fun () -> let config = Lazy.force config in let main = Why3.Whyconf.get_main config in let ld = @@ -50,7 +50,7 @@ let get_why3_env = (Wp_parameters.Share.file "why3"):: (Why3.Whyconf.loadpath main) in Why3.Env.create_env ld - ) + end type context = { mutable th : Why3.Theory.theory_uc; @@ -976,7 +976,6 @@ let prove_prop ?axioms ~pid ~prop = let t = Why3.Task.use_export t th in Why3.Task.add_decl t decl - let task_of_wpo wpo = let pid = wpo.Wpo.po_pid in match wpo.Wpo.po_formula with @@ -995,14 +994,13 @@ let task_of_wpo wpo = let altergo_step_limit = Str.regexp "^Steps limit reached:" -let call_prover ~timeout ~steplimit prover task wpo = - let steplimit = match steplimit with Some 0 -> None | _ -> steplimit in - let config = Lazy.force config in +let call_prover ~timeout ~steplimit prover wpo = let env = get_why3_env () in + let task = task_of_wpo wpo in + let config = Lazy.force config in let prover_config = Why3.Whyconf.get_prover_config config prover in - let command = Why3.Whyconf.get_complete_command prover_config ~with_steps:(steplimit<>None) in - let drv = - Why3.Whyconf.load_driver (Why3.Whyconf.get_main config) env prover_config.driver prover_config.extra_drivers in + let drv = Why3.Whyconf.load_driver (Why3.Whyconf.get_main config) + env prover_config.driver prover_config.extra_drivers in let limit = let def = Why3.Call_provers.empty_limit in { def with @@ -1014,31 +1012,47 @@ let call_prover ~timeout ~steplimit prover task wpo = then Filter_axioms.remove_for_altergo else Filter_axioms.remove_for_why3 in - let trans = Why3.Trans.seq [remove_for_prover; Filter_axioms.trans; Filter_axioms.def_into_axiom] in + let trans = Why3.Trans.seq [ + remove_for_prover; + Filter_axioms.trans; + Filter_axioms.def_into_axiom + ] in let task = if prover.prover_name = "Coq" then task else Why3.Trans.apply trans task in let task = Why3.Driver.prepare_task drv task in - let file = Wpo.DISK.file_goal ~pid:wpo.Wpo.po_pid ~model:wpo.Wpo.po_model ~prover:(VCS.Why3 prover) in + let file = Wpo.DISK.file_goal + ~pid:wpo.Wpo.po_pid + ~model:wpo.Wpo.po_model + ~prover:(VCS.Why3 prover) in (* This printing is currently just for debugging *) - let _ = Command.print_file file (fun fmt -> Why3.Driver.print_task_prepared drv fmt task) in + let _ = Command.print_file file (fun fmt -> + Why3.Driver.print_task_prepared drv fmt task + ) in if Wp_parameters.Check.get () then (** Why3 typed checked the task during its build *) Task.return VCS.checked else + let steplimit = match steplimit with Some 0 -> None | _ -> steplimit in + let command = Why3.Whyconf.get_complete_command prover_config + ~with_steps:(steplimit<>None) in let call = Why3.Driver.prove_task_prepared ~command ~limit drv task in Wp_parameters.debug ~dkey "@[@[Why3 run prover %a with %i timeout %i steplimit@]@]@." - Why3.Whyconf.print_prover prover (Why3.Opt.get_def (-1) timeout) (Why3.Opt.get_def (-1) steplimit); + Why3.Whyconf.print_prover prover + (Why3.Opt.get_def (-1) timeout) + (Why3.Opt.get_def (-1) steplimit); let ping _ (* why3 seems not to be able to kill a started prover *) = match Why3.Call_provers.query_call call with | NoUpdates | ProverStarted -> Task.Yield | InternalFailure exn -> - Task.Return (Task.Result (VCS.failed (Format.asprintf "%a" Why3.Exn_printer.exn_printer exn))) - | ProverInterrupted -> Task.Return (Task.Result (VCS.failed "interrupted")) + let msg = Format.asprintf "%a" Why3.Exn_printer.exn_printer exn in + Task.Return (Task.Result (VCS.failed msg)) + | ProverInterrupted -> + Task.Return (Task.Result (VCS.failed "interrupted")) | ProverFinished pr -> let r = match pr.pr_answer with | Timeout -> VCS.timeout (int_of_float pr.pr_time) @@ -1049,8 +1063,9 @@ let call_prover ~timeout ~steplimit prover task wpo = | Unknown _ -> VCS.unknown | Failure s -> VCS.failed s | HighFailure -> - let alt_ergo_hack = prover.prover_name = "Alt-Ergo" && - Str.string_match altergo_step_limit pr.pr_output 0 + let alt_ergo_hack = + prover.prover_name = "Alt-Ergo" && + Str.string_match altergo_step_limit pr.pr_output 0 in if alt_ergo_hack then VCS.stepout else VCS.failed "Unknown error" @@ -1073,12 +1088,11 @@ let version = Why3.Config.version let prove ?timeout ?steplimit ~prover wpo = try let do_ () = - let task = task_of_wpo wpo in if Wp_parameters.Generate.get () then if Wp_parameters.Check.get () then Task.return VCS.checked else Task.return VCS.no_result - else call_prover ~timeout ~steplimit prover task wpo + else call_prover ~timeout ~steplimit prover wpo in WpContext.on_context (Wpo.get_context wpo) do_ () with exn -> -- GitLab