diff --git a/examples/programs/bresenham/bresenham_WP_M_invariant_is_ok_1.v b/examples/programs/bresenham/bresenham_WP_M_invariant_is_ok_1.v new file mode 100644 index 0000000000000000000000000000000000000000..017dc8726246e57829524059376dbad0230d0937 --- /dev/null +++ b/examples/programs/bresenham/bresenham_WP_M_invariant_is_ok_1.v @@ -0,0 +1,266 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import ZArith. +Require Import Rbase. +Definition unit := unit. + +Parameter mark : Type. + +Parameter at1: forall (a:Type), a -> mark -> a. + +Implicit Arguments at1. + +Parameter old: forall (a:Type), a -> a. + +Implicit Arguments old. + +Inductive ref (a:Type) := + | mk_ref : a -> ref a. +Implicit Arguments mk_ref. + +Definition contents (a:Type)(u:(ref a)): a := + match u with + | mk_ref contents1 => contents1 + end. +Implicit Arguments contents. + +Parameter x2: Z. + + +Parameter y2: Z. + + +Axiom first_octant : (0%Z <= (y2 ))%Z /\ ((y2 ) <= (x2 ))%Z. + +Axiom Abs_pos : forall (x:Z), (0%Z <= (Zabs x))%Z. + +Definition best(x:Z) (y:Z): Prop := forall (yqt:Z), + ((Zabs (((x2 ) * y)%Z - (x * (y2 ))%Z)%Z) <= (Zabs (((x2 ) * yqt)%Z - (x * (y2 ))%Z)%Z))%Z. + +Definition invariant_(x:Z) (y:Z) (e:Z): Prop := + (e = (((2%Z * (x + 1%Z)%Z)%Z * (y2 ))%Z - (((2%Z * y)%Z + 1%Z)%Z * (x2 ))%Z)%Z) /\ + (((2%Z * ((y2 ) - (x2 ))%Z)%Z <= e)%Z /\ (e <= (2%Z * (y2 ))%Z)%Z). + +(* YOU MAY EDIT THE CONTEXT BELOW *) +(*s First a tactic [Case_Zabs] to do case split over [(Zabs x)]: + introduces two subgoals, one where [x] is assumed to be non negative + and thus where [Zabs x] is replaced by [x]; and another where + [x] is assumed to be non positive and thus where [Zabs x] is + replaced by [-x]. *) + +Lemma Z_gt_le : forall x y:Z, (x > y)%Z -> (y <= x)%Z. +Proof. +intros; omega. +Qed. + +Ltac Case_Zabs a Ha := + elim (Z_le_gt_dec 0 a); intro Ha; + [ rewrite (Zabs_eq a Ha) + | rewrite (Zabs_non_eq a (Z_gt_le 0 a Ha)) ]. + +(*s A useful lemma to establish $|a| \le |b|$. *) + +Lemma Zabs_le_Zabs : + forall a b:Z, + (b <= a <= 0)%Z \/ (0 <= a <= b)%Z -> (Zabs a <= Zabs b)%Z. +Proof. +intro a; Case_Zabs a Ha; intro b; Case_Zabs b Hb; omega. +Qed. + +(*s A useful lemma to establish $|a| \le $. *) + +Lemma Zabs_le : + forall a b:Z, (0 <= b)%Z -> ((Zopp b <= a <= b)%Z <-> (Zabs a <= b)%Z). +Proof. +intros a b Hb. + Case_Zabs a Ha; split; omega. +Qed. + +(*s Two tactics. [ZCompare x y H] discriminates between [x<y], [x=y] and + [x>y] ([H] is the hypothesis name). [RingSimpl x y] rewrites [x] by [y] + using the [Ring] tactic. *) + +Ltac ZCompare x y H := + elim (Z_gt_le_dec x y); intro H; + [ idtac | elim (Z_le_lt_eq_dec x y H); clear H; intro H ]. + +Ltac RingSimpl x y := replace x with y; [ idtac | ring ]. + +(*s Key lemma for Bresenham's proof: if [b] is at distance less or equal + than [1/2] from the rational [c/a], then it is the closest such integer. + We express this property in [Z], thus multiplying everything by [2a]. *) + +Lemma closest : + forall a b c:Z, + (0 <= a)%Z -> + (Zabs (2 * a * b - 2 * c) <= a)%Z -> + forall b':Z, (Zabs (a * b - c) <= Zabs (a * b' - c))%Z. +Proof. +intros a b c Ha Hmin. +generalize (proj2 (Zabs_le (2 * a * b - 2 * c) a Ha) Hmin). +intros Hmin' b'. +elim (Z_le_gt_dec (2 * a * b) (2 * c)); intro Habc. +(* 2ab <= 2c *) +rewrite (Zabs_non_eq (a * b - c)). +ZCompare b b' Hbb'. + (* b > b' *) + rewrite (Zabs_non_eq (a * b' - c)). + apply Zle_left_rev. + RingSimpl (Zopp (a * b' - c) + Zopp (Zopp (a * b - c)))%Z + (a * (b - b'))%Z. + apply Zmult_le_0_compat; omega. + apply Zge_le. + apply Zge_trans with (m := (a * b - c)%Z). + apply Zmult_ge_reg_r with (p := 2%Z). + omega. + RingSimpl (0 * 2)%Z 0%Z. + RingSimpl ((a * b - c) * 2)%Z (2 * a * b - 2 * c)%Z. + omega. + RingSimpl (a * b' - c)%Z (a * b' + Zopp c)%Z. + RingSimpl (a * b - c)%Z (a * b + Zopp c)%Z. + apply Zle_ge. + apply Zplus_le_compat_r. + apply Zmult_le_compat_l; omega. + (* b < b' *) + rewrite (Zabs_eq (a * b' - c)). + apply Zmult_le_reg_r with (p := 2%Z). + omega. + RingSimpl ((a * b' - c) * 2)%Z + (2 * (a * b' - a * b) + 2 * (a * b - c))%Z. + apply Zle_trans with a. + RingSimpl (Zopp (a * b - c) * 2)%Z (Zopp (2 * a * b - 2 * c)). + omega. + apply Zle_trans with (2 * a + Zopp a)%Z. + omega. + apply Zplus_le_compat. + RingSimpl (2 * a)%Z (2 * a * 1)%Z. + RingSimpl (2 * (a * b' - a * b))%Z (2 * a * (b' - b))%Z. + apply Zmult_le_compat_l; omega. + RingSimpl (2 * (a * b - c))%Z (2 * a * b - 2 * c)%Z. + omega. + (* 0 <= ab'-c *) + RingSimpl (a * b' - c)%Z (a * b' - a * b + (a * b - c))%Z. + RingSimpl 0%Z (a + Zopp a)%Z. + apply Zplus_le_compat. + RingSimpl a (a * 1)%Z. + RingSimpl (a * 1 * b' - a * 1 * b)%Z (a * (b' - b))%Z. + apply Zmult_le_compat_l; omega. + apply Zmult_le_reg_r with (p := 2%Z). + omega. + apply Zle_trans with (Zopp a). + omega. + RingSimpl ((a * b - c) * 2)%Z (2 * a * b - 2 * c)%Z. + omega. + (* b = b' *) + rewrite <- Hbb'. + rewrite (Zabs_non_eq (a * b - c)). + omega. + apply Zge_le. + apply Zmult_ge_reg_r with (p := 2%Z). + omega. + RingSimpl (0 * 2)%Z 0%Z. + RingSimpl ((a * b - c) * 2)%Z (2 * a * b - 2 * c)%Z. + omega. + apply Zge_le. + apply Zmult_ge_reg_r with (p := 2%Z). + omega. + RingSimpl (0 * 2)%Z 0%Z. + RingSimpl ((a * b - c) * 2)%Z (2 * a * b - 2 * c)%Z. + omega. + +(* 2ab > 2c *) +rewrite (Zabs_eq (a * b - c)). +ZCompare b b' Hbb'. + (* b > b' *) + rewrite (Zabs_non_eq (a * b' - c)). + apply Zmult_le_reg_r with (p := 2%Z). + omega. + RingSimpl (Zopp (a * b' - c) * 2)%Z + (2 * (c - a * b) + 2 * (a * b - a * b'))%Z. + apply Zle_trans with a. + RingSimpl ((a * b - c) * 2)%Z (2 * a * b - 2 * c)%Z. + omega. + apply Zle_trans with (Zopp a + 2 * a)%Z. + omega. + apply Zplus_le_compat. + RingSimpl (2 * (c - a * b))%Z (2 * c - 2 * a * b)%Z. + omega. + RingSimpl (2 * a)%Z (2 * a * 1)%Z. + RingSimpl (2 * (a * b - a * b'))%Z (2 * a * (b - b'))%Z. + apply Zmult_le_compat_l; omega. + (* 0 >= ab'-c *) + RingSimpl (a * b' - c)%Z (a * b' - a * b + (a * b - c))%Z. + RingSimpl 0%Z (Zopp a + a)%Z. + apply Zplus_le_compat. + RingSimpl (Zopp a) (a * (-1))%Z. + RingSimpl (a * b' - a * b)%Z (a * (b' - b))%Z. + apply Zmult_le_compat_l; omega. + apply Zmult_le_reg_r with (p := 2%Z). + omega. + apply Zle_trans with a. + RingSimpl ((a * b - c) * 2)%Z (2 * a * b - 2 * c)%Z. + omega. + omega. + (* b < b' *) + rewrite (Zabs_eq (a * b' - c)). + apply Zle_left_rev. + RingSimpl (a * b' - c + Zopp (a * b - c))%Z (a * (b' - b))%Z. + apply Zmult_le_0_compat; omega. + apply Zle_trans with (m := (a * b - c)%Z). + apply Zmult_le_reg_r with (p := 2%Z). + omega. + RingSimpl (0 * 2)%Z 0%Z. + RingSimpl ((a * b - c) * 2)%Z (2 * a * b - 2 * c)%Z. + omega. + RingSimpl (a * b' - c)%Z (a * b' + Zopp c)%Z. + RingSimpl (a * b - c)%Z (a * b + Zopp c)%Z. + apply Zplus_le_compat_r. + apply Zmult_le_compat_l; omega. + (* b = b' *) + rewrite <- Hbb'. + rewrite (Zabs_eq (a * b - c)). + omega. + apply Zmult_le_reg_r with (p := 2%Z). + omega. + RingSimpl (0 * 2)%Z 0%Z. + RingSimpl ((a * b - c) * 2)%Z (2 * a * b - 2 * c)%Z. + omega. + apply Zmult_le_reg_r with (p := 2%Z). + omega. + RingSimpl (0 * 2)%Z 0%Z. + RingSimpl ((a * b - c) * 2)%Z (2 * a * b - 2 * c)%Z. + omega. + Qed. +(* DO NOT EDIT BELOW *) + +Theorem invariant_is_ok : forall (x:Z) (y:Z) (e:Z), (invariant_ x y e) -> + (best x y). +(* YOU MAY EDIT THE PROOF BELOW *) +Proof. +intros x y e. +unfold invariant_; unfold best; intros [E I'] y'. +cut (0 <= x2)%Z; [ intro Hx2 | idtac ]. +apply closest. +assumption. +apply (proj1 (Zabs_le (2 * x2 * y - 2 * (x * y2)) x2 Hx2)). +rewrite E in I'. +split. +(* 0 <= x2 *) +generalize (proj2 I'). +RingSimpl (2 * (x + 1) * y2 - (2 * y + 1) * x2)%Z + (2 * x * y2 - 2 * x2 * y + 2 * y2 - x2)%Z. +intro. +RingSimpl (2 * (x * y2))%Z (2 * x * y2)%Z. +omega. +(* 0 <= x2 *) +generalize (proj1 I'). +RingSimpl (2 * (x + 1) * y2 - (2 * y + 1) * x2)%Z + (2 * x * y2 - 2 * x2 * y + 2 * y2 - x2)%Z. +RingSimpl (2 * (y2 - x2))%Z (2 * y2 - 2 * x2)%Z. +RingSimpl (2 * (x * y2))%Z (2 * x * y2)%Z. +omega. +omega. +Qed. +(* DO NOT EDIT BELOW *) + + diff --git a/examples/programs/bresenham/why3session.xml b/examples/programs/bresenham/why3session.xml index 6edab5d9f67161f9aa01d06b8fd76f7b439412bc..1a184506e07d1dd27777c5f0342793446c2211a5 100644 --- a/examples/programs/bresenham/why3session.xml +++ b/examples/programs/bresenham/why3session.xml @@ -1,43 +1,55 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE why3session SYSTEM "why3session.dtd"> <why3session name="examples/programs/bresenham/why3session.xml"> - <file name="../bresenham.mlw" verified="false" expanded="true"> - <theory name="WP M" verified="false" expanded="true"> - <goal name="invariant_is_ok" sum="a18992b264d84141d8761ca70ad6be8d" proved="false" expanded="true"> + <prover id="alt-ergo" name="Alt-Ergo" version="0.93"/> + <prover id="coq" name="Coq" version="8.2pl1"/> + <prover id="cvc3" name="CVC3" version="2.2"/> + <prover id="eprover" name="Eprover" version="1.0-004 Temi"/> + <prover id="gappa" name="Gappa" version="0.14.0"/> + <prover id="simplify" name="Simplify" version="1.5.4"/> + <prover id="spass" name="Spass" version="3.5"/> + <prover id="yices" name="Yices" version="1.0.27"/> + <prover id="z3" name="Z3" version="2.19"/> + <file name="../bresenham.mlw" verified="true" expanded="true"> + <theory name="WP M" verified="true" expanded="true"> + <goal name="invariant_is_ok" sum="a18992b264d84141d8761ca70ad6be8d" proved="true" expanded="true" shape="abestV0V1Iainvariant_V0V1V2F"> + <proof prover="coq" timelimit="10" edited="bresenham_WP_M_invariant_is_ok_1.v" obsolete="false"> + <result status="valid" time="1.75"/> + </proof> </goal> - <goal name="WP_parameter bresenham" expl="correctness of parameter bresenham" sum="e21d55e7ef3bbb885c18d91e544577f6" proved="true" expanded="true"> + <goal name="WP_parameter bresenham" expl="correctness of parameter bresenham" sum="e21d55e7ef3bbb885c18d91e544577f6" proved="true" expanded="true" shape="iainfix <=V2ax2iainfix <V0c0ainfix <ainfix -ainfix +ax2c1V4ainfix -ainfix +ax2c1V2Aainfix <=c0ainfix -ainfix +ax2c1V2Aainvariant_V4V1V3Aainfix <=V4ainfix +ax2c1Aainfix <=c0V4Iainfix =V4ainfix +V2c1FIainfix =V3ainfix +V0ainfix *c2ay2Fainfix <ainfix -ainfix +ax2c1V7ainfix -ainfix +ax2c1V2Aainfix <=c0ainfix -ainfix +ax2c1V2Aainvariant_V7V5V6Aainfix <=V7ainfix +ax2c1Aainfix <=c0V7Iainfix =V7ainfix +V2c1FIainfix =V6ainfix +V0ainfix *c2ainfix -ay2ax2FIainfix =V5ainfix +V1c1FAabestV2V1tIainvariant_V2V1V0Aainfix <=V2ainfix +ax2c1Aainfix <=c0V2FFFAainvariant_c0c0ainfix -ainfix *c2ay2ax2Aainfix <=c0ainfix +ax2c1Aainfix <=c0c0"> <transf name="split_goal" proved="true" expanded="true"> - <goal name="WP_parameter bresenham.1" expl="loop invariant init" sum="17124999e917b5c053f6e76b259bcb7c" proved="true" expanded="true"> + <goal name="WP_parameter bresenham.1" expl="loop invariant init" sum="17124999e917b5c053f6e76b259bcb7c" proved="true" expanded="true" shape="ainvariant_c0c0ainfix -ainfix *c2ay2ax2Aainfix <=c0ainfix +ax2c1Aainfix <=c0c0"> <proof prover="alt-ergo" timelimit="10" edited="" obsolete="false"> <result status="valid" time="0.02"/> </proof> </goal> - <goal name="WP_parameter bresenham.2" expl="assertion" sum="6a4211d9f59e4c91dd774b5f26851c4a" proved="true" expanded="true"> + <goal name="WP_parameter bresenham.2" expl="assertion" sum="6a4211d9f59e4c91dd774b5f26851c4a" proved="true" expanded="true" shape="abestV2V1Iainfix <=V2ax2Iainvariant_V2V1V0Aainfix <=V2ainfix +ax2c1Aainfix <=c0V2FFF"> <proof prover="alt-ergo" timelimit="10" edited="" obsolete="false"> - <result status="valid" time="0.14"/> + <result status="valid" time="0.16"/> </proof> </goal> - <goal name="WP_parameter bresenham.3" expl="loop invariant preservation" sum="cc7e4371357729bd73f6d31bb228d35e" proved="true" expanded="true"> + <goal name="WP_parameter bresenham.3" expl="loop invariant preservation" sum="cc7e4371357729bd73f6d31bb228d35e" proved="true" expanded="true" shape="ainvariant_V4V1V3Aainfix <=V4ainfix +ax2c1Aainfix <=c0V4Iainfix =V4ainfix +V2c1FIainfix =V3ainfix +V0ainfix *c2ay2FIainfix <V0c0IabestV2V1Iainfix <=V2ax2Iainvariant_V2V1V0Aainfix <=V2ainfix +ax2c1Aainfix <=c0V2FFF"> <proof prover="cvc3" timelimit="10" edited="" obsolete="false"> - <result status="valid" time="0.03"/> + <result status="valid" time="0.02"/> </proof> </goal> - <goal name="WP_parameter bresenham.4" expl="loop variant decreases" sum="38653e4347933a962e5aa5d8faf55aaf" proved="true" expanded="true"> + <goal name="WP_parameter bresenham.4" expl="loop variant decreases" sum="38653e4347933a962e5aa5d8faf55aaf" proved="true" expanded="true" shape="ainfix <ainfix -ainfix +ax2c1V4ainfix -ainfix +ax2c1V2Aainfix <=c0ainfix -ainfix +ax2c1V2Iainvariant_V4V1V3Aainfix <=V4ainfix +ax2c1Aainfix <=c0V4Iainfix =V4ainfix +V2c1FIainfix =V3ainfix +V0ainfix *c2ay2FIainfix <V0c0IabestV2V1Iainfix <=V2ax2Iainvariant_V2V1V0Aainfix <=V2ainfix +ax2c1Aainfix <=c0V2FFF"> <proof prover="alt-ergo" timelimit="10" edited="" obsolete="false"> <result status="valid" time="0.03"/> </proof> </goal> - <goal name="WP_parameter bresenham.5" expl="loop invariant preservation" sum="694c94aaa6e82005f68c8636fcf6fa15" proved="true" expanded="true"> + <goal name="WP_parameter bresenham.5" expl="loop invariant preservation" sum="694c94aaa6e82005f68c8636fcf6fa15" proved="true" expanded="true" shape="ainvariant_V5V3V4Aainfix <=V5ainfix +ax2c1Aainfix <=c0V5Iainfix =V5ainfix +V2c1FIainfix =V4ainfix +V0ainfix *c2ainfix -ay2ax2FIainfix =V3ainfix +V1c1FIainfix <V0c0NIabestV2V1Iainfix <=V2ax2Iainvariant_V2V1V0Aainfix <=V2ainfix +ax2c1Aainfix <=c0V2FFF"> <proof prover="cvc3" timelimit="10" edited="" obsolete="false"> - <result status="valid" time="0.03"/> + <result status="valid" time="0.04"/> </proof> </goal> - <goal name="WP_parameter bresenham.6" expl="loop variant decreases" sum="169f4e236bbdd35bc03b2b6daf8f3b7f" proved="true" expanded="true"> + <goal name="WP_parameter bresenham.6" expl="loop variant decreases" sum="169f4e236bbdd35bc03b2b6daf8f3b7f" proved="true" expanded="true" shape="ainfix <ainfix -ainfix +ax2c1V5ainfix -ainfix +ax2c1V2Aainfix <=c0ainfix -ainfix +ax2c1V2Iainvariant_V5V3V4Aainfix <=V5ainfix +ax2c1Aainfix <=c0V5Iainfix =V5ainfix +V2c1FIainfix =V4ainfix +V0ainfix *c2ainfix -ay2ax2FIainfix =V3ainfix +V1c1FIainfix <V0c0NIabestV2V1Iainfix <=V2ax2Iainvariant_V2V1V0Aainfix <=V2ainfix +ax2c1Aainfix <=c0V2FFF"> <proof prover="alt-ergo" timelimit="10" edited="" obsolete="false"> <result status="valid" time="0.02"/> </proof> </goal> - <goal name="WP_parameter bresenham.7" expl="normal postcondition" sum="bd112799fb9e847a8546c1fac8ba4617" proved="true" expanded="true"> + <goal name="WP_parameter bresenham.7" expl="normal postcondition" sum="bd112799fb9e847a8546c1fac8ba4617" proved="true" expanded="true" shape="tIainfix <=V2ax2NIainvariant_V2V1V0Aainfix <=V2ainfix +ax2c1Aainfix <=c0V2FFF"> <proof prover="alt-ergo" timelimit="10" edited="" obsolete="false"> <result status="valid" time="0.02"/> </proof>