From ea4a727a608ccb9f15c08a2e8c4403016bb52143 Mon Sep 17 00:00:00 2001 From: Claude Marche <Claude.Marche@inria.fr> Date: Thu, 19 Mar 2015 15:52:43 +0100 Subject: [PATCH] fix session --- drivers/smt-libv2.drv | 2 +- ...stPath_WP_parameter_shortest_path_code_2.v | 8 +- ...stPath_WP_parameter_shortest_path_code_3.v | 221 +++++++++--------- examples/dijkstra/why3session.xml | 4 +- 4 files changed, 117 insertions(+), 118 deletions(-) diff --git a/drivers/smt-libv2.drv b/drivers/smt-libv2.drv index 4a6c55be65..94776df2e9 100644 --- a/drivers/smt-libv2.drv +++ b/drivers/smt-libv2.drv @@ -6,7 +6,7 @@ printer "smtv2" filename "%f-%t-%g.smt2" unknown "^\\(unknown\\|sat\\|Fail\\)" "" outofmemory "^(error \".*out of memory\")\\|Cannot allocate memory" -fail "^(error \"\\(W\\(A\\(R\\(N\\(I\\(N[^G]\\|[^N]\\)\\|[^I]\\)\\|[^N]\\)\\|[^R]\\)\\|[^A]\\)\\|[^W]\\)\\(.*\\)\")" "Error: \1" +fail "^(error \"\\(W\\(A\\(R\\(N\\(I\\(N[^G]\\|[^N]\\)\\|[^I]\\)\\|[^N]\\)\\|[^R]\\)\\|[^A]\\)\\|[^W]\\)\\(.*\\)\")" "Error: \\1" timeout "interrupted by timeout" time "why3cpulimit time : %s s" valid "^unsat" diff --git a/examples/dijkstra/dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_2.v b/examples/dijkstra/dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_2.v index 6b3761dc20..fa8e8b9303 100644 --- a/examples/dijkstra/dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_2.v +++ b/examples/dijkstra/dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_2.v @@ -203,8 +203,11 @@ Definition inv_succ2 (src:vertex) (s:(set vertex)) (q:(set vertex)) ((map.Map.get d y) <= ((map.Map.get d x) + (weight x y))%Z)%Z)). Require Import Why3. +Ltac ae := why3 "Alt-Ergo,0.99.1," timelimit 5. +(* Ltac ae0952 := why3 "Alt-Ergo,0.95.2," timelimit 3. Ltac z3 := why3 "z3" timelimit 3. +*) (* Why3 goal *) Theorem WP_parameter_shortest_path_code : forall (src:vertex) (dst:vertex), @@ -266,8 +269,8 @@ intros src dst d (h1,h2) q d1 visited ((h3,h4),h5) q1 d2 visited1 ((h24,(h25,(h26,(h27,(h28,(h29,(h30,(h31,h32)))))))),h33) result h34 h35 h36 su1 v1 (h37,h38) q4 d4 h39 v2 h40. *) -intuition; try ae0952. (* note Alt-Ergo 0.99.1 solves all ! *) - +intuition; try ae. +(* destruct (why_decidable_eq v2 v1) as [case|case]. subst v2 d4; rewrite Map.Select_eq. apply Path_cons. @@ -285,5 +288,6 @@ z3. ae0952. trivial. ae0952. +*) Qed. diff --git a/examples/dijkstra/dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_3.v b/examples/dijkstra/dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_3.v index fffb6381bf..10d64143e7 100644 --- a/examples/dijkstra/dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_3.v +++ b/examples/dijkstra/dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_3.v @@ -1,4 +1,4 @@ -(* This file is generated by Why3's Coq 8.4 driver *) +(* This file is generated by Why3's Coq driver *) (* Beware! Only edit allowed sections below *) Require Import BuiltIn. Require BuiltIn. @@ -8,135 +8,133 @@ Require map.Map. (* Why3 assumption *) Definition unit := unit. +Axiom qtmark : Type. +Parameter qtmark_WhyType : WhyType qtmark. +Existing Instance qtmark_WhyType. + (* Why3 assumption *) -Inductive ref (a:Type) {a_WT:WhyType a} := +Inductive ref (a:Type) := | mk_ref : a -> ref a. Axiom ref_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (ref a). Existing Instance ref_WhyType. -Implicit Arguments mk_ref [[a] [a_WT]]. +Implicit Arguments mk_ref [[a]]. (* Why3 assumption *) -Definition contents {a:Type} {a_WT:WhyType a} (v:(@ref a a_WT)): a := +Definition contents {a:Type} {a_WT:WhyType a} (v:(ref a)): a := match v with | (mk_ref x) => x end. -Axiom set : forall (a:Type) {a_WT:WhyType a}, Type. +Axiom set : forall (a:Type), Type. Parameter set_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (set a). Existing Instance set_WhyType. -Parameter mem: forall {a:Type} {a_WT:WhyType a}, a -> (@set a a_WT) -> Prop. +Parameter mem: forall {a:Type} {a_WT:WhyType a}, a -> (set a) -> Prop. (* Why3 assumption *) -Definition infix_eqeq {a:Type} {a_WT:WhyType a} (s1:(@set a a_WT)) (s2:(@set - a a_WT)): Prop := forall (x:a), (mem x s1) <-> (mem x s2). +Definition infix_eqeq {a:Type} {a_WT:WhyType a} (s1:(set a)) (s2:(set + a)): Prop := forall (x:a), (mem x s1) <-> (mem x s2). -Axiom extensionality : forall {a:Type} {a_WT:WhyType a}, forall (s1:(@set - a a_WT)) (s2:(@set a a_WT)), (infix_eqeq s1 s2) -> (s1 = s2). +Axiom extensionality : forall {a:Type} {a_WT:WhyType a}, forall (s1:(set a)) + (s2:(set a)), (infix_eqeq s1 s2) -> (s1 = s2). (* Why3 assumption *) -Definition subset {a:Type} {a_WT:WhyType a} (s1:(@set a a_WT)) (s2:(@set - a a_WT)): Prop := forall (x:a), (mem x s1) -> (mem x s2). +Definition subset {a:Type} {a_WT:WhyType a} (s1:(set a)) (s2:(set + a)): Prop := forall (x:a), (mem x s1) -> (mem x s2). -Axiom subset_refl : forall {a:Type} {a_WT:WhyType a}, forall (s:(@set - a a_WT)), (subset s s). +Axiom subset_refl : forall {a:Type} {a_WT:WhyType a}, forall (s:(set a)), + (subset s s). -Axiom subset_trans : forall {a:Type} {a_WT:WhyType a}, forall (s1:(@set - a a_WT)) (s2:(@set a a_WT)) (s3:(@set a a_WT)), (subset s1 s2) -> ((subset - s2 s3) -> (subset s1 s3)). +Axiom subset_trans : forall {a:Type} {a_WT:WhyType a}, forall (s1:(set a)) + (s2:(set a)) (s3:(set a)), (subset s1 s2) -> ((subset s2 s3) -> (subset s1 + s3)). -Parameter empty: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT). +Parameter empty: forall {a:Type} {a_WT:WhyType a}, (set a). (* Why3 assumption *) -Definition is_empty {a:Type} {a_WT:WhyType a} (s:(@set a a_WT)): Prop := +Definition is_empty {a:Type} {a_WT:WhyType a} (s:(set a)): Prop := forall (x:a), ~ (mem x s). -Axiom empty_def1 : forall {a:Type} {a_WT:WhyType a}, (is_empty (empty :(@set - a a_WT))). +Axiom empty_def1 : forall {a:Type} {a_WT:WhyType a}, (is_empty (empty : (set + a))). Axiom mem_empty : forall {a:Type} {a_WT:WhyType a}, forall (x:a), ~ (mem x - (empty :(@set a a_WT))). + (empty : (set a))). -Parameter add: forall {a:Type} {a_WT:WhyType a}, a -> (@set a a_WT) -> (@set - a a_WT). +Parameter add: forall {a:Type} {a_WT:WhyType a}, a -> (set a) -> (set a). Axiom add_def1 : forall {a:Type} {a_WT:WhyType a}, forall (x:a) (y:a), - forall (s:(@set a a_WT)), (mem x (add y s)) <-> ((x = y) \/ (mem x s)). + forall (s:(set a)), (mem x (add y s)) <-> ((x = y) \/ (mem x s)). -Parameter remove: forall {a:Type} {a_WT:WhyType a}, a -> (@set a a_WT) -> - (@set a a_WT). +Parameter remove: forall {a:Type} {a_WT:WhyType a}, a -> (set a) -> (set a). Axiom remove_def1 : forall {a:Type} {a_WT:WhyType a}, forall (x:a) (y:a) - (s:(@set a a_WT)), (mem x (remove y s)) <-> ((~ (x = y)) /\ (mem x s)). + (s:(set a)), (mem x (remove y s)) <-> ((~ (x = y)) /\ (mem x s)). -Axiom add_remove : forall {a:Type} {a_WT:WhyType a}, forall (x:a) (s:(@set - a a_WT)), (mem x s) -> ((add x (remove x s)) = s). +Axiom add_remove : forall {a:Type} {a_WT:WhyType a}, forall (x:a) (s:(set + a)), (mem x s) -> ((add x (remove x s)) = s). -Axiom remove_add : forall {a:Type} {a_WT:WhyType a}, forall (x:a) (s:(@set - a a_WT)), ((remove x (add x s)) = (remove x s)). +Axiom remove_add : forall {a:Type} {a_WT:WhyType a}, forall (x:a) (s:(set + a)), ((remove x (add x s)) = (remove x s)). -Axiom subset_remove : forall {a:Type} {a_WT:WhyType a}, forall (x:a) (s:(@set - a a_WT)), (subset (remove x s) s). +Axiom subset_remove : forall {a:Type} {a_WT:WhyType a}, forall (x:a) (s:(set + a)), (subset (remove x s) s). -Parameter union: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT) -> (@set - a a_WT) -> (@set a a_WT). +Parameter union: forall {a:Type} {a_WT:WhyType a}, (set a) -> (set a) -> (set + a). -Axiom union_def1 : forall {a:Type} {a_WT:WhyType a}, forall (s1:(@set - a a_WT)) (s2:(@set a a_WT)) (x:a), (mem x (union s1 s2)) <-> ((mem x s1) \/ - (mem x s2)). +Axiom union_def1 : forall {a:Type} {a_WT:WhyType a}, forall (s1:(set a)) + (s2:(set a)) (x:a), (mem x (union s1 s2)) <-> ((mem x s1) \/ (mem x s2)). -Parameter inter: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT) -> (@set - a a_WT) -> (@set a a_WT). +Parameter inter: forall {a:Type} {a_WT:WhyType a}, (set a) -> (set a) -> (set + a). -Axiom inter_def1 : forall {a:Type} {a_WT:WhyType a}, forall (s1:(@set - a a_WT)) (s2:(@set a a_WT)) (x:a), (mem x (inter s1 s2)) <-> ((mem x s1) /\ - (mem x s2)). +Axiom inter_def1 : forall {a:Type} {a_WT:WhyType a}, forall (s1:(set a)) + (s2:(set a)) (x:a), (mem x (inter s1 s2)) <-> ((mem x s1) /\ (mem x s2)). -Parameter diff: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT) -> (@set - a a_WT) -> (@set a a_WT). +Parameter diff: forall {a:Type} {a_WT:WhyType a}, (set a) -> (set a) -> (set + a). -Axiom diff_def1 : forall {a:Type} {a_WT:WhyType a}, forall (s1:(@set a a_WT)) - (s2:(@set a a_WT)) (x:a), (mem x (diff s1 s2)) <-> ((mem x s1) /\ ~ (mem x - s2)). +Axiom diff_def1 : forall {a:Type} {a_WT:WhyType a}, forall (s1:(set a)) + (s2:(set a)) (x:a), (mem x (diff s1 s2)) <-> ((mem x s1) /\ ~ (mem x s2)). -Axiom subset_diff : forall {a:Type} {a_WT:WhyType a}, forall (s1:(@set - a a_WT)) (s2:(@set a a_WT)), (subset (diff s1 s2) s1). +Axiom subset_diff : forall {a:Type} {a_WT:WhyType a}, forall (s1:(set a)) + (s2:(set a)), (subset (diff s1 s2) s1). -Parameter choose: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT) -> a. +Parameter choose: forall {a:Type} {a_WT:WhyType a}, (set a) -> a. -Axiom choose_def : forall {a:Type} {a_WT:WhyType a}, forall (s:(@set - a a_WT)), (~ (is_empty s)) -> (mem (choose s) s). +Axiom choose_def : forall {a:Type} {a_WT:WhyType a}, forall (s:(set a)), + (~ (is_empty s)) -> (mem (choose s) s). -Parameter cardinal: forall {a:Type} {a_WT:WhyType a}, (@set a a_WT) -> Z. +Parameter cardinal: forall {a:Type} {a_WT:WhyType a}, (set a) -> Z. -Axiom cardinal_nonneg : forall {a:Type} {a_WT:WhyType a}, forall (s:(@set - a a_WT)), (0%Z <= (cardinal s))%Z. +Axiom cardinal_nonneg : forall {a:Type} {a_WT:WhyType a}, forall (s:(set a)), + (0%Z <= (cardinal s))%Z. -Axiom cardinal_empty : forall {a:Type} {a_WT:WhyType a}, forall (s:(@set - a a_WT)), ((cardinal s) = 0%Z) <-> (is_empty s). +Axiom cardinal_empty : forall {a:Type} {a_WT:WhyType a}, forall (s:(set a)), + ((cardinal s) = 0%Z) <-> (is_empty s). Axiom cardinal_add : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - forall (s:(@set a a_WT)), (~ (mem x s)) -> ((cardinal (add x + forall (s:(set a)), (~ (mem x s)) -> ((cardinal (add x s)) = (1%Z + (cardinal s))%Z). Axiom cardinal_remove : forall {a:Type} {a_WT:WhyType a}, forall (x:a), - forall (s:(@set a a_WT)), (mem x s) -> - ((cardinal s) = (1%Z + (cardinal (remove x s)))%Z). + forall (s:(set a)), (mem x s) -> ((cardinal s) = (1%Z + (cardinal (remove x + s)))%Z). -Axiom cardinal_subset : forall {a:Type} {a_WT:WhyType a}, forall (s1:(@set - a a_WT)) (s2:(@set a a_WT)), (subset s1 s2) -> - ((cardinal s1) <= (cardinal s2))%Z. +Axiom cardinal_subset : forall {a:Type} {a_WT:WhyType a}, forall (s1:(set a)) + (s2:(set a)), (subset s1 s2) -> ((cardinal s1) <= (cardinal s2))%Z. -Axiom cardinal1 : forall {a:Type} {a_WT:WhyType a}, forall (s:(@set a a_WT)), +Axiom cardinal1 : forall {a:Type} {a_WT:WhyType a}, forall (s:(set a)), ((cardinal s) = 1%Z) -> forall (x:a), (mem x s) -> (x = (choose s)). Axiom vertex : Type. Parameter vertex_WhyType : WhyType vertex. Existing Instance vertex_WhyType. -Parameter v: (@set vertex vertex_WhyType). +Parameter v: (set vertex). -Parameter g_succ: vertex -> (@set vertex vertex_WhyType). +Parameter g_succ: vertex -> (set vertex). Axiom G_succ_sound : forall (x:vertex), (subset (g_succ x) v). @@ -145,12 +143,12 @@ Parameter weight: vertex -> vertex -> Z. Axiom Weight_nonneg : forall (x:vertex) (y:vertex), (0%Z <= (weight x y))%Z. (* Why3 assumption *) -Definition min (m:vertex) (q:(@set vertex vertex_WhyType)) (d:(@map.Map.map - vertex vertex_WhyType Z _)): Prop := (mem m q) /\ forall (x:vertex), (mem x - q) -> ((map.Map.get d m) <= (map.Map.get d x))%Z. +Definition min (m:vertex) (q:(set vertex)) (d:(map.Map.map vertex + Z)): Prop := (mem m q) /\ forall (x:vertex), (mem x q) -> ((map.Map.get d + m) <= (map.Map.get d x))%Z. (* Why3 assumption *) -Inductive path : vertex -> vertex -> Z -> Prop := +Inductive path: vertex -> vertex -> Z -> Prop := | Path_nil : forall (x:vertex), (path x x 0%Z) | Path_cons : forall (x:vertex) (y:vertex) (z:vertex), forall (d:Z), (path x y d) -> ((mem z (g_succ y)) -> (path x z (d + (weight y z))%Z)). @@ -174,42 +172,38 @@ Axiom Main_lemma : forall (src:vertex) (v1:vertex), forall (d:Z), (path src exists v':vertex, exists d':Z, (shortest_path src v' d') /\ ((mem v1 (g_succ v')) /\ ((d' + (weight v' v1))%Z < d)%Z))). -Axiom Completeness_lemma : forall (s:(@set vertex vertex_WhyType)), - (forall (v1:vertex), (mem v1 s) -> forall (w:vertex), (mem w - (g_succ v1)) -> (mem w s)) -> forall (src:vertex), (mem src s) -> - forall (dst:vertex), forall (d:Z), (path src dst d) -> (mem dst s). +Axiom Completeness_lemma : forall (s:(set vertex)), (forall (v1:vertex), (mem + v1 s) -> forall (w:vertex), (mem w (g_succ v1)) -> (mem w s)) -> + forall (src:vertex), (mem src s) -> forall (dst:vertex), forall (d:Z), + (path src dst d) -> (mem dst s). (* Why3 assumption *) -Definition inv_src (src:vertex) (s:(@set vertex vertex_WhyType)) (q:(@set - vertex vertex_WhyType)): Prop := (mem src s) \/ (mem src q). +Definition inv_src (src:vertex) (s:(set vertex)) (q:(set vertex)): Prop := + (mem src s) \/ (mem src q). (* Why3 assumption *) -Definition inv (src:vertex) (s:(@set vertex vertex_WhyType)) (q:(@set - vertex vertex_WhyType)) (d:(@map.Map.map vertex vertex_WhyType - Z _)): Prop := (inv_src src s q) /\ (((map.Map.get d src) = 0%Z) /\ +Definition inv (src:vertex) (s:(set vertex)) (q:(set vertex)) (d:(map.Map.map + vertex Z)): Prop := (inv_src src s q) /\ (((map.Map.get d src) = 0%Z) /\ ((subset s v) /\ ((subset q v) /\ ((forall (v1:vertex), (mem v1 q) -> ~ (mem v1 s)) /\ ((forall (v1:vertex), (mem v1 s) -> (shortest_path src v1 (map.Map.get d v1))) /\ forall (v1:vertex), (mem v1 q) -> (path src v1 (map.Map.get d v1))))))). (* Why3 assumption *) -Definition inv_succ (src:vertex) (s:(@set vertex vertex_WhyType)) (q:(@set - vertex vertex_WhyType)) (d:(@map.Map.map vertex vertex_WhyType - Z _)): Prop := forall (x:vertex), (mem x s) -> forall (y:vertex), (mem y - (g_succ x)) -> (((mem y s) \/ (mem y q)) /\ ((map.Map.get d - y) <= ((map.Map.get d x) + (weight x y))%Z)%Z). +Definition inv_succ (src:vertex) (s:(set vertex)) (q:(set vertex)) + (d:(map.Map.map vertex Z)): Prop := forall (x:vertex), (mem x s) -> + forall (y:vertex), (mem y (g_succ x)) -> (((mem y s) \/ (mem y q)) /\ + ((map.Map.get d y) <= ((map.Map.get d x) + (weight x y))%Z)%Z). (* Why3 assumption *) -Definition inv_succ2 (src:vertex) (s:(@set vertex vertex_WhyType)) (q:(@set - vertex vertex_WhyType)) (d:(@map.Map.map vertex vertex_WhyType Z _)) - (u:vertex) (su:(@set vertex vertex_WhyType)): Prop := forall (x:vertex), - (mem x s) -> forall (y:vertex), (mem y (g_succ x)) -> (((~ (x = u)) \/ - ((x = u) /\ ~ (mem y su))) -> (((mem y s) \/ (mem y q)) /\ ((map.Map.get d - y) <= ((map.Map.get d x) + (weight x y))%Z)%Z)). +Definition inv_succ2 (src:vertex) (s:(set vertex)) (q:(set vertex)) + (d:(map.Map.map vertex Z)) (u:vertex) (su:(set vertex)): Prop := + forall (x:vertex), (mem x s) -> forall (y:vertex), (mem y (g_succ x)) -> + (((~ (x = u)) \/ ((x = u) /\ ~ (mem y su))) -> (((mem y s) \/ (mem y q)) /\ + ((map.Map.get d y) <= ((map.Map.get d x) + (weight x y))%Z)%Z)). Require Import Why3. -Ltac ae := why3 "alt-ergo" timelimit 3. -Ltac z := why3 "z3" timelimit 3. +Ltac ae := why3 "Alt-Ergo,0.99.1," timelimit 10. Require Import Classical. Lemma inside_or_exit: @@ -235,27 +229,27 @@ Qed. (* Why3 goal *) Theorem WP_parameter_shortest_path_code : forall (src:vertex) (dst:vertex), - forall (d:(@map.Map.map vertex vertex_WhyType Z _)), ((mem src v) /\ (mem - dst v)) -> forall (q:(@set vertex vertex_WhyType)) (d1:(@map.Map.map - vertex vertex_WhyType Z _)) (visited:(@set vertex vertex_WhyType)), - ((is_empty visited) /\ ((q = (add src (empty :(@set - vertex vertex_WhyType)))) /\ (d1 = (map.Map.set d src 0%Z)))) -> - forall (q1:(@set vertex vertex_WhyType)) (d2:(@map.Map.map - vertex vertex_WhyType Z _)) (visited1:(@set vertex vertex_WhyType)), ((inv - src visited1 q1 d2) /\ ((inv_succ src visited1 q1 d2) /\ forall (m:vertex), - (min m q1 d2) -> forall (x:vertex), forall (dx:Z), (path src x dx) -> + forall (d:(map.Map.map vertex Z)), ((mem src v) /\ (mem dst v)) -> + forall (q:(set vertex)) (d1:(map.Map.map vertex Z)) (visited:(set vertex)), + ((is_empty visited) /\ ((q = (add src (empty : (set vertex)))) /\ + (d1 = (map.Map.set d src 0%Z)))) -> forall (q1:(set vertex)) + (d2:(map.Map.map vertex Z)) (visited1:(set vertex)), ((inv src visited1 q1 + d2) /\ ((inv_succ src visited1 q1 d2) /\ forall (m:vertex), (min m q1 + d2) -> forall (x:vertex), forall (dx:Z), (path src x dx) -> ((dx < (map.Map.get d2 m))%Z -> (mem x visited1)))) -> forall (o:bool), ((o = true) <-> (is_empty q1)) -> ((~ (o = true)) -> ((~ (is_empty q1)) -> - forall (q2:(@set vertex vertex_WhyType)), forall (u:vertex), ((min u q1 - d2) /\ (q2 = (remove u q1))) -> ((shortest_path src u (map.Map.get d2 - u)) -> forall (visited2:(@set vertex vertex_WhyType)), (visited2 = (add u - visited1)) -> forall (su:(@set vertex vertex_WhyType)) (q3:(@set - vertex vertex_WhyType)) (d3:(@map.Map.map vertex vertex_WhyType Z _)), + forall (q2:(set vertex)), forall (u:vertex), ((min u q1 d2) /\ + (q2 = (remove u q1))) -> ((shortest_path src u (map.Map.get d2 u)) -> + forall (visited2:(set vertex)), (visited2 = (add u visited1)) -> + forall (su:(set vertex)) (q3:(set vertex)) (d3:(map.Map.map vertex Z)), ((subset su (g_succ u)) /\ ((inv src visited2 q3 d3) /\ (inv_succ2 src visited2 q3 d3 u su))) -> forall (result:bool), ((result = true) <-> ~ (is_empty su)) -> ((~ (result = true)) -> forall (m:vertex), (min m q3 d3) -> forall (x:vertex), forall (dx:Z), (path src x dx) -> ((dx < (map.Map.get d3 m))%Z -> (mem x visited2)))))). +(* Why3 intros src dst d (h1,h2) q d1 visited (h3,(h4,h5)) q1 d2 visited1 + (h6,(h7,h8)) o h9 h10 h11 q2 u (h12,h13) h14 visited2 h15 su q3 d3 + (h16,(h17,h18)) result h19 h20 m h21 x dx h22 h23. *) intros src dst d (h1,h2) q d1 visited (h3,(h4,h5)) q1 d2 visited1 (h6,(h7,h8)) o h9 h10 h11 q2 u (h12,h13) h14 visited2 h15 su q3 d3 (h16,(h17,h18)) result h19 h20 m h21 x dx h22 h23. @@ -263,15 +257,16 @@ intros src dst d (h1,h2) q d1 visited (h3,(h4,h5)) q1 d2 visited1 assert (is_empty su) by ae. clear result h19 h20. assert (inv_succ src visited2 q3 d3). - unfold inv_succ. split; z. + unfold inv_succ. split; ae. assert (mem src visited2) by ae. destruct (inside_or_exit visited2 src x dx); auto. destruct H2 as (y, (z, (dy, (a1, (a2, (a3, (a4, a5))))))). unfold min in h21. -assert (mem z q3) by z. -assert (Map.get d3 z <= Map.get d3 y + weight y z)%Z by ae. -assert (dy = Map.get d3 y) by z. -z. +assert (mem z q3) by ae. +assert (Map.get d3 z <= Map.get d3 y + weight y z)%Z + by ae. +assert (dy = Map.get d3 y) by ae. +ae. Qed. diff --git a/examples/dijkstra/why3session.xml b/examples/dijkstra/why3session.xml index d5170a7cbf..67e9801397 100644 --- a/examples/dijkstra/why3session.xml +++ b/examples/dijkstra/why3session.xml @@ -152,7 +152,7 @@ <proof prover="3"><result status="valid" time="0.42"/></proof> </goal> <goal name="WP_parameter shortest_path_code.12.1.7" expl="7."> - <proof prover="1" edited="dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_2.v"><result status="valid" time="11.12"/></proof> + <proof prover="1" edited="dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_2.v"><result status="valid" time="4.74"/></proof> </goal> </transf> </goal> @@ -187,7 +187,7 @@ <proof prover="5"><result status="valid" time="0.03"/></proof> </goal> <goal name="WP_parameter shortest_path_code.17" expl="17. loop invariant preservation"> - <proof prover="1" edited="dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_3.v"><result status="valid" time="2.40"/></proof> + <proof prover="1" edited="dijkstra_DijkstraShortestPath_WP_parameter_shortest_path_code_3.v"><result status="valid" time="6.55"/></proof> </goal> <goal name="WP_parameter shortest_path_code.18" expl="18. loop variant decrease"> <proof prover="3"><result status="valid" time="0.07"/></proof> -- GitLab