diff --git a/src/plugins/wp/GuiGoal.ml b/src/plugins/wp/GuiGoal.ml index a728026f5dcea8c5e71bd8d638c9f68a03688ecb..9ba3bf0cc946a7afb8a246f85e5c5817624d3900 100644 --- a/src/plugins/wp/GuiGoal.ml +++ b/src/plugins/wp/GuiGoal.ml @@ -551,7 +551,7 @@ class pane (proverpane : GuiConfig.provers) = let n = Task.size pool in if n = 0 then begin - ignore (ProofEngine.commit ~resolve:false fork) ; + ignore (ProofEngine.commit fork) ; ProofEngine.validate proof ; ProofEngine.forward proof ; state <- Proof proof ; diff --git a/src/plugins/wp/GuiNavigator.ml b/src/plugins/wp/GuiNavigator.ml index 7da1c5d3d9f9a6dc365f93b24f5c4d18001792ee..0b97d0de9e790f28775d5e04d2d93fd736323ddd 100644 --- a/src/plugins/wp/GuiNavigator.ml +++ b/src/plugins/wp/GuiNavigator.ml @@ -123,7 +123,7 @@ class behavior method reload () = begin list#reload ; - let to_prove g = not (Wpo.is_proved g || Wpo.resolve g) in + let to_prove g = not (Wpo.is_proved g || Wpo.reduce g) in let has_proof g = match ProofEngine.get g with | `None -> false diff --git a/src/plugins/wp/ProofEngine.ml b/src/plugins/wp/ProofEngine.ml index 8e8d7bcb37a8b03584196ef37cbb404717b86b4b..acc7f935ca2acbd308d663ba09ac3d3021ba8e5e 100644 --- a/src/plugins/wp/ProofEngine.ml +++ b/src/plugins/wp/ProofEngine.ml @@ -52,13 +52,15 @@ module PROOFS = Model.StaticGenerator(Wpo.S) type key = Wpo.S.t type data = tree let name = "Wp.ProofEngine.Proofs" - let compile main = { - main ; gid = 0 ; - pool = None ; - head = None ; - root = None ; - saved = false ; - } + let compile main = + ignore (Wpo.resolve main) ; + { + main ; gid = 0 ; + pool = None ; + head = None ; + root = None ; + saved = false ; + } end) let () = Wpo.on_remove PROOFS.remove @@ -143,6 +145,8 @@ let iteri f tree = (* --- Consolidating --- *) (* -------------------------------------------------------------------------- *) +let proved n = Wpo.is_proved n.goal + let pending n = let k = ref 0 in walk (fun _ -> incr k) n ; !k @@ -212,7 +216,6 @@ let status t : status = `Pending (pending root) -let proved n = Wpo.is_proved n.goal let opened n = not (Wpo.is_proved n.goal) let state n = @@ -387,14 +390,11 @@ let anchor tree ?node () = | Some n -> n | None -> mk_root tree -let commit ~resolve fork = - let resolved (_,wp) = - Wpo.is_proved wp || ( resolve && Wpo.resolve wp ) in - let resolved , residual = List.partition resolved fork.Fork.goals in - iter_all Wpo.remove resolved ; +let commit fork = + List.iter (fun (_,wp) -> ignore (Wpo.resolve wp)) fork.Fork.goals ; let tree = fork.Fork.tree in let anchor = fork.Fork.anchor in - let children = map_all (mk_tree_node ~tree ~anchor) residual in + let children = map_all (mk_tree_node ~tree ~anchor) fork.Fork.goals in tree.saved <- false ; anchor.script <- Tactic( fork.Fork.tactic , children ) ; anchor , children diff --git a/src/plugins/wp/ProofEngine.mli b/src/plugins/wp/ProofEngine.mli index 8d8078f18d59041ab10d8e51719f912da30e9c50..53299b7b63a39b8e710cc0ed309981adb6291dc0 100644 --- a/src/plugins/wp/ProofEngine.mli +++ b/src/plugins/wp/ProofEngine.mli @@ -71,7 +71,7 @@ type fork val anchor : tree -> ?node:node -> unit -> node val fork : tree -> anchor:node -> ProofScript.jtactic -> Tactical.process -> fork val iter : (Wpo.t -> unit) -> fork -> unit -val commit : resolve:bool -> fork -> node * (string * node) list +val commit : fork -> node * (string * node) list val pretty : Format.formatter -> fork -> unit val script : tree -> ProofScript.jscript diff --git a/src/plugins/wp/ProverScript.ml b/src/plugins/wp/ProverScript.ml index ceb23c74de9701f305ae7d32bf9c0060d5ca4524..3ccf4f59b6873a055a172ced0622f3e5ae6cfbbf 100644 --- a/src/plugins/wp/ProverScript.ml +++ b/src/plugins/wp/ProverScript.ml @@ -299,7 +299,7 @@ and autosearch env ~depth node : bool Task.task = | Some fork -> autofork env ~depth fork and autofork env ~depth fork = - let _,children = ProofEngine.commit ~resolve:true fork in + let _,children = ProofEngine.commit fork in let pending = Env.pending env in if pending > 0 then begin @@ -346,7 +346,7 @@ let rec crawl env on_child node = function begin match jfork (Env.tree env) ?node jtactic with | None -> - Wp_parameters.error + Wp_parameters.warning "Script Error: can not apply '%s'@\n\ @[<hov 2>Params: %a@]@\n\ @[<hov 2>Select: %a@]@." @@ -356,9 +356,12 @@ let rec crawl env on_child node = function crawl env on_child node alternative | Some fork -> (*TODO: saveback forgiven script *) - let _,children = ProofEngine.commit ~resolve:true fork in + let _,children = ProofEngine.commit fork in reconcile children subscripts ; - if children = [] then + let residual = List.filter + (fun (_,node) -> not (ProofEngine.proved node)) + children in + if residual = [] then Env.validate env else List.iter (fun (_,n) -> on_child n) children ; @@ -375,8 +378,11 @@ let schedule job = let rec process env node = schedule begin fun () -> - let script = Priority.sort (ProofEngine.bound node) in - crawl env (process env) (Some node) script + if ProofEngine.proved node then + ( Env.validate env ; Task.return () ) + else + let script = Priority.sort (ProofEngine.bound node) in + crawl env (process env) (Some node) script end let task diff --git a/src/plugins/wp/cfgWP.ml b/src/plugins/wp/cfgWP.ml index e58d1977ed7cb42caad44cd5aabe3d81ea4e6ce2..7a9212ebaee5782462b178c33633f3b37741d27c 100644 --- a/src/plugins/wp/cfgWP.ml +++ b/src/plugins/wp/cfgWP.ml @@ -1466,7 +1466,7 @@ struct begin Wp_parameters.feedback ~ontty:`Transient "Collecting checks" ; Bag.iter - (fun w -> ignore (Wpo.resolve w)) + (fun w -> ignore (Wpo.reduce w)) !collection ; Lang.F.Check.iter (add_qed_check collection m) ; end diff --git a/src/plugins/wp/prover.ml b/src/plugins/wp/prover.ml index 4de85cbcd9ab13a9ffdbc5ed2c8f883adcdd26d3..bc18054056ee79ce17a0b201df3c98f2e3c78cb5 100644 --- a/src/plugins/wp/prover.ml +++ b/src/plugins/wp/prover.ml @@ -76,7 +76,7 @@ let simplify ?start ?result wpo = VCS.( r.verdict == Valid ) || begin started ?start wpo ; - if resolve wpo then + if Wpo.reduce wpo then let time = qed_time wpo in let res = VCS.result ~time VCS.Valid in (update ?result wpo VCS.Qed res ; true) diff --git a/src/plugins/wp/register.ml b/src/plugins/wp/register.ml index ae5dcd02429cb933efa456d8861aebe6664703c3..dbb0bcfefa3cd1cc8b0ca355235d751a04ea682f 100644 --- a/src/plugins/wp/register.ml +++ b/src/plugins/wp/register.ml @@ -168,10 +168,6 @@ let pp_warnings fmt wpo = | false , _ -> Format.fprintf fmt " (Stronger, %d warnings)" n end -let auto_check = function - | { Wpo.po_formula = Wpo.GoalCheck _ } -> true - | _ -> false - let launch task = let server = ProverTask.server () in (** Do on_server_stop save why3 session *) @@ -359,7 +355,7 @@ let do_wpo_success goal s = end end | Some prover -> - if not (auto_check goal) then + if not (Wpo.is_check goal) then Wp_parameters.feedback ~ontty:`Silent "[%a] Goal %s : Valid" VCS.pp_prover prover (Wpo.get_gid goal) diff --git a/src/plugins/wp/tests/wp_plugin/unroll.i b/src/plugins/wp/tests/wp_plugin/unroll.i index dd79473b668aa1805dba478d721bcfe5552c158e..5ac917b0ddb23b34e0df8188e75e75a800e4a895 100644 --- a/src/plugins/wp/tests/wp_plugin/unroll.i +++ b/src/plugins/wp/tests/wp_plugin/unroll.i @@ -1,5 +1,5 @@ /* run.config - OPT: -ulevel=1 -wp -wp-prop=@ensures -wp-prover script -session tests/wp_plugin/unroll + OPT: -ulevel=1 -wp -wp-prop=@ensures -wp-prover script -session tests/wp_plugin/unroll -wp-msg-key no-time-info,no-step-info */ /* run.config_qualif diff --git a/src/plugins/wp/wpo.ml b/src/plugins/wp/wpo.ml index 8a20407e53338db5485ec741ba9092b980ec6bbe..b4ff5124a5c54d708891290a466c0566b4c08f0f 100644 --- a/src/plugins/wp/wpo.ml +++ b/src/plugins/wp/wpo.ml @@ -805,11 +805,19 @@ let is_trivial g = | GoalAnnot vc -> VC_Annot.is_trivial vc | GoalCheck _ -> false -let resolve g = + +let reduce g = match g.po_formula with - | GoalAnnot vc -> Model.with_model g.po_model VC_Annot.resolve vc - | GoalLemma vc -> Model.with_model g.po_model VC_Lemma.is_trivial vc | GoalCheck _ -> false + | GoalLemma vc -> Model.with_model g.po_model VC_Lemma.is_trivial vc + | GoalAnnot vc -> Model.with_model g.po_model VC_Annot.resolve vc + +let resolve g = + let valid = reduce g in + if valid then + ( let solver = qed_time g in + set_result g VCS.Qed (VCS.result ~solver VCS.Valid) ) ; + valid let compute g = match g.po_formula with diff --git a/src/plugins/wp/wpo.mli b/src/plugins/wp/wpo.mli index 9413c844b02e32eb94e06c950d0af43196378001..ffe0871674f0f168c3d62bae4c5d4a78d1960e0b 100644 --- a/src/plugins/wp/wpo.mli +++ b/src/plugins/wp/wpo.mli @@ -157,7 +157,8 @@ val on_remove : (t -> unit) -> unit val add : t -> unit val age : t -> int (* generation *) -val resolve : t -> bool (** tries simplification *) +val reduce : t -> bool (** tries simplification *) +val resolve : t -> bool (** tries simplification and set result if valid *) val set_result : t -> prover -> result -> unit val clear_results : t -> unit