diff --git a/examples/gcd.mlw b/examples/gcd.mlw index b7209d5702fe707cfa15108972244b7de2c47223..2f37aa0f33fc28c417a84f05f653a205ab8b5f1d 100644 --- a/examples/gcd.mlw +++ b/examples/gcd.mlw @@ -56,6 +56,8 @@ module BinaryGcd lemma odd1: forall n: int. 0 <= n -> not (even n) <-> n = 2 * div n 2 + 1 lemma div_nonneg: forall n: int. 0 <= n -> 0 <= div n 2 + use number.Coprime + lemma gcd_even_even: forall u v: int. 0 <= v -> 0 <= u -> gcd (2 * u) (2 * v) = 2 * gcd u v lemma gcd_even_odd: forall u v: int. 0 <= v -> 0 <= u -> @@ -64,9 +66,11 @@ module BinaryGcd even u -> odd v -> gcd u v = gcd (div u 2) v lemma odd_odd_div2: forall u v: int. 0 <= v -> 0 <= u -> div ((2*u+1) - (2*v+1)) 2 = u - v - lemma gcd_odd_odd: forall u v: int. 0 <= v -> 0 <= u -> + lemma gcd_odd_odd_aux: forall u v: int. 0 <= v <= u -> + gcd (2 * u + 1) (2 * v + 1) = gcd ((2*u+1) - 1*(2*v+1)) (2 * v + 1) + lemma gcd_odd_odd: forall u v: int. 0 <= v <= u -> gcd (2 * u + 1) (2 * v + 1) = gcd (u - v) (2 * v + 1) - lemma gcd_odd_odd2: forall u v: int. 0 <= v -> 0 <= u -> + lemma gcd_odd_odd2: forall u v: int. 0 <= v <= u -> odd u -> odd v -> gcd u v = gcd (div (u - v) 2) v let rec binary_gcd (u v: int) : int diff --git a/examples/gcd/gcd_BinaryGcd_gcd_even_odd_2.v b/examples/gcd/gcd_BinaryGcd_gcd_even_odd_2.v new file mode 100644 index 0000000000000000000000000000000000000000..a1366ed8174817cad66fac6a1ddba12524fa0e64 --- /dev/null +++ b/examples/gcd/gcd_BinaryGcd_gcd_even_odd_2.v @@ -0,0 +1,58 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import BuiltIn. +Require BuiltIn. +Require int.Int. +Require int.Abs. +Require int.EuclideanDivision. +Require int.ComputerDivision. +Require number.Parity. +Require number.Divisibility. +Require number.Gcd. +Require number.Prime. +Require number.Coprime. + +(* Why3 assumption *) +Definition unit := unit. + +Axiom qtmark : Type. +Parameter qtmark_WhyType : WhyType qtmark. +Existing Instance qtmark_WhyType. + +(* Why3 assumption *) +Definition lt_nat (x:Z) (y:Z): Prop := (0%Z <= y)%Z /\ (x < y)%Z. + +(* Why3 assumption *) +Inductive lex: (Z* Z)%type -> (Z* Z)%type -> Prop := + | Lex_1 : forall (x1:Z) (x2:Z) (y1:Z) (y2:Z), (lt_nat x1 x2) -> (lex (x1, + y1) (x2, y2)) + | Lex_2 : forall (x:Z) (y1:Z) (y2:Z), (lt_nat y1 y2) -> (lex (x, y1) (x, + y2)). + +Axiom even1 : forall (n:Z), (0%Z <= n)%Z -> ((number.Parity.even n) <-> + (n = (2%Z * (ZArith.BinInt.Z.quot n 2%Z))%Z)). + +Axiom odd1 : forall (n:Z), (0%Z <= n)%Z -> ((~ (number.Parity.even n)) <-> + (n = ((2%Z * (ZArith.BinInt.Z.quot n 2%Z))%Z + 1%Z)%Z)). + +Axiom div_nonneg : forall (n:Z), (0%Z <= n)%Z -> + (0%Z <= (ZArith.BinInt.Z.quot n 2%Z))%Z. + +Axiom gcd_even_even : forall (u:Z) (v:Z), (0%Z <= v)%Z -> ((0%Z <= u)%Z -> + ((number.Gcd.gcd (2%Z * u)%Z (2%Z * v)%Z) = (2%Z * (number.Gcd.gcd u + v))%Z)). + +(* Why3 goal *) +Theorem gcd_even_odd : forall (u:Z) (v:Z), (0%Z <= v)%Z -> ((0%Z <= u)%Z -> + ((number.Gcd.gcd (2%Z * u)%Z ((2%Z * v)%Z + 1%Z)%Z) = (number.Gcd.gcd u + ((2%Z * v)%Z + 1%Z)%Z))). +(* Why3 intros u v h1 h2. *) +intros u v h1 h2. +rewrite Gcd.Comm. +rewrite number.Coprime.gcd_coprime. +now rewrite Gcd.Comm. +unfold Coprime.coprime. +rewrite <- Gcd.Gcd_computer_mod; auto with zarith. +rewrite ComputerDivision.Mod_mult; auto with zarith. +Qed. + diff --git a/examples/gcd/why3session.xml b/examples/gcd/why3session.xml index 732d2ee631c19eeffefb5ffd7d6564094db2a120..e6469aa17d06bbb12a0ec7ea90168273df2ba582 100644 --- a/examples/gcd/why3session.xml +++ b/examples/gcd/why3session.xml @@ -36,10 +36,14 @@ <prover id="8" name="Z3" + version="3.2"/> + <prover + id="9" + name="Z3" version="4.3.1"/> <file name="../gcd.mlw" - verified="false" + verified="true" expanded="true"> <theory name="EuclideanAlgorithm" @@ -303,7 +307,7 @@ <result status="valid" time="0.02"/> </proof> <proof - prover="8" + prover="9" timelimit="30" memlimit="1000" obsolete="false" @@ -338,7 +342,7 @@ name="BinaryGcd" locfile="../gcd.mlw" loclnum="47" loccnumb="7" loccnume="16" - verified="false" + verified="true" expanded="true"> <goal name="even1" @@ -394,8 +398,8 @@ <goal name="gcd_even_even" locfile="../gcd.mlw" - loclnum="59" loccnumb="8" loccnume="21" - sum="2117c22fad1f5cf9dbb1c0bbd3f0007c" + loclnum="61" loccnumb="8" loccnume="21" + sum="0ff4c69edc2188c2f55dfbccac02e22e" proved="true" expanded="false" shape="ainfix =agcdainfix *c2V0ainfix *c2V1ainfix *c2agcdV0V1Iainfix <=c0V0Iainfix <=c0V1F"> @@ -411,17 +415,26 @@ <goal name="gcd_even_odd" locfile="../gcd.mlw" - loclnum="61" loccnumb="8" loccnume="20" - sum="ea1adaec01593d8597d40b3477d0ddff" - proved="false" - expanded="true" + loclnum="63" loccnumb="8" loccnume="20" + sum="c36b3627edc8b2c18b59a14a5123965d" + proved="true" + expanded="false" shape="ainfix =agcdainfix *c2V0ainfix +ainfix *c2V1c1agcdV0ainfix +ainfix *c2V1c1Iainfix <=c0V0Iainfix <=c0V1F"> + <proof + prover="5" + timelimit="5" + memlimit="1000" + edited="gcd_BinaryGcd_gcd_even_odd_2.v" + obsolete="false" + archived="false"> + <result status="valid" time="0.94"/> + </proof> </goal> <goal name="gcd_even_odd2" locfile="../gcd.mlw" - loclnum="63" loccnumb="8" loccnume="21" - sum="be0aba8ca2a549c75915af770866e101" + loclnum="65" loccnumb="8" loccnume="21" + sum="f3dd458ad1d04257c641287548a5706b" proved="true" expanded="false" shape="ainfix =agcdV0V1agcdadivV0c2V1IaoddV1IaevenV0Iainfix <=c0V0Iainfix <=c0V1F"> @@ -437,13 +450,13 @@ <goal name="odd_odd_div2" locfile="../gcd.mlw" - loclnum="65" loccnumb="8" loccnume="20" - sum="0d15e618ecb822a8e2f46a3635f1afc0" + loclnum="67" loccnumb="8" loccnume="20" + sum="b89ce00430a2682c5bcb0952c205d475" proved="true" expanded="false" shape="ainfix =adivainfix -ainfix +ainfix *c2V0c1ainfix +ainfix *c2V1c1c2ainfix -V0V1Iainfix <=c0V0Iainfix <=c0V1F"> <proof - prover="8" + prover="9" timelimit="6" memlimit="1000" obsolete="false" @@ -451,23 +464,64 @@ <result status="valid" time="0.01"/> </proof> </goal> + <goal + name="gcd_odd_odd_aux" + locfile="../gcd.mlw" + loclnum="69" loccnumb="8" loccnume="23" + sum="c9f41981a2bbb4f585b9a1b165277005" + proved="true" + expanded="false" + shape="ainfix =agcdainfix +ainfix *c2V0c1ainfix +ainfix *c2V1c1agcdainfix -ainfix +ainfix *c2V0c1ainfix *c1ainfix +ainfix *c2V1c1ainfix +ainfix *c2V1c1Iainfix <=V1V0Aainfix <=c0V1F"> + <proof + prover="1" + timelimit="5" + memlimit="1000" + obsolete="false" + archived="false"> + <result status="valid" time="0.03"/> + </proof> + </goal> <goal name="gcd_odd_odd" locfile="../gcd.mlw" - loclnum="67" loccnumb="8" loccnume="19" - sum="03a93660eb212da1addde8091434f006" - proved="false" - expanded="true" - shape="ainfix =agcdainfix +ainfix *c2V0c1ainfix +ainfix *c2V1c1agcdainfix -V0V1ainfix +ainfix *c2V1c1Iainfix <=c0V0Iainfix <=c0V1F"> + loclnum="71" loccnumb="8" loccnume="19" + sum="7d0f42fe2077e24ed0584c4a42509617" + proved="true" + expanded="false" + shape="ainfix =agcdainfix +ainfix *c2V0c1ainfix +ainfix *c2V1c1agcdainfix -V0V1ainfix +ainfix *c2V1c1Iainfix <=V1V0Aainfix <=c0V1F"> + <proof + prover="1" + timelimit="5" + memlimit="1000" + obsolete="false" + archived="false"> + <result status="valid" time="0.04"/> + </proof> + <proof + prover="8" + timelimit="5" + memlimit="1000" + obsolete="false" + archived="false"> + <result status="valid" time="0.04"/> + </proof> + <proof + prover="9" + timelimit="5" + memlimit="1000" + obsolete="false" + archived="false"> + <result status="valid" time="0.02"/> + </proof> </goal> <goal name="gcd_odd_odd2" locfile="../gcd.mlw" - loclnum="69" loccnumb="8" loccnume="20" - sum="212983c6f1456c4ae97edc3cc29e14ab" + loclnum="73" loccnumb="8" loccnume="20" + sum="3e147c7ac37b87dc87f24f02a4353789" proved="true" expanded="false" - shape="ainfix =agcdV0V1agcdadivainfix -V0V1c2V1IaoddV1IaoddV0Iainfix <=c0V0Iainfix <=c0V1F"> + shape="ainfix =agcdV0V1agcdadivainfix -V0V1c2V1IaoddV1IaoddV0Iainfix <=V1V0Aainfix <=c0V1F"> <proof prover="1" timelimit="6" @@ -480,9 +534,9 @@ <goal name="WP_parameter binary_gcd" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="VC for binary_gcd" - sum="4266a948997b3d24897a17785f42e048" + sum="2ded6e9da0fc59f9c4a630f811c42b51" proved="true" expanded="false" shape="iiiiainfix =agcdV2V1agcdV0V1Aainfix >=V1c0Aainfix >=V2c0AalexaTuple2V1V2aTuple2V1V0Ladivainfix -V0V1c2ainfix =agcdV0V3agcdV0V1Aainfix >=V3c0Aainfix >=V0c0AalexaTuple2V3V0aTuple2V1V0LadivV1c2aevenV1iainfix =agcdV4V1agcdV0V1Aainfix >=V1c0Aainfix >=V4c0AalexaTuple2V1V4aTuple2V1V0LadivV0c2ainfix =ainfix *c2agcdV6V5agcdV0V1Aainfix >=V5c0Aainfix >=V6c0AalexaTuple2V5V6aTuple2V1V0LadivV0c2LadivV1c2aevenV1aevenV0ainfix =V0agcdV0V1ainfix =V1c0ainfix =agcdV1V0agcdV0V1Aainfix >=V0c0Aainfix >=V1c0AalexaTuple2V0V1aTuple2V1V0ainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -495,9 +549,9 @@ <goal name="WP_parameter binary_gcd.1" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="1. variant decrease" - sum="0cfd55fb0b10e56f1f37c73c94b4843b" + sum="ef046f25bc5cd9675bef571ee6900dd2" proved="true" expanded="false" shape="variant decreasealexaTuple2V0V1aTuple2V1V0Iainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -523,9 +577,9 @@ <goal name="WP_parameter binary_gcd.2" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="2. precondition" - sum="413f01117d2caf1e3350bc6f73f9cf67" + sum="80a1c2079ed5f0a42cbc85862fd78e02" proved="true" expanded="false" shape="preconditionainfix >=V0c0Aainfix >=V1c0Iainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -551,9 +605,9 @@ <goal name="WP_parameter binary_gcd.3" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="3. postcondition" - sum="7f9fa5433322b46be3737d44a64aacf4" + sum="ae86b72f5166c3d6449234b6c8551bce" proved="true" expanded="false" shape="postconditionainfix =agcdV1V0agcdV0V1Iainfix >=V0c0Aainfix >=V1c0Iainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -579,9 +633,9 @@ <goal name="WP_parameter binary_gcd.4" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="4. postcondition" - sum="67fd0edfbd264e781201c1933bf72445" + sum="475dcfd89458b36e418ca5977df9bd9e" proved="true" expanded="false" shape="postconditionainfix =V0agcdV0V1Iainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -607,9 +661,9 @@ <goal name="WP_parameter binary_gcd.5" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="5. variant decrease" - sum="dfd113846d3757415b653efbb7df7ffd" + sum="2e1337a48640bcc573397294c6ceed62" proved="true" expanded="false" shape="variant decreasealexaTuple2V2V3aTuple2V1V0LadivV0c2LadivV1c2IaevenV1IaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -623,21 +677,13 @@ archived="false"> <result status="valid" time="0.05"/> </proof> - <proof - prover="6" - timelimit="6" - memlimit="1000" - obsolete="false" - archived="false"> - <result status="valid" time="4.55"/> - </proof> </goal> <goal name="WP_parameter binary_gcd.6" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="6. precondition" - sum="b188f1847a7239c9569cbe2bbe2d4906" + sum="c440c38e89135654d3992fe2552e78b9" proved="true" expanded="false" shape="preconditionainfix >=V2c0Aainfix >=V3c0LadivV0c2LadivV1c2IaevenV1IaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -663,9 +709,9 @@ <goal name="WP_parameter binary_gcd.7" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="7. postcondition" - sum="4121ff76f1a41e818c1f5c463ee7b315" + sum="15b8c4d6aaf509f04d9ea2c9ac26d4a9" proved="true" expanded="false" shape="postconditionainfix =ainfix *c2agcdV3V2agcdV0V1Iainfix >=V2c0Aainfix >=V3c0LadivV0c2LadivV1c2IaevenV1IaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -685,15 +731,15 @@ memlimit="1000" obsolete="false" archived="false"> - <result status="valid" time="0.09"/> + <result status="valid" time="0.41"/> </proof> </goal> <goal name="WP_parameter binary_gcd.8" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="8. variant decrease" - sum="4cc7532dee639aae88d5a5665a32a97c" + sum="6a61cc11939da2225c6f4ed3d0d26e03" proved="true" expanded="false" shape="variant decreasealexaTuple2V1V2aTuple2V1V0LadivV0c2INaevenV1IaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -711,9 +757,9 @@ <goal name="WP_parameter binary_gcd.9" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="9. precondition" - sum="a735a6b0a0b756938288a4b4dc375833" + sum="d53f41c70789bb025266f2c929177924" proved="true" expanded="false" shape="preconditionainfix >=V1c0Aainfix >=V2c0LadivV0c2INaevenV1IaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -739,9 +785,9 @@ <goal name="WP_parameter binary_gcd.10" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="10. postcondition" - sum="b76230c8d5a348f01e1fb62b2a5f1798" + sum="a7ef60aa71b0def6348341329417ab6b" proved="true" expanded="false" shape="postconditionainfix =agcdV2V1agcdV0V1Iainfix >=V1c0Aainfix >=V2c0LadivV0c2INaevenV1IaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -761,15 +807,15 @@ memlimit="1000" obsolete="false" archived="false"> - <result status="valid" time="0.14"/> + <result status="valid" time="0.60"/> </proof> </goal> <goal name="WP_parameter binary_gcd.11" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="11. variant decrease" - sum="bbcba9732a0e6e4f28cf5fef85c50ac6" + sum="c0073931eac7733d9ee9205983b9810e" proved="true" expanded="false" shape="variant decreasealexaTuple2V2V0aTuple2V1V0LadivV1c2IaevenV1INaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -789,15 +835,15 @@ memlimit="1000" obsolete="false" archived="false"> - <result status="valid" time="5.09"/> + <result status="valid" time="2.43"/> </proof> </goal> <goal name="WP_parameter binary_gcd.12" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="12. precondition" - sum="4cb731a1903b70f2030a5c8fa30ecdba" + sum="6dcb89859f1ce0b59658981c63dc232c" proved="true" expanded="false" shape="preconditionainfix >=V2c0Aainfix >=V0c0LadivV1c2IaevenV1INaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -823,9 +869,9 @@ <goal name="WP_parameter binary_gcd.13" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="13. postcondition" - sum="cffd3912ad76a895e2db1d06ed137203" + sum="8a39ef78de142e956a5432e6501df9d8" proved="true" expanded="false" shape="postconditionainfix =agcdV0V2agcdV0V1Iainfix >=V2c0Aainfix >=V0c0LadivV1c2IaevenV1INaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -845,15 +891,15 @@ memlimit="1000" obsolete="false" archived="false"> - <result status="valid" time="0.14"/> + <result status="valid" time="0.63"/> </proof> </goal> <goal name="WP_parameter binary_gcd.14" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="14. variant decrease" - sum="a72f35ef8028697df16656aa3cf4fa03" + sum="6072e986e2ab8ee5b3511d8ba0aa8286" proved="true" expanded="false" shape="variant decreasealexaTuple2V1V2aTuple2V1V0Ladivainfix -V0V1c2INaevenV1INaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -879,9 +925,9 @@ <goal name="WP_parameter binary_gcd.15" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="15. precondition" - sum="e75774a7747851bca92442d0b6da2141" + sum="ce3f844d28753cfccbe92d1d394d3dbf" proved="true" expanded="false" shape="preconditionainfix >=V1c0Aainfix >=V2c0Ladivainfix -V0V1c2INaevenV1INaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -909,15 +955,15 @@ memlimit="1000" obsolete="false" archived="false"> - <result status="valid" time="0.09"/> + <result status="valid" time="0.59"/> </proof> </goal> <goal name="WP_parameter binary_gcd.16" locfile="../gcd.mlw" - loclnum="72" loccnumb="10" loccnume="20" + loclnum="76" loccnumb="10" loccnume="20" expl="16. postcondition" - sum="20bb58d8f9ddac1b62a39d86788b6fea" + sum="3d8cc01e7b0bf5b9c640c0427df49220" proved="true" expanded="false" shape="postconditionainfix =agcdV2V1agcdV0V1Iainfix >=V1c0Aainfix >=V2c0Ladivainfix -V0V1c2INaevenV1INaevenV0INainfix =V1c0INainfix >V1V0Iainfix >=V1c0Aainfix >=V0c0F"> @@ -937,7 +983,7 @@ memlimit="1000" obsolete="false" archived="false"> - <result status="valid" time="0.03"/> + <result status="valid" time="0.09"/> </proof> </goal> </transf> diff --git a/examples/list_rev.mlw b/examples/in_progress/list_rev.mlw similarity index 100% rename from examples/list_rev.mlw rename to examples/in_progress/list_rev.mlw diff --git a/examples/list_rev/list_rev_M2_frame_list_1.v b/examples/in_progress/list_rev/list_rev_M2_frame_list_1.v similarity index 100% rename from examples/list_rev/list_rev_M2_frame_list_1.v rename to examples/in_progress/list_rev/list_rev_M2_frame_list_1.v diff --git a/examples/list_rev/list_rev_M2_frame_list_ft_1.v b/examples/in_progress/list_rev/list_rev_M2_frame_list_ft_1.v similarity index 100% rename from examples/list_rev/list_rev_M2_frame_list_ft_1.v rename to examples/in_progress/list_rev/list_rev_M2_frame_list_ft_1.v diff --git a/examples/list_rev/list_rev_M2_frame_model_1.v b/examples/in_progress/list_rev/list_rev_M2_frame_model_1.v similarity index 100% rename from examples/list_rev/list_rev_M2_frame_model_1.v rename to examples/in_progress/list_rev/list_rev_M2_frame_model_1.v diff --git a/examples/list_rev/why3session.xml b/examples/in_progress/list_rev/why3session.xml similarity index 100% rename from examples/list_rev/why3session.xml rename to examples/in_progress/list_rev/why3session.xml diff --git a/examples/tests-provers/alt-ergo-models.mlw b/examples/tests/alt-ergo-models.mlw similarity index 100% rename from examples/tests-provers/alt-ergo-models.mlw rename to examples/tests/alt-ergo-models.mlw diff --git a/examples/tests-provers/alt-ergo-models.why b/examples/tests/alt-ergo-models.why similarity index 100% rename from examples/tests-provers/alt-ergo-models.why rename to examples/tests/alt-ergo-models.why diff --git a/examples/tests-provers/alt-ergo-models/why3session.xml b/examples/tests/alt-ergo-models/why3session.xml similarity index 100% rename from examples/tests-provers/alt-ergo-models/why3session.xml rename to examples/tests/alt-ergo-models/why3session.xml diff --git a/lib/coq/number/Coprime.v b/lib/coq/number/Coprime.v index f7b159078b087d2005538d52806061c3cbd0d174..a2e1c6e1049a675f8a8b54727a3ab7bb92968037 100644 --- a/lib/coq/number/Coprime.v +++ b/lib/coq/number/Coprime.v @@ -67,3 +67,21 @@ apply Znumtheory.prime_mult; auto. now rewrite <- Prime.prime_is_Zprime. Qed. +(* Why3 goal *) +Lemma gcd_coprime : forall (a:Z) (b:Z) (c:Z), (coprime a b) -> + ((number.Gcd.gcd a (b * c)%Z) = (number.Gcd.gcd a c)). +intros a b c h1. +apply Z.gcd_unique. +- apply Z.gcd_nonneg. +- apply Gcd.gcd_def1. +- apply Divisibility.divides_multl. + apply Gcd.gcd_def2. +- intros q h2 h3. + apply Gcd.gcd_def3. + trivial. + apply Gauss with b; split; auto. + rewrite coprime_is_Zrel_prime. + rewrite coprime_is_Zrel_prime in h1. + now apply Znumtheory.rel_prime_div with (2:=h2). +Qed. + diff --git a/theories/number.why b/theories/number.why index e270074e66c2c71949c6fee29792c80ce18ffabb..99466e95dcb70a465597b0ca0d3d3640aab22295 100644 --- a/theories/number.why +++ b/theories/number.why @@ -118,7 +118,6 @@ theory Gcd clone algebra.AC with type t = int, function op = gcd, lemma Comm.Comm, lemma Assoc - (*** FIXME: Alt-Ergo proves gcd_0_pos even without gcd_unique *) lemma gcd_0_pos: forall a: int. 0 <= a -> gcd a 0 = a lemma gcd_0_neg: forall a: int. a < 0 -> gcd a 0 = -a @@ -196,5 +195,7 @@ theory Coprime forall p a b:int. prime p /\ divides p (a*b) -> divides p a \/ divides p b + lemma gcd_coprime: + forall a b c. coprime a b -> gcd a (b*c) = gcd a c end