diff --git a/src/libraries/utils/command.ml b/src/libraries/utils/command.ml index 22ab26bbb6a8c694c5244c66eb5762068ce9e68d..6f832d3856bae523423ff0f8e9c1d192c200f97c 100644 --- a/src/libraries/utils/command.ml +++ b/src/libraries/utils/command.ml @@ -111,21 +111,23 @@ let print_file file job = (* -------------------------------------------------------------------------- *) type timer = float ref -type 'a result = Result of 'a | Error of exn let dt_max tm dt = match tm with Some r when dt > !r -> r := dt | _ -> () let dt_add tm dt = match tm with Some r -> r := !r +. dt | _ -> () -let return = function Result x -> x | Error e -> raise e -let catch f x = try Result(f x) with e -> Error e let time ?rmax ?radd job data = - begin - let t0 = Sys.time () in - let re = catch job data in + let t0 = Sys.time () in + try + let result = job data in let t1 = Sys.time () in let dt = t1 -. t0 in dt_max rmax dt ; dt_add radd dt ; - return re ; - end + result + with exn -> + let t1 = Sys.time () in + let dt = t1 -. t0 in + dt_max rmax dt ; + dt_add radd dt ; + raise exn (* -------------------------------------------------------------------------- *) (* --- Process --- *) diff --git a/src/libraries/utils/command.mli b/src/libraries/utils/command.mli index 0643c00007d54479b2fbf20d7b197be26bb72232..676bccd9d2ba57bc27f4ac599d39c63632db72fe 100644 --- a/src/libraries/utils/command.mli +++ b/src/libraries/utils/command.mli @@ -62,9 +62,7 @@ val print_file : string -> (Format.formatter -> 'a) -> 'a (* ************************************************************************* *) type timer = float ref -type 'a result = Result of 'a | Error of exn -val catch : ('a -> 'b) -> 'a -> 'b result -val return : 'a result -> 'a + val time : ?rmax:timer -> ?radd:timer -> ('a -> 'b) -> 'a -> 'b (** Compute the elapsed time with [Sys.time]. The [rmax] timer is maximized and the [radd] timer is cumulated. diff --git a/src/libraries/utils/task.ml b/src/libraries/utils/task.ml index 164a847defba67d1c9dbdbe964127a9f570c01fb..b3312aa812ac6a6f7871fff4ce9e21a350e25c8c 100644 --- a/src/libraries/utils/task.ml +++ b/src/libraries/utils/task.ml @@ -469,7 +469,7 @@ let schedule server q = done with Queue.Empty -> () -let rec run_server server () = +let server_progress server () = begin server.running <- List.filter (fun task -> @@ -479,30 +479,29 @@ let rec run_server server () = server.terminated <- succ server.terminated ; false ) ) server.running ; Array.iter (schedule server) server.queue ; - try - Db.yield (); - fire server.activity ; - if server.running <> [] then - begin - if not server.waiting && is_empty server then - begin - fire server.wait ; - server.waiting <- true ; - end ; - true - end - else - begin - fire server.stop ; - server.scheduled <- 0 ; - server.terminated <- 0 ; - false - end - with _ -> (* Db.Cancel ... *) - cancel_all server ; - run_server server () + let () = + try Db.yield () + with Db.Cancel -> cancel_all server + in + fire server.activity ; + if server.running <> [] then + begin + if not server.waiting && is_empty server then + begin + fire server.wait ; + server.waiting <- true ; + end ; + true + end + else + begin + fire server.stop ; + server.scheduled <- 0 ; + server.terminated <- 0 ; + false + end end let launch server = if server.scheduled > server.terminated - then ( fire server.start ; !on_idle (run_server server) ) + then ( fire server.start ; !on_idle (server_progress server) ) diff --git a/src/plugins/qed/term.ml b/src/plugins/qed/term.ml index bc8331ad3c9efd8c9fa18a649cf7e98f0ff840a8..a2ce1c72e39a2115017d7b4a0619014144b8abe7 100644 --- a/src/plugins/qed/term.ml +++ b/src/plugins/qed/term.ml @@ -2239,8 +2239,10 @@ struct let fresh sigma t = fresh sigma.pool t let call f e = - let v = f e in - validate "Qed.Subst.add_fun" v ; v + if lc_closed e then + let v = f e in + validate "Qed.Subst.add_fun" v ; v + else raise Not_found let rec compute e = function | EMPTY -> raise Not_found diff --git a/src/plugins/wp/Footprint.ml b/src/plugins/wp/Footprint.ml index a05d0d02ad71ef611b02cd661930c1f72b044c42..0198e11baab73ddf075ac879d968a21867a0e00a 100644 --- a/src/plugins/wp/Footprint.ml +++ b/src/plugins/wp/Footprint.ml @@ -31,7 +31,8 @@ let iter f e = Queue.add e q ; while not (Queue.is_empty q) do let e = Queue.pop q in - f e ; F.lc_iter (fun e -> Queue.push e q) e + if F.lc_closed e then f e ; + F.lc_iter (fun e -> Queue.push e q) e done let once f e = @@ -42,7 +43,8 @@ let once f e = Queue.add e q ; while not (Queue.is_empty q) do let e = Queue.pop q in - f e ; F.lc_iter (fun e -> if once m e then Queue.push e q) e + if F.lc_closed e then f e ; + F.lc_iter (fun e -> if once m e then Queue.push e q) e done (* -------------------------------------------------------------------------- *) @@ -151,3 +153,5 @@ let lookup ~occur ~inside = ) inside ; raise Not_found with Found e -> e + +(* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/Footprint.mli b/src/plugins/wp/Footprint.mli index 868824c83bf007b4a8db215e4e4ae77519e76d87..9e2e9a739a4c629dd7af9e0d3ef293b7de53281d 100644 --- a/src/plugins/wp/Footprint.mli +++ b/src/plugins/wp/Footprint.mli @@ -49,3 +49,5 @@ val locate : select:term -> inside:term -> occurrence (** Retrieve back the [k]-th occurrence of a footprint inside a term. *) val lookup : occur:occurrence -> inside:term -> term + +(* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/ProverScript.ml b/src/plugins/wp/ProverScript.ml index 06edf050db3ce0ce5336420e15c4eed6971fce93..8bdd69c1a1ece481b844ab55a24304c804267634 100644 --- a/src/plugins/wp/ProverScript.ml +++ b/src/plugins/wp/ProverScript.ml @@ -312,6 +312,20 @@ and autofork env ~depth fork = else ( Env.validate env ; Task.return true ) +(* -------------------------------------------------------------------------- *) +(* --- Apply Script Tactic --- *) +(* -------------------------------------------------------------------------- *) + +let apply env node jtactic subscripts = + match jfork (Env.tree env) ?node jtactic with + | None -> failwith "Selector not found" + | Some fork -> + let _,children = ProofEngine.commit fork in + reconcile children subscripts ; (*TODO: saveback forgiven script ? *) + List.filter + (fun (_,node) -> not (ProofEngine.proved node)) + children + (* -------------------------------------------------------------------------- *) (* --- Script Crawling --- *) (* -------------------------------------------------------------------------- *) @@ -348,30 +362,26 @@ let rec crawl env on_child node = function | Tactic( _ , jtactic , subscripts ) :: alternative -> begin - match jfork (Env.tree env) ?node jtactic with - | None -> - Wp_parameters.warning - "Script Error: on goal %a@\n\ - can not apply '%s'@\n\ - @[<hov 2>Params: %a@]@\n\ - @[<hov 2>Select: %a@]@." - WpPropId.pretty (Env.goal env node).po_pid - jtactic.tactic - Json.pp jtactic.params - Json.pp jtactic.select ; - crawl env on_child node alternative - | Some fork -> - (*TODO: saveback forgiven script *) - let _,children = ProofEngine.commit fork in - reconcile children subscripts ; - 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 ; - Task.return () + try + let residual = apply env node jtactic subscripts in + if residual = [] then + Env.validate env + else + List.iter (fun (_,n) -> on_child n) residual ; + Task.return () + with exn when Wp_parameters.protect exn -> + Wp_parameters.warning + "Script Error: on goal %a@\n\ + can not apply '%s'@\n\ + exception %S@\n\ + @[<hov 2>Params: %a@]@\n\ + @[<hov 2>Select: %a@]@." + WpPropId.pretty (Env.goal env node).po_pid + jtactic.tactic + (Printexc.to_string exn) + Json.pp jtactic.params + Json.pp jtactic.select ; + crawl env on_child node alternative end (* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/prover.ml b/src/plugins/wp/prover.ml index 45bd15f9cb42fc358617c41bbd8378979d3d690a..87fc5241966e3870a413dad3411aded9eb3e430a 100644 --- a/src/plugins/wp/prover.ml +++ b/src/plugins/wp/prover.ml @@ -121,7 +121,15 @@ let spawn wpo ~delayed prover , task ) provers) else - let process = simplify ?start ?result wpo in + let process = simplify ?start ?result wpo >>= fun ok -> + begin + match success with + | None -> () + | Some on_success -> + on_success wpo (if ok then Some VCS.Qed else None) ; + end ; + Task.return () + in let thread = Task.thread process in let server = ProverTask.server () in Task.spawn server ?pool thread diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And.json index 7e4bcea281b188bdcd20a782ff6423032d5941ec..260f73c47cb6ee354cdba05c71dfc9460a83c76a 100644 --- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And.json +++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And.json @@ -1,24 +1,6 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, +[ { "prover": "script", "verdict": "unknown" }, + { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1,i_2:int.\n(P_P1 i_0) /\\ (P_Q1 i_2) /\\ (P_P2 i_1 i_2)\n/\\ (exists i_3:int.\n (P_Q2 i_0 i_3))", - "pattern": "\\E\\E\\E&P_P1P_Q1P_P2\\E#3#1#2#1P_Q2" }, - "children": { "Goal 1/2": [ { "prover": "alt-ergo", "verdict": "unknown", - "time": 0.0511159896851 }, - { "header": "NOP", "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int. (P_Q1 i_0) /\\ (P_P2 i_1 i_0)", - "pattern": "\\E\\E&P_Q1P_P2#1#0#1" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0514709949493 } ] } } ], - "Goal 2/2": [ { "prover": "alt-ergo", "verdict": "unknown", - "time": 0.0521941184998 }, - { "header": "NOP", "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0:int. (P_P1 i_0) /\\ (exists i_1:int.\n (P_Q2 i_0 i_1))", - "pattern": "\\E&P_P1\\E#1P_Q2#1#0" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0515058040619 } ] } } ] } } ] + "pattern": "\\E" }, + "children": { "Goal 1/2": [], "Goal 2/2": [] } } ] diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And_bis.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And_bis.json index a908ac4adb3e577d040a3f24b4c6f0f06f56c053..212235b3fe925038ba1a99ed6b4ec08e7d3a6951 100644 --- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And_bis.json +++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And_bis.json @@ -1,34 +1,6 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, +[ { "prover": "script", "verdict": "unknown" }, + { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1,i_2,i_3:int.\n(P_Q1 1) /\\ (P_P2 i_0 i_1) /\\ (P_R2 i_1 i_2)\n/\\ (exists i_4:int.\n (P_Q2 i_3 i_4))", - "pattern": "\\E\\E\\E\\E&P_Q1P_P2P_R2\\E1#4#3#3#2" }, - "children": { "Goal 1/3": [ { "prover": "alt-ergo", "verdict": "unknown", - "time": 0.0512578487396 }, - { "header": "NOP", "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int. (P_Q2 i_0 i_1)", - "pattern": "\\E\\EP_Q2#1#0" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0515179634094 } ] } } ], - "Goal 2/3": [ { "prover": "alt-ergo", "verdict": "unknown", - "time": 0.0517938137054 }, - { "header": "NOP", "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1,i_2:int. (P_P2 i_2 i_1) /\\ (P_R2 i_1 i_0)", - "pattern": "\\E\\E\\E&P_P2P_R2#0#1#1#2" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0515098571777 } ] } } ], - "Goal 3/3": [ { "prover": "alt-ergo", "verdict": "unknown", - "time": 0.0528788566589 }, - { "header": "NOP", "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-goal", - "target": "(P_Q1 1)", - "pattern": "P_Q11" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0515050888062 } ] } } ] } } ] + "pattern": "\\EP_Q11" }, + "children": { "Goal 1/3": [], "Goal 2/3": [], "Goal 3/3": [] } } ] diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_Or.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_Or.json index db3e60070bdd86a16f0ee3e96303a5cbe6c4c2d6..c70dddec42c798d67d2e64caedcd77123e5f7e9c 100644 --- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_Or.json +++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_Or.json @@ -1,16 +1,6 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1,i_2:int.\n(P_Q1 1) \\/ (P_P1 i_0) \\/ (P_P2 i_1 i_2) \\/ (exists i_3:int.\n (P_Q2 i_0 i_3))", - "pattern": "\\E\\E\\E|P_Q1P_P1P_P2\\E1#3#2#1P_Q2" }, - "children": { "Distrib (exists or)": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0515348911285 }, - { "header": "NOP", - "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-goal", - "target": "(P_Q1 1) \\/ (exists i_0:int.\n (P_P1 i_0)) \\/ (exists i_0,i_1:int.\n (P_P2 i_1 i_0))\n\\/ (exists i_0,i_1:int.\n (P_Q2 i_0 i_1))", - "pattern": "|P_Q1\\E\\E\\E1P_P1\\E\\E#0P_P2P_Q2#0" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0513439178467 } ] } } ] } } ] + "pattern": "\\EP_Q11" }, + "children": { "Split": [ { "prover": "Alt-Ergo:2.2.0", + "verdict": "unknown" } ] } } ] diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_And.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_And.json index bb1f7b0cb5bf7ff1d2360fa531444508b977cf6d..5a6e83f45232bf50cfe1b17f56085bb45f633852 100644 --- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_And.json +++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_And.json @@ -1,18 +1,6 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, +[ { "prover": "script", "verdict": "unknown" }, + { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-step", "at": 0, "kind": "have", "target": "forall i_0,i_1,i_2:int.\n(P_Q1 1) /\\ (P_P1 i_0) /\\ (P_P2 i_1 i_2) /\\ (forall i_3:int.\n (P_Q2 i_0 i_3))", - "pattern": "\\F\\F\\F&P_Q1P_P1P_P2\\F1#3#2#1P_Q2" }, - "children": { "Distrib (forall and)": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.051558971405 }, - { "header": "NOP", - "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-step", - "at": 0, - "kind": "have", - "target": "(P_Q1 1) /\\ (forall i_0:int.\n (P_P1 i_0)) /\\ (forall i_0,i_1:int.\n (P_P2 i_1 i_0))\n/\\ (forall i_0,i_1:int.\n (P_Q2 i_0 i_1))", - "pattern": "&P_Q1\\F\\F\\F1P_P1\\F\\F#0P_P2P_Q2#0" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0513830184937 } ] } } ] } } ] + "pattern": "\\FP_Q11" }, + "children": { "Split (distrib forall and)": [] } } ] diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_Or_bis.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_Or_bis.json index 815a03e3dd65c3515a850fd69d37fe3eb51ae0cf..43bb875d32ba27e9ab410917a1c9789f632d467d 100644 --- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_Or_bis.json +++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_Or_bis.json @@ -1,37 +1,6 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, +[ { "prover": "script", "verdict": "unknown" }, + { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-step", "at": 0, "kind": "have", "target": "forall i_0,i_1,i_2,i_3:int.\n(P_Q1 1) \\/ (P_P2 i_0 i_1) \\/ (P_R2 i_1 i_2)\n\\/ (forall i_4:int.\n (P_Q2 i_3 i_4))", - "pattern": "\\F\\F\\F\\F|P_Q1P_P2P_R2\\F1#4#3#3#2" }, - "children": { "Goal 1/3": [ { "prover": "alt-ergo", "verdict": "unknown", - "time": 0.0511250495911 }, - { "header": "NOP", "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-step", - "at": 0, "kind": "have", - "target": "forall i_0,i_1:int. (P_Q2 i_0 i_1)", - "pattern": "\\F\\FP_Q2#1#0" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0515208244324 } ] } } ], - "Goal 2/3": [ { "prover": "alt-ergo", "verdict": "unknown", - "time": 0.0517539978027 }, - { "header": "NOP", "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-step", - "at": 0, "kind": "have", - "target": "forall i_0,i_1,i_2:int. (P_P2 i_2 i_1) \\/ (P_R2 i_1 i_0)", - "pattern": "\\F\\F\\F|P_P2P_R2#0#1#1#2" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.0515398979187 } ] } } ], - "Goal 3/3": [ { "prover": "alt-ergo", "verdict": "unknown", - "time": 0.0528609752655 }, - { "header": "NOP", "tactic": "Wp.Test.NOP", - "params": {}, - "select": { "select": "clause-step", - "at": 0, "kind": "have", - "target": "(P_Q1 1)", - "pattern": "P_Q11" }, - "children": { "Nop": [ { "prover": "alt-ergo", - "verdict": "unknown", - "time": 0.051561832428 } ] } } ] } } ] + "pattern": "\\FP_Q11" }, + "children": { "Goal 1/3": [], "Goal 2/3": [], "Goal 3/3": [] } } ] diff --git a/src/plugins/wp/tests/wp_tip/tac_split_quantifiers.i b/src/plugins/wp/tests/wp_tip/tac_split_quantifiers.i index 7d6f12f66d12dcc3006b3c17fb5bc2a54bbc3c66..119e483c91cbac96b94d8683183e2192941cf7a6 100644 --- a/src/plugins/wp/tests/wp_tip/tac_split_quantifiers.i +++ b/src/plugins/wp/tests/wp_tip/tac_split_quantifiers.i @@ -17,7 +17,7 @@ predicate R2(integer a1, integer a2) reads \nothing ; } */ -/*@ ensures Goal_Exist_Or: +/*@ ensures Goal_Exist_Or: (\exists integer a, b, c ; P1(a) || P2(b, c) || Q1(1) || \exists integer d ; Q2(a,d)) ; @@ -29,7 +29,7 @@ (\exists integer a, b, c, d ; P2(a, b) && R2(b, c) && Q1(1) && \exists integer e ; Q2(d,e)) ; - @ ensures Hyp_Forall_And: + @ ensures Hyp_Forall_And: (\forall integer a, b, c ; P1(a) && P2(b, c) && Q1(1) && \forall integer d ; Q2(a,d) ) ==> diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json index a5f8a971b9f1229e8509d038e8f7451dafdfa9f7..e2661ac0ea5be08409c69084618d3cb685876c18 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_136) /\\ (i_1<=i_137) /\\ (0<=i_0) /\\ (i_136<=i_0) /\\ (i_137<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.017, "steps": 22 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json index a5f8a971b9f1229e8509d038e8f7451dafdfa9f7..e2661ac0ea5be08409c69084618d3cb685876c18 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_136) /\\ (i_1<=i_137) /\\ (0<=i_0) /\\ (i_136<=i_0) /\\ (i_137<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.017, "steps": 22 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json index 1a1c4c0451c01821da44f4cd61861b8ebeee4f02..a9310f3d13966a1a1a987551a3cfb57c72a1e8cd 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_9) /\\ (i_1<=i_10) /\\ (0<=i_0) /\\ (i_9<=i_0) /\\ (i_10<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.0236, "steps": 41 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json index 398a69be748b427406223332d1c8447708dc51e1..a5b7496b8bcac1057fc2ee1bfc1baa80fad18099 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_1,i_2:int.\n(i_1<=i_0) /\\ (i_2<=i_3) /\\ (0<=i_1) /\\ (i_0<=i_1) /\\ (i_3<=i_2) /\\ (i_1<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.018, "steps": 29 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json index d7d87cb0431b99609b2b733ee68bb9ac2cdc04e6..2ee61e01ef268896d390d325575ef4051af1088e 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_156) /\\ (i_1<=i_157) /\\ (0<=i_0) /\\ (i_156<=i_0) /\\ (i_157<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.011, "steps": 16 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json index 9927a473006bfd0846ae22f978f724ca10e5e553..6defa5bcd74401f918dc86a7cc117daec22e3cc0 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_13) /\\ (i_1<=i_14) /\\ (0<=i_0) /\\ (i_13<=i_0) /\\ (i_14<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.0177, "steps": 40 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json index e43bf2a0c07c931be6a637bc59d7981d08afa12f..07c88e21be0523b36d4e4beb3bc08582fc5171d3 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_2:int.\n(i_0<=i_1) /\\ (0<=i_0) /\\ (i_1<=i_0) /\\ (j_0<=i_2) /\\ (i_2<=j_0) /\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i0#1$i#1$j#0" }, + "pattern": "\\E$i0$i$j$j9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.0154, "steps": 24 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json index 8138f144480b3491b3bd4e0ba6074c5cd9988c62..6f266473c3da74f3125a63e16abeffe0f28b841c 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_21) /\\ (i_1<=i_22) /\\ (0<=i_0) /\\ (i_21<=i_0) /\\ (i_22<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.0167, "steps": 33 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json index c110027873b58604a7e9b1f4add93925e424cd1f..33301d71a33e5ae00a155943d5cecf22939281b0 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_8) /\\ (i_1<=i_9) /\\ (0<=i_0) /\\ (i_8<=i_0) /\\ (i_9<=i_1) /\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.0167, "steps": 33 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json index 2f0e9f12c125589ccbe9b513e6c1145d72b89497..cb380dd3e39f3d5b41787e5481e2eb7b62264873 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_148) /\\ (i_1<=i_149) /\\ (0<=i_0) /\\ (i_148<=i_0) /\\ (i_149<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.011, "steps": 16 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json index 0f331f4933d265794ca3c72277892cdaeef876be..a9966d41d85a805900702002ac776ddb4a8b2853 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_13) /\\ (i_1<=i_14) /\\ (0<=i_0) /\\ (i_13<=i_0) /\\ (i_14<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.0196, "steps": 39 } ], diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json index 9fc6a77f392331e6771b07d65d55ebfb62b84ae8..0be615900200669f51459d70bcd89d583f0a82b8 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json @@ -1,7 +1,7 @@ [ { "header": "Split", "tactic": "Wp.split", "params": {}, "select": { "select": "clause-goal", "target": "exists i_0,i_1:int.\n(i_0<=i_4) /\\ (i_1<=i_6) /\\ (0<=i_0) /\\ (i_4<=i_0) /\\ (i_6<=i_1) /\\ (i_0<=9)", - "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" }, + "pattern": "\\E$i$i0$i$i9" }, "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid", "time": 0.0152, "steps": 27 } ], diff --git a/src/plugins/wp/wp_parameters.ml b/src/plugins/wp/wp_parameters.ml index 94f5b8131ffe76c1ea358b39e5130bc4b1088a3f..9335161d010553d664de54516270ead945483112 100644 --- a/src/plugins/wp/wp_parameters.ml +++ b/src/plugins/wp/wp_parameters.ml @@ -1239,3 +1239,13 @@ let print_generated ?header file = end (* -------------------------------------------------------------------------- *) +(* --- Debugging --- *) +(* -------------------------------------------------------------------------- *) + +let protect e = + if debug_atleast 1 then false else + match e with + | Db.Cancel | Log.AbortError _ | Log.AbortFatal _ -> false + | _ -> true + +(* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/wp_parameters.mli b/src/plugins/wp/wp_parameters.mli index a37b5e895a7470f21a738e3c69a5c15dc9566796..97392faa580e3f4b36d686429ba3eb7b53c90c1d 100644 --- a/src/plugins/wp/wp_parameters.mli +++ b/src/plugins/wp/wp_parameters.mli @@ -175,3 +175,5 @@ val print_generated: ?header:string -> string -> unit (** print the given file if the debugging category "print-generated" is set *) val cat_print_generated: category + +val protect : exn -> bool diff --git a/src/plugins/wp/wpo.ml b/src/plugins/wp/wpo.ml index a36b16398193812618864a7ab292f6d1d012b751..e5459e75b894fda2a88fd783408471bef27d773b 100644 --- a/src/plugins/wp/wpo.ml +++ b/src/plugins/wp/wpo.ml @@ -190,7 +190,14 @@ struct let is_trivial g = Conditions.is_trivial g.sequent - let apply phi g = g.sequent <- phi g.sequent + let apply option phi g = + try g.sequent <- phi g.sequent + with exn when Wp_parameters.protect exn -> + Wp_parameters.warning ~current:false ~once:true + "Goal simplification aborted (%s):@\n\ + Exception %S@\n\ + Re-run with debug level 1+ for details." + option (Printexc.to_string exn) let default_simplifiers = [ Wp_parameters.SimplifyIsCint.get, Cint.is_cint_simplifier ; @@ -200,23 +207,23 @@ struct let preprocess g = if Wp_parameters.Let.get () then begin - apply Conditions.introduction_eq g ; + apply "introcution" Conditions.introduction_eq g ; let fold acc (get,solver) = if get () then solver::acc else acc in let solvers = List.fold_left fold [] default_simplifiers in - apply (Conditions.simplify ~solvers) g ; + apply "-wp-simplify-*" (Conditions.simplify ~solvers) g ; if Wp_parameters.FilterInit.get () - then apply Conditions.init_filter g ; + then apply "-wp-filter-init" Conditions.init_filter g ; if Wp_parameters.Prune.get () - then apply (Conditions.pruning ~solvers) g ; + then apply "-wp-pruning" (Conditions.pruning ~solvers) g ; if Wp_parameters.Filter.get () - then apply Conditions.filter g ; + then apply "-wp-filter" Conditions.filter g ; if Wp_parameters.Parasite.get () - then apply Conditions.parasite g ; + then apply "-wp-parasite" Conditions.parasite g ; end else begin if Wp_parameters.Clean.get () - then apply Conditions.clean g ; + then apply "-wp-clean" Conditions.clean g ; end ; if Conditions.is_trivial g.sequent then g.sequent <- Conditions.trivial ;