From fdd385baf3adfbe737d5834650327839bf8bd88a Mon Sep 17 00:00:00 2001 From: Jean-Christophe Filliatre <Jean-Christophe.Filliatre@lri.fr> Date: Fri, 25 May 2018 13:35:30 +0200 Subject: [PATCH] bitvectors: removed some Coq proofs --- examples/bitvectors/bitvector.why | 12 +- .../bitvector_BitVector_to_nat_of_one_1.v | 308 ----------------- .../bitvector_BitVector_to_nat_of_zero_1.v | 309 ----------------- ...tvector_BitVector_to_nat_sub_footprint_1.v | 326 ------------------ examples/bitvectors/bitvector/why3session.xml | 99 ++++-- examples/bitvectors/bitvector/why3shapes.gz | Bin 1556 -> 1982 bytes 6 files changed, 71 insertions(+), 983 deletions(-) delete mode 100644 examples/bitvectors/bitvector/bitvector_BitVector_to_nat_of_one_1.v delete mode 100644 examples/bitvectors/bitvector/bitvector_BitVector_to_nat_of_zero_1.v delete mode 100644 examples/bitvectors/bitvector/bitvector_BitVector_to_nat_sub_footprint_1.v diff --git a/examples/bitvectors/bitvector.why b/examples/bitvectors/bitvector.why index 9e7e3155a6..31e36d2ae8 100644 --- a/examples/bitvectors/bitvector.why +++ b/examples/bitvectors/bitvector.why @@ -198,14 +198,16 @@ theory BitVector lemma to_nat_of_zero: - forall b:bv, i j:int. size > j /\ i >= 0 -> + forall b:bv, j i:int. size > j /\ i >= 0 -> (forall k:int. j >= k >= i -> nth b k = False) -> to_nat_sub b j i = 0 - lemma to_nat_of_one: - forall b:bv, i j:int. size > j >= i >= 0 -> - (forall k:int. j >= k >= i -> nth b k = True) -> - to_nat_sub b j i = pow2 (j-i+1) - 1 + let rec lemma to_nat_of_one (b: bv) i j + requires { size > j >= i >= 0 } + requires { forall k:int. j >= k >= i -> nth b k = True } + ensures { to_nat_sub b j i = pow2 (j-i+1) - 1 } + variant { j - i } + = if j > i then to_nat_of_one b i (j-1) lemma to_nat_sub_footprint: forall b1 b2:bv, j i:int. size > j /\ i >=0 -> (forall k:int. i <= k <= j -> nth b1 k = nth b2 k) -> diff --git a/examples/bitvectors/bitvector/bitvector_BitVector_to_nat_of_one_1.v b/examples/bitvectors/bitvector/bitvector_BitVector_to_nat_of_one_1.v deleted file mode 100644 index 35c16e9e10..0000000000 --- a/examples/bitvectors/bitvector/bitvector_BitVector_to_nat_of_one_1.v +++ /dev/null @@ -1,308 +0,0 @@ -(* This file is generated by Why3's Coq driver *) -(* Beware! Only edit allowed sections below *) -Require Import BuiltIn. -Require BuiltIn. -Require bool.Bool. -Require int.Int. -Require int.Abs. -Require int.EuclideanDivision. - -Parameter pow2: Z -> Z. - -Axiom Power_0 : ((pow2 0%Z) = 1%Z). - -Axiom Power_s : forall (n:Z), (0%Z <= n)%Z -> - ((pow2 (n + 1%Z)%Z) = (2%Z * (pow2 n))%Z). - -Axiom Power_1 : ((pow2 1%Z) = 2%Z). - -Axiom Power_sum : forall (n:Z) (m:Z), ((0%Z <= n)%Z /\ (0%Z <= m)%Z) -> - ((pow2 (n + m)%Z) = ((pow2 n) * (pow2 m))%Z). - -Axiom pow2pos : forall (i:Z), (0%Z <= i)%Z -> (0%Z < (pow2 i))%Z. - -Axiom pow2_0 : ((pow2 0%Z) = 1%Z). - -Axiom pow2_1 : ((pow2 1%Z) = 2%Z). - -Axiom pow2_2 : ((pow2 2%Z) = 4%Z). - -Axiom pow2_3 : ((pow2 3%Z) = 8%Z). - -Axiom pow2_4 : ((pow2 4%Z) = 16%Z). - -Axiom pow2_5 : ((pow2 5%Z) = 32%Z). - -Axiom pow2_6 : ((pow2 6%Z) = 64%Z). - -Axiom pow2_7 : ((pow2 7%Z) = 128%Z). - -Axiom pow2_8 : ((pow2 8%Z) = 256%Z). - -Axiom pow2_9 : ((pow2 9%Z) = 512%Z). - -Axiom pow2_10 : ((pow2 10%Z) = 1024%Z). - -Axiom pow2_11 : ((pow2 11%Z) = 2048%Z). - -Axiom pow2_12 : ((pow2 12%Z) = 4096%Z). - -Axiom pow2_13 : ((pow2 13%Z) = 8192%Z). - -Axiom pow2_14 : ((pow2 14%Z) = 16384%Z). - -Axiom pow2_15 : ((pow2 15%Z) = 32768%Z). - -Axiom pow2_16 : ((pow2 16%Z) = 65536%Z). - -Axiom pow2_17 : ((pow2 17%Z) = 131072%Z). - -Axiom pow2_18 : ((pow2 18%Z) = 262144%Z). - -Axiom pow2_19 : ((pow2 19%Z) = 524288%Z). - -Axiom pow2_20 : ((pow2 20%Z) = 1048576%Z). - -Axiom pow2_21 : ((pow2 21%Z) = 2097152%Z). - -Axiom pow2_22 : ((pow2 22%Z) = 4194304%Z). - -Axiom pow2_23 : ((pow2 23%Z) = 8388608%Z). - -Axiom pow2_24 : ((pow2 24%Z) = 16777216%Z). - -Axiom pow2_25 : ((pow2 25%Z) = 33554432%Z). - -Axiom pow2_26 : ((pow2 26%Z) = 67108864%Z). - -Axiom pow2_27 : ((pow2 27%Z) = 134217728%Z). - -Axiom pow2_28 : ((pow2 28%Z) = 268435456%Z). - -Axiom pow2_29 : ((pow2 29%Z) = 536870912%Z). - -Axiom pow2_30 : ((pow2 30%Z) = 1073741824%Z). - -Axiom pow2_31 : ((pow2 31%Z) = 2147483648%Z). - -Axiom pow2_32 : ((pow2 32%Z) = 4294967296%Z). - -Axiom pow2_33 : ((pow2 33%Z) = 8589934592%Z). - -Axiom pow2_34 : ((pow2 34%Z) = 17179869184%Z). - -Axiom pow2_35 : ((pow2 35%Z) = 34359738368%Z). - -Axiom pow2_36 : ((pow2 36%Z) = 68719476736%Z). - -Axiom pow2_37 : ((pow2 37%Z) = 137438953472%Z). - -Axiom pow2_38 : ((pow2 38%Z) = 274877906944%Z). - -Axiom pow2_39 : ((pow2 39%Z) = 549755813888%Z). - -Axiom pow2_40 : ((pow2 40%Z) = 1099511627776%Z). - -Axiom pow2_41 : ((pow2 41%Z) = 2199023255552%Z). - -Axiom pow2_42 : ((pow2 42%Z) = 4398046511104%Z). - -Axiom pow2_43 : ((pow2 43%Z) = 8796093022208%Z). - -Axiom pow2_44 : ((pow2 44%Z) = 17592186044416%Z). - -Axiom pow2_45 : ((pow2 45%Z) = 35184372088832%Z). - -Axiom pow2_46 : ((pow2 46%Z) = 70368744177664%Z). - -Axiom pow2_47 : ((pow2 47%Z) = 140737488355328%Z). - -Axiom pow2_48 : ((pow2 48%Z) = 281474976710656%Z). - -Axiom pow2_49 : ((pow2 49%Z) = 562949953421312%Z). - -Axiom pow2_50 : ((pow2 50%Z) = 1125899906842624%Z). - -Axiom pow2_51 : ((pow2 51%Z) = 2251799813685248%Z). - -Axiom pow2_52 : ((pow2 52%Z) = 4503599627370496%Z). - -Axiom pow2_53 : ((pow2 53%Z) = 9007199254740992%Z). - -Axiom pow2_54 : ((pow2 54%Z) = 18014398509481984%Z). - -Axiom pow2_55 : ((pow2 55%Z) = 36028797018963968%Z). - -Axiom pow2_56 : ((pow2 56%Z) = 72057594037927936%Z). - -Axiom pow2_57 : ((pow2 57%Z) = 144115188075855872%Z). - -Axiom pow2_58 : ((pow2 58%Z) = 288230376151711744%Z). - -Axiom pow2_59 : ((pow2 59%Z) = 576460752303423488%Z). - -Axiom pow2_60 : ((pow2 60%Z) = 1152921504606846976%Z). - -Axiom pow2_61 : ((pow2 61%Z) = 2305843009213693952%Z). - -Axiom pow2_62 : ((pow2 62%Z) = 4611686018427387904%Z). - -Axiom pow2_63 : ((pow2 63%Z) = 9223372036854775808%Z). - -Axiom Div_mult_inst : forall (x:Z) (z:Z), (0%Z < x)%Z -> - ((int.EuclideanDivision.div ((x * 1%Z)%Z + z)%Z - x) = (1%Z + (int.EuclideanDivision.div z x))%Z). - -Axiom Div_double : forall (x:Z) (y:Z), ((0%Z < y)%Z /\ ((y <= x)%Z /\ - (x < (2%Z * y)%Z)%Z)) -> ((int.EuclideanDivision.div x y) = 1%Z). - -Axiom Div_pow : forall (x:Z) (i:Z), (0%Z < i)%Z -> - ((((pow2 (i - 1%Z)%Z) <= x)%Z /\ (x < (pow2 i))%Z) -> - ((int.EuclideanDivision.div x (pow2 (i - 1%Z)%Z)) = 1%Z)). - -Axiom Div_double_neg : forall (x:Z) (y:Z), ((((-2%Z)%Z * y)%Z <= x)%Z /\ - ((x < (-y)%Z)%Z /\ ((-y)%Z < 0%Z)%Z)) -> ((int.EuclideanDivision.div x - y) = (-2%Z)%Z). - -Axiom Div_pow2 : forall (x:Z) (i:Z), (0%Z < i)%Z -> - ((((-(pow2 i))%Z <= x)%Z /\ (x < (-(pow2 (i - 1%Z)%Z))%Z)%Z) -> - ((int.EuclideanDivision.div x (pow2 (i - 1%Z)%Z)) = (-2%Z)%Z)). - -Axiom Mod_pow2_gen : forall (x:Z) (i:Z) (k:Z), ((0%Z <= k)%Z /\ (k < i)%Z) -> - ((int.EuclideanDivision.mod1 (int.EuclideanDivision.div (x + (pow2 i))%Z - (pow2 k)) 2%Z) = (int.EuclideanDivision.mod1 (int.EuclideanDivision.div x - (pow2 k)) 2%Z)). - -Parameter size: Z. - -Axiom size_positive : (1%Z < size)%Z. - -Axiom bv : Type. -Parameter bv_WhyType : WhyType bv. -Existing Instance bv_WhyType. - -Parameter nth: bv -> Z -> bool. - -Parameter bvzero: bv. - -Axiom Nth_zero : forall (n:Z), ((0%Z <= n)%Z /\ (n < size)%Z) -> ((nth bvzero - n) = false). - -Parameter bvone: bv. - -Axiom Nth_one : forall (n:Z), ((0%Z <= n)%Z /\ (n < size)%Z) -> ((nth bvone - n) = true). - -(* Why3 assumption *) -Definition eq (v1:bv) (v2:bv): Prop := forall (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth v1 n) = (nth v2 n)). - -Axiom extensionality : forall (v1:bv) (v2:bv), (eq v1 v2) -> (v1 = v2). - -Parameter bw_and: bv -> bv -> bv. - -Axiom Nth_bw_and : forall (v1:bv) (v2:bv) (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth (bw_and v1 v2) n) = (Init.Datatypes.andb (nth v1 - n) (nth v2 n))). - -Parameter bw_or: bv -> bv -> bv. - -Axiom Nth_bw_or : forall (v1:bv) (v2:bv) (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth (bw_or v1 v2) n) = (Init.Datatypes.orb (nth v1 - n) (nth v2 n))). - -Parameter bw_xor: bv -> bv -> bv. - -Axiom Nth_bw_xor : forall (v1:bv) (v2:bv) (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth (bw_xor v1 v2) n) = (Init.Datatypes.xorb (nth v1 - n) (nth v2 n))). - -Axiom Nth_bw_xor_v1true : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v1 n) = true)) -> ((nth (bw_xor v1 v2) - n) = (Init.Datatypes.negb (nth v2 n))). - -Axiom Nth_bw_xor_v1false : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v1 n) = false)) -> ((nth (bw_xor v1 v2) n) = (nth v2 - n)). - -Axiom Nth_bw_xor_v2true : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v2 n) = true)) -> ((nth (bw_xor v1 v2) - n) = (Init.Datatypes.negb (nth v1 n))). - -Axiom Nth_bw_xor_v2false : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v2 n) = false)) -> ((nth (bw_xor v1 v2) n) = (nth v1 - n)). - -Parameter bw_not: bv -> bv. - -Axiom Nth_bw_not : forall (v:bv) (n:Z), ((0%Z <= n)%Z /\ (n < size)%Z) -> - ((nth (bw_not v) n) = (Init.Datatypes.negb (nth v n))). - -Parameter lsr: bv -> Z -> bv. - -Axiom lsr_nth_low : forall (b:bv) (n:Z) (s:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ (((0%Z <= s)%Z /\ (s < size)%Z) /\ - ((n + s)%Z < size)%Z)) -> ((nth (lsr b s) n) = (nth b (n + s)%Z)). - -Axiom lsr_nth_high : forall (b:bv) (n:Z) (s:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ (((0%Z <= s)%Z /\ (s < size)%Z) /\ - (size <= (n + s)%Z)%Z)) -> ((nth (lsr b s) n) = false). - -Parameter asr: bv -> Z -> bv. - -Axiom asr_nth_low : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> (((n + s)%Z < size)%Z -> ((nth (asr b s) - n) = (nth b (n + s)%Z)))). - -Axiom asr_nth_high : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> ((size <= (n + s)%Z)%Z -> ((nth (asr b s) - n) = (nth b (size - 1%Z)%Z)))). - -Parameter lsl: bv -> Z -> bv. - -Axiom lsl_nth_high : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> ((0%Z <= (n - s)%Z)%Z -> ((nth (lsl b s) - n) = (nth b (n - s)%Z)))). - -Axiom lsl_nth_low : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> (((n - s)%Z < 0%Z)%Z -> ((nth (lsl b s) - n) = false))). - -Parameter to_nat_sub: bv -> Z -> Z -> Z. - -Axiom to_nat_sub_zero : forall (b:bv) (j:Z) (i:Z), ((0%Z <= i)%Z /\ - ((i <= j)%Z /\ (j < size)%Z)) -> (((nth b j) = false) -> ((to_nat_sub b j - i) = (to_nat_sub b (j - 1%Z)%Z i))). - -Axiom to_nat_sub_one : forall (b:bv) (j:Z) (i:Z), ((0%Z <= i)%Z /\ - ((i <= j)%Z /\ (j < size)%Z)) -> (((nth b j) = true) -> ((to_nat_sub b j - i) = ((pow2 (j - i)%Z) + (to_nat_sub b (j - 1%Z)%Z i))%Z)). - -Axiom to_nat_sub_high : forall (b:bv) (j:Z) (i:Z), (j < i)%Z -> - ((to_nat_sub b j i) = 0%Z). - -Axiom to_nat_of_zero2 : forall (b:bv) (i:Z) (j:Z), ((j < size)%Z /\ - ((i <= j)%Z /\ (0%Z <= i)%Z)) -> ((forall (k:Z), ((k <= j)%Z /\ - (i < k)%Z) -> ((nth b k) = false)) -> ((to_nat_sub b j 0%Z) = (to_nat_sub b - i 0%Z))). - -Axiom to_nat_of_zero : forall (b:bv) (i:Z) (j:Z), ((j < size)%Z /\ - (0%Z <= i)%Z) -> ((forall (k:Z), ((k <= j)%Z /\ (i <= k)%Z) -> ((nth b - k) = false)) -> ((to_nat_sub b j i) = 0%Z)). - -Require Import Why3. -Ltac cvc := why3 "CVC3,2.4.1," timelimit 5; admit. -Open Scope Z_scope. - -(* Why3 goal *) -Theorem to_nat_of_one : forall (b:bv) (i:Z) (j:Z), ((j < size)%Z /\ - ((i <= j)%Z /\ (0%Z <= i)%Z)) -> ((forall (k:Z), ((k <= j)%Z /\ - (i <= k)%Z) -> ((nth b k) = true)) -> ((to_nat_sub b j - i) = ((pow2 ((j - i)%Z + 1%Z)%Z) - 1%Z)%Z)). -(* Why3 intros b i j (h1,(h2,h3)) h4. *) -intros b i j (Hj,(Hij,Hi)). -generalize Hij Hj. -pattern j; apply Zlt_lower_bound_ind with (z:=i); auto. -cvc. -Admitted. - diff --git a/examples/bitvectors/bitvector/bitvector_BitVector_to_nat_of_zero_1.v b/examples/bitvectors/bitvector/bitvector_BitVector_to_nat_of_zero_1.v deleted file mode 100644 index 66ceafa55f..0000000000 --- a/examples/bitvectors/bitvector/bitvector_BitVector_to_nat_of_zero_1.v +++ /dev/null @@ -1,309 +0,0 @@ -(* This file is generated by Why3's Coq driver *) -(* Beware! Only edit allowed sections below *) -Require Import BuiltIn. -Require BuiltIn. -Require bool.Bool. -Require int.Int. -Require int.Abs. -Require int.EuclideanDivision. - -Parameter pow2: Z -> Z. - -Axiom Power_0 : ((pow2 0%Z) = 1%Z). - -Axiom Power_s : forall (n:Z), (0%Z <= n)%Z -> - ((pow2 (n + 1%Z)%Z) = (2%Z * (pow2 n))%Z). - -Axiom Power_1 : ((pow2 1%Z) = 2%Z). - -Axiom Power_sum : forall (n:Z) (m:Z), ((0%Z <= n)%Z /\ (0%Z <= m)%Z) -> - ((pow2 (n + m)%Z) = ((pow2 n) * (pow2 m))%Z). - -Axiom pow2pos : forall (i:Z), (0%Z <= i)%Z -> (0%Z < (pow2 i))%Z. - -Axiom pow2_0 : ((pow2 0%Z) = 1%Z). - -Axiom pow2_1 : ((pow2 1%Z) = 2%Z). - -Axiom pow2_2 : ((pow2 2%Z) = 4%Z). - -Axiom pow2_3 : ((pow2 3%Z) = 8%Z). - -Axiom pow2_4 : ((pow2 4%Z) = 16%Z). - -Axiom pow2_5 : ((pow2 5%Z) = 32%Z). - -Axiom pow2_6 : ((pow2 6%Z) = 64%Z). - -Axiom pow2_7 : ((pow2 7%Z) = 128%Z). - -Axiom pow2_8 : ((pow2 8%Z) = 256%Z). - -Axiom pow2_9 : ((pow2 9%Z) = 512%Z). - -Axiom pow2_10 : ((pow2 10%Z) = 1024%Z). - -Axiom pow2_11 : ((pow2 11%Z) = 2048%Z). - -Axiom pow2_12 : ((pow2 12%Z) = 4096%Z). - -Axiom pow2_13 : ((pow2 13%Z) = 8192%Z). - -Axiom pow2_14 : ((pow2 14%Z) = 16384%Z). - -Axiom pow2_15 : ((pow2 15%Z) = 32768%Z). - -Axiom pow2_16 : ((pow2 16%Z) = 65536%Z). - -Axiom pow2_17 : ((pow2 17%Z) = 131072%Z). - -Axiom pow2_18 : ((pow2 18%Z) = 262144%Z). - -Axiom pow2_19 : ((pow2 19%Z) = 524288%Z). - -Axiom pow2_20 : ((pow2 20%Z) = 1048576%Z). - -Axiom pow2_21 : ((pow2 21%Z) = 2097152%Z). - -Axiom pow2_22 : ((pow2 22%Z) = 4194304%Z). - -Axiom pow2_23 : ((pow2 23%Z) = 8388608%Z). - -Axiom pow2_24 : ((pow2 24%Z) = 16777216%Z). - -Axiom pow2_25 : ((pow2 25%Z) = 33554432%Z). - -Axiom pow2_26 : ((pow2 26%Z) = 67108864%Z). - -Axiom pow2_27 : ((pow2 27%Z) = 134217728%Z). - -Axiom pow2_28 : ((pow2 28%Z) = 268435456%Z). - -Axiom pow2_29 : ((pow2 29%Z) = 536870912%Z). - -Axiom pow2_30 : ((pow2 30%Z) = 1073741824%Z). - -Axiom pow2_31 : ((pow2 31%Z) = 2147483648%Z). - -Axiom pow2_32 : ((pow2 32%Z) = 4294967296%Z). - -Axiom pow2_33 : ((pow2 33%Z) = 8589934592%Z). - -Axiom pow2_34 : ((pow2 34%Z) = 17179869184%Z). - -Axiom pow2_35 : ((pow2 35%Z) = 34359738368%Z). - -Axiom pow2_36 : ((pow2 36%Z) = 68719476736%Z). - -Axiom pow2_37 : ((pow2 37%Z) = 137438953472%Z). - -Axiom pow2_38 : ((pow2 38%Z) = 274877906944%Z). - -Axiom pow2_39 : ((pow2 39%Z) = 549755813888%Z). - -Axiom pow2_40 : ((pow2 40%Z) = 1099511627776%Z). - -Axiom pow2_41 : ((pow2 41%Z) = 2199023255552%Z). - -Axiom pow2_42 : ((pow2 42%Z) = 4398046511104%Z). - -Axiom pow2_43 : ((pow2 43%Z) = 8796093022208%Z). - -Axiom pow2_44 : ((pow2 44%Z) = 17592186044416%Z). - -Axiom pow2_45 : ((pow2 45%Z) = 35184372088832%Z). - -Axiom pow2_46 : ((pow2 46%Z) = 70368744177664%Z). - -Axiom pow2_47 : ((pow2 47%Z) = 140737488355328%Z). - -Axiom pow2_48 : ((pow2 48%Z) = 281474976710656%Z). - -Axiom pow2_49 : ((pow2 49%Z) = 562949953421312%Z). - -Axiom pow2_50 : ((pow2 50%Z) = 1125899906842624%Z). - -Axiom pow2_51 : ((pow2 51%Z) = 2251799813685248%Z). - -Axiom pow2_52 : ((pow2 52%Z) = 4503599627370496%Z). - -Axiom pow2_53 : ((pow2 53%Z) = 9007199254740992%Z). - -Axiom pow2_54 : ((pow2 54%Z) = 18014398509481984%Z). - -Axiom pow2_55 : ((pow2 55%Z) = 36028797018963968%Z). - -Axiom pow2_56 : ((pow2 56%Z) = 72057594037927936%Z). - -Axiom pow2_57 : ((pow2 57%Z) = 144115188075855872%Z). - -Axiom pow2_58 : ((pow2 58%Z) = 288230376151711744%Z). - -Axiom pow2_59 : ((pow2 59%Z) = 576460752303423488%Z). - -Axiom pow2_60 : ((pow2 60%Z) = 1152921504606846976%Z). - -Axiom pow2_61 : ((pow2 61%Z) = 2305843009213693952%Z). - -Axiom pow2_62 : ((pow2 62%Z) = 4611686018427387904%Z). - -Axiom pow2_63 : ((pow2 63%Z) = 9223372036854775808%Z). - -Axiom Div_mult_inst : forall (x:Z) (z:Z), (0%Z < x)%Z -> - ((int.EuclideanDivision.div ((x * 1%Z)%Z + z)%Z - x) = (1%Z + (int.EuclideanDivision.div z x))%Z). - -Axiom Div_double : forall (x:Z) (y:Z), ((0%Z < y)%Z /\ ((y <= x)%Z /\ - (x < (2%Z * y)%Z)%Z)) -> ((int.EuclideanDivision.div x y) = 1%Z). - -Axiom Div_pow : forall (x:Z) (i:Z), (0%Z < i)%Z -> - ((((pow2 (i - 1%Z)%Z) <= x)%Z /\ (x < (pow2 i))%Z) -> - ((int.EuclideanDivision.div x (pow2 (i - 1%Z)%Z)) = 1%Z)). - -Axiom Div_double_neg : forall (x:Z) (y:Z), ((((-2%Z)%Z * y)%Z <= x)%Z /\ - ((x < (-y)%Z)%Z /\ ((-y)%Z < 0%Z)%Z)) -> ((int.EuclideanDivision.div x - y) = (-2%Z)%Z). - -Axiom Div_pow2 : forall (x:Z) (i:Z), (0%Z < i)%Z -> - ((((-(pow2 i))%Z <= x)%Z /\ (x < (-(pow2 (i - 1%Z)%Z))%Z)%Z) -> - ((int.EuclideanDivision.div x (pow2 (i - 1%Z)%Z)) = (-2%Z)%Z)). - -Axiom Mod_pow2_gen : forall (x:Z) (i:Z) (k:Z), ((0%Z <= k)%Z /\ (k < i)%Z) -> - ((int.EuclideanDivision.mod1 (int.EuclideanDivision.div (x + (pow2 i))%Z - (pow2 k)) 2%Z) = (int.EuclideanDivision.mod1 (int.EuclideanDivision.div x - (pow2 k)) 2%Z)). - -Parameter size: Z. - -Axiom size_positive : (1%Z < size)%Z. - -Axiom bv : Type. -Parameter bv_WhyType : WhyType bv. -Existing Instance bv_WhyType. - -Parameter nth: bv -> Z -> bool. - -Parameter bvzero: bv. - -Axiom Nth_zero : forall (n:Z), ((0%Z <= n)%Z /\ (n < size)%Z) -> ((nth bvzero - n) = false). - -Parameter bvone: bv. - -Axiom Nth_one : forall (n:Z), ((0%Z <= n)%Z /\ (n < size)%Z) -> ((nth bvone - n) = true). - -(* Why3 assumption *) -Definition eq (v1:bv) (v2:bv): Prop := forall (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth v1 n) = (nth v2 n)). - -Axiom extensionality : forall (v1:bv) (v2:bv), (eq v1 v2) -> (v1 = v2). - -Parameter bw_and: bv -> bv -> bv. - -Axiom Nth_bw_and : forall (v1:bv) (v2:bv) (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth (bw_and v1 v2) n) = (Init.Datatypes.andb (nth v1 - n) (nth v2 n))). - -Parameter bw_or: bv -> bv -> bv. - -Axiom Nth_bw_or : forall (v1:bv) (v2:bv) (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth (bw_or v1 v2) n) = (Init.Datatypes.orb (nth v1 - n) (nth v2 n))). - -Parameter bw_xor: bv -> bv -> bv. - -Axiom Nth_bw_xor : forall (v1:bv) (v2:bv) (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth (bw_xor v1 v2) n) = (Init.Datatypes.xorb (nth v1 - n) (nth v2 n))). - -Axiom Nth_bw_xor_v1true : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v1 n) = true)) -> ((nth (bw_xor v1 v2) - n) = (Init.Datatypes.negb (nth v2 n))). - -Axiom Nth_bw_xor_v1false : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v1 n) = false)) -> ((nth (bw_xor v1 v2) n) = (nth v2 - n)). - -Axiom Nth_bw_xor_v2true : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v2 n) = true)) -> ((nth (bw_xor v1 v2) - n) = (Init.Datatypes.negb (nth v1 n))). - -Axiom Nth_bw_xor_v2false : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v2 n) = false)) -> ((nth (bw_xor v1 v2) n) = (nth v1 - n)). - -Parameter bw_not: bv -> bv. - -Axiom Nth_bw_not : forall (v:bv) (n:Z), ((0%Z <= n)%Z /\ (n < size)%Z) -> - ((nth (bw_not v) n) = (Init.Datatypes.negb (nth v n))). - -Parameter lsr: bv -> Z -> bv. - -Axiom lsr_nth_low : forall (b:bv) (n:Z) (s:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ (((0%Z <= s)%Z /\ (s < size)%Z) /\ - ((n + s)%Z < size)%Z)) -> ((nth (lsr b s) n) = (nth b (n + s)%Z)). - -Axiom lsr_nth_high : forall (b:bv) (n:Z) (s:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ (((0%Z <= s)%Z /\ (s < size)%Z) /\ - (size <= (n + s)%Z)%Z)) -> ((nth (lsr b s) n) = false). - -Parameter asr: bv -> Z -> bv. - -Axiom asr_nth_low : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> (((n + s)%Z < size)%Z -> ((nth (asr b s) - n) = (nth b (n + s)%Z)))). - -Axiom asr_nth_high : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> ((size <= (n + s)%Z)%Z -> ((nth (asr b s) - n) = (nth b (size - 1%Z)%Z)))). - -Parameter lsl: bv -> Z -> bv. - -Axiom lsl_nth_high : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> ((0%Z <= (n - s)%Z)%Z -> ((nth (lsl b s) - n) = (nth b (n - s)%Z)))). - -Axiom lsl_nth_low : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> (((n - s)%Z < 0%Z)%Z -> ((nth (lsl b s) - n) = false))). - -Parameter to_nat_sub: bv -> Z -> Z -> Z. - -Axiom to_nat_sub_zero : forall (b:bv) (j:Z) (i:Z), ((0%Z <= i)%Z /\ - ((i <= j)%Z /\ (j < size)%Z)) -> (((nth b j) = false) -> ((to_nat_sub b j - i) = (to_nat_sub b (j - 1%Z)%Z i))). - -Axiom to_nat_sub_one : forall (b:bv) (j:Z) (i:Z), ((0%Z <= i)%Z /\ - ((i <= j)%Z /\ (j < size)%Z)) -> (((nth b j) = true) -> ((to_nat_sub b j - i) = ((pow2 (j - i)%Z) + (to_nat_sub b (j - 1%Z)%Z i))%Z)). - -Axiom to_nat_sub_high : forall (b:bv) (j:Z) (i:Z), (j < i)%Z -> - ((to_nat_sub b j i) = 0%Z). - -Axiom to_nat_of_zero2 : forall (b:bv) (i:Z) (j:Z), ((j < size)%Z /\ - ((i <= j)%Z /\ (0%Z <= i)%Z)) -> ((forall (k:Z), ((k <= j)%Z /\ - (i < k)%Z) -> ((nth b k) = false)) -> ((to_nat_sub b j 0%Z) = (to_nat_sub b - i 0%Z))). - -Require Import Why3. -Ltac ae := why3 "Alt-Ergo,0.99.1," timelimit 5; admit. -Ltac cvc := why3 "CVC3,2.4.1," timelimit 5; admit. -Open Scope Z_scope. - - -(* Why3 goal *) -Theorem to_nat_of_zero : forall (b:bv) (i:Z) (j:Z), ((j < size)%Z /\ - (0%Z <= i)%Z) -> ((forall (k:Z), ((k <= j)%Z /\ (i <= k)%Z) -> ((nth b - k) = false)) -> ((to_nat_sub b j i) = 0%Z)). -(* Why3 intros b i j (h1,h2) h3. *) -(* intros b i j (h1,h2) h3. *) -intros b i j (Hj & Hi). -assert (h:(i>j)\/(i<=j)) by omega; destruct h. -ae. -generalize Hj. -pattern j. -apply Zlt_lower_bound_ind with (z:=i); auto. -cvc. -Admitted. - diff --git a/examples/bitvectors/bitvector/bitvector_BitVector_to_nat_sub_footprint_1.v b/examples/bitvectors/bitvector/bitvector_BitVector_to_nat_sub_footprint_1.v deleted file mode 100644 index 756b069205..0000000000 --- a/examples/bitvectors/bitvector/bitvector_BitVector_to_nat_sub_footprint_1.v +++ /dev/null @@ -1,326 +0,0 @@ -(* This file is generated by Why3's Coq driver *) -(* Beware! Only edit allowed sections below *) -Require Import BuiltIn. -Require BuiltIn. -Require bool.Bool. -Require int.Int. -Require int.Abs. -Require int.EuclideanDivision. - -Parameter pow2: Z -> Z. - -Axiom Power_0 : ((pow2 0%Z) = 1%Z). - -Axiom Power_s : forall (n:Z), (0%Z <= n)%Z -> - ((pow2 (n + 1%Z)%Z) = (2%Z * (pow2 n))%Z). - -Axiom Power_1 : ((pow2 1%Z) = 2%Z). - -Axiom Power_sum : forall (n:Z) (m:Z), ((0%Z <= n)%Z /\ (0%Z <= m)%Z) -> - ((pow2 (n + m)%Z) = ((pow2 n) * (pow2 m))%Z). - -Axiom pow2pos : forall (i:Z), (0%Z <= i)%Z -> (0%Z < (pow2 i))%Z. - -Axiom pow2_0 : ((pow2 0%Z) = 1%Z). - -Axiom pow2_1 : ((pow2 1%Z) = 2%Z). - -Axiom pow2_2 : ((pow2 2%Z) = 4%Z). - -Axiom pow2_3 : ((pow2 3%Z) = 8%Z). - -Axiom pow2_4 : ((pow2 4%Z) = 16%Z). - -Axiom pow2_5 : ((pow2 5%Z) = 32%Z). - -Axiom pow2_6 : ((pow2 6%Z) = 64%Z). - -Axiom pow2_7 : ((pow2 7%Z) = 128%Z). - -Axiom pow2_8 : ((pow2 8%Z) = 256%Z). - -Axiom pow2_9 : ((pow2 9%Z) = 512%Z). - -Axiom pow2_10 : ((pow2 10%Z) = 1024%Z). - -Axiom pow2_11 : ((pow2 11%Z) = 2048%Z). - -Axiom pow2_12 : ((pow2 12%Z) = 4096%Z). - -Axiom pow2_13 : ((pow2 13%Z) = 8192%Z). - -Axiom pow2_14 : ((pow2 14%Z) = 16384%Z). - -Axiom pow2_15 : ((pow2 15%Z) = 32768%Z). - -Axiom pow2_16 : ((pow2 16%Z) = 65536%Z). - -Axiom pow2_17 : ((pow2 17%Z) = 131072%Z). - -Axiom pow2_18 : ((pow2 18%Z) = 262144%Z). - -Axiom pow2_19 : ((pow2 19%Z) = 524288%Z). - -Axiom pow2_20 : ((pow2 20%Z) = 1048576%Z). - -Axiom pow2_21 : ((pow2 21%Z) = 2097152%Z). - -Axiom pow2_22 : ((pow2 22%Z) = 4194304%Z). - -Axiom pow2_23 : ((pow2 23%Z) = 8388608%Z). - -Axiom pow2_24 : ((pow2 24%Z) = 16777216%Z). - -Axiom pow2_25 : ((pow2 25%Z) = 33554432%Z). - -Axiom pow2_26 : ((pow2 26%Z) = 67108864%Z). - -Axiom pow2_27 : ((pow2 27%Z) = 134217728%Z). - -Axiom pow2_28 : ((pow2 28%Z) = 268435456%Z). - -Axiom pow2_29 : ((pow2 29%Z) = 536870912%Z). - -Axiom pow2_30 : ((pow2 30%Z) = 1073741824%Z). - -Axiom pow2_31 : ((pow2 31%Z) = 2147483648%Z). - -Axiom pow2_32 : ((pow2 32%Z) = 4294967296%Z). - -Axiom pow2_33 : ((pow2 33%Z) = 8589934592%Z). - -Axiom pow2_34 : ((pow2 34%Z) = 17179869184%Z). - -Axiom pow2_35 : ((pow2 35%Z) = 34359738368%Z). - -Axiom pow2_36 : ((pow2 36%Z) = 68719476736%Z). - -Axiom pow2_37 : ((pow2 37%Z) = 137438953472%Z). - -Axiom pow2_38 : ((pow2 38%Z) = 274877906944%Z). - -Axiom pow2_39 : ((pow2 39%Z) = 549755813888%Z). - -Axiom pow2_40 : ((pow2 40%Z) = 1099511627776%Z). - -Axiom pow2_41 : ((pow2 41%Z) = 2199023255552%Z). - -Axiom pow2_42 : ((pow2 42%Z) = 4398046511104%Z). - -Axiom pow2_43 : ((pow2 43%Z) = 8796093022208%Z). - -Axiom pow2_44 : ((pow2 44%Z) = 17592186044416%Z). - -Axiom pow2_45 : ((pow2 45%Z) = 35184372088832%Z). - -Axiom pow2_46 : ((pow2 46%Z) = 70368744177664%Z). - -Axiom pow2_47 : ((pow2 47%Z) = 140737488355328%Z). - -Axiom pow2_48 : ((pow2 48%Z) = 281474976710656%Z). - -Axiom pow2_49 : ((pow2 49%Z) = 562949953421312%Z). - -Axiom pow2_50 : ((pow2 50%Z) = 1125899906842624%Z). - -Axiom pow2_51 : ((pow2 51%Z) = 2251799813685248%Z). - -Axiom pow2_52 : ((pow2 52%Z) = 4503599627370496%Z). - -Axiom pow2_53 : ((pow2 53%Z) = 9007199254740992%Z). - -Axiom pow2_54 : ((pow2 54%Z) = 18014398509481984%Z). - -Axiom pow2_55 : ((pow2 55%Z) = 36028797018963968%Z). - -Axiom pow2_56 : ((pow2 56%Z) = 72057594037927936%Z). - -Axiom pow2_57 : ((pow2 57%Z) = 144115188075855872%Z). - -Axiom pow2_58 : ((pow2 58%Z) = 288230376151711744%Z). - -Axiom pow2_59 : ((pow2 59%Z) = 576460752303423488%Z). - -Axiom pow2_60 : ((pow2 60%Z) = 1152921504606846976%Z). - -Axiom pow2_61 : ((pow2 61%Z) = 2305843009213693952%Z). - -Axiom pow2_62 : ((pow2 62%Z) = 4611686018427387904%Z). - -Axiom pow2_63 : ((pow2 63%Z) = 9223372036854775808%Z). - -Axiom Div_mult_inst : forall (x:Z) (z:Z), (0%Z < x)%Z -> - ((int.EuclideanDivision.div ((x * 1%Z)%Z + z)%Z - x) = (1%Z + (int.EuclideanDivision.div z x))%Z). - -Axiom Div_double : forall (x:Z) (y:Z), ((0%Z < y)%Z /\ ((y <= x)%Z /\ - (x < (2%Z * y)%Z)%Z)) -> ((int.EuclideanDivision.div x y) = 1%Z). - -Axiom Div_pow : forall (x:Z) (i:Z), (0%Z < i)%Z -> - ((((pow2 (i - 1%Z)%Z) <= x)%Z /\ (x < (pow2 i))%Z) -> - ((int.EuclideanDivision.div x (pow2 (i - 1%Z)%Z)) = 1%Z)). - -Axiom Div_double_neg : forall (x:Z) (y:Z), ((((-2%Z)%Z * y)%Z <= x)%Z /\ - ((x < (-y)%Z)%Z /\ ((-y)%Z < 0%Z)%Z)) -> ((int.EuclideanDivision.div x - y) = (-2%Z)%Z). - -Axiom Div_pow2 : forall (x:Z) (i:Z), (0%Z < i)%Z -> - ((((-(pow2 i))%Z <= x)%Z /\ (x < (-(pow2 (i - 1%Z)%Z))%Z)%Z) -> - ((int.EuclideanDivision.div x (pow2 (i - 1%Z)%Z)) = (-2%Z)%Z)). - -Axiom Mod_pow2_gen : forall (x:Z) (i:Z) (k:Z), ((0%Z <= k)%Z /\ (k < i)%Z) -> - ((int.EuclideanDivision.mod1 (int.EuclideanDivision.div (x + (pow2 i))%Z - (pow2 k)) 2%Z) = (int.EuclideanDivision.mod1 (int.EuclideanDivision.div x - (pow2 k)) 2%Z)). - -Parameter size: Z. - -Axiom size_positive : (1%Z < size)%Z. - -Axiom bv : Type. -Parameter bv_WhyType : WhyType bv. -Existing Instance bv_WhyType. - -Parameter nth: bv -> Z -> bool. - -Parameter bvzero: bv. - -Axiom Nth_zero : forall (n:Z), ((0%Z <= n)%Z /\ (n < size)%Z) -> ((nth bvzero - n) = false). - -Parameter bvone: bv. - -Axiom Nth_one : forall (n:Z), ((0%Z <= n)%Z /\ (n < size)%Z) -> ((nth bvone - n) = true). - -(* Why3 assumption *) -Definition eq (v1:bv) (v2:bv): Prop := forall (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth v1 n) = (nth v2 n)). - -Axiom extensionality : forall (v1:bv) (v2:bv), (eq v1 v2) -> (v1 = v2). - -Parameter bw_and: bv -> bv -> bv. - -Axiom Nth_bw_and : forall (v1:bv) (v2:bv) (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth (bw_and v1 v2) n) = (Init.Datatypes.andb (nth v1 - n) (nth v2 n))). - -Parameter bw_or: bv -> bv -> bv. - -Axiom Nth_bw_or : forall (v1:bv) (v2:bv) (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth (bw_or v1 v2) n) = (Init.Datatypes.orb (nth v1 - n) (nth v2 n))). - -Parameter bw_xor: bv -> bv -> bv. - -Axiom Nth_bw_xor : forall (v1:bv) (v2:bv) (n:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((nth (bw_xor v1 v2) n) = (Init.Datatypes.xorb (nth v1 - n) (nth v2 n))). - -Axiom Nth_bw_xor_v1true : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v1 n) = true)) -> ((nth (bw_xor v1 v2) - n) = (Init.Datatypes.negb (nth v2 n))). - -Axiom Nth_bw_xor_v1false : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v1 n) = false)) -> ((nth (bw_xor v1 v2) n) = (nth v2 - n)). - -Axiom Nth_bw_xor_v2true : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v2 n) = true)) -> ((nth (bw_xor v1 v2) - n) = (Init.Datatypes.negb (nth v1 n))). - -Axiom Nth_bw_xor_v2false : forall (v1:bv) (v2:bv) (n:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ ((nth v2 n) = false)) -> ((nth (bw_xor v1 v2) n) = (nth v1 - n)). - -Parameter bw_not: bv -> bv. - -Axiom Nth_bw_not : forall (v:bv) (n:Z), ((0%Z <= n)%Z /\ (n < size)%Z) -> - ((nth (bw_not v) n) = (Init.Datatypes.negb (nth v n))). - -Parameter lsr: bv -> Z -> bv. - -Axiom lsr_nth_low : forall (b:bv) (n:Z) (s:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ (((0%Z <= s)%Z /\ (s < size)%Z) /\ - ((n + s)%Z < size)%Z)) -> ((nth (lsr b s) n) = (nth b (n + s)%Z)). - -Axiom lsr_nth_high : forall (b:bv) (n:Z) (s:Z), (((0%Z <= n)%Z /\ - (n < size)%Z) /\ (((0%Z <= s)%Z /\ (s < size)%Z) /\ - (size <= (n + s)%Z)%Z)) -> ((nth (lsr b s) n) = false). - -Parameter asr: bv -> Z -> bv. - -Axiom asr_nth_low : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> (((n + s)%Z < size)%Z -> ((nth (asr b s) - n) = (nth b (n + s)%Z)))). - -Axiom asr_nth_high : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> ((size <= (n + s)%Z)%Z -> ((nth (asr b s) - n) = (nth b (size - 1%Z)%Z)))). - -Parameter lsl: bv -> Z -> bv. - -Axiom lsl_nth_high : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> ((0%Z <= (n - s)%Z)%Z -> ((nth (lsl b s) - n) = (nth b (n - s)%Z)))). - -Axiom lsl_nth_low : forall (b:bv) (n:Z) (s:Z), ((0%Z <= n)%Z /\ - (n < size)%Z) -> ((0%Z <= s)%Z -> (((n - s)%Z < 0%Z)%Z -> ((nth (lsl b s) - n) = false))). - -Parameter to_nat_sub: bv -> Z -> Z -> Z. - -Axiom to_nat_sub_zero : forall (b:bv) (j:Z) (i:Z), ((0%Z <= i)%Z /\ - ((i <= j)%Z /\ (j < size)%Z)) -> (((nth b j) = false) -> ((to_nat_sub b j - i) = (to_nat_sub b (j - 1%Z)%Z i))). - -Axiom to_nat_sub_one : forall (b:bv) (j:Z) (i:Z), ((0%Z <= i)%Z /\ - ((i <= j)%Z /\ (j < size)%Z)) -> (((nth b j) = true) -> ((to_nat_sub b j - i) = ((pow2 (j - i)%Z) + (to_nat_sub b (j - 1%Z)%Z i))%Z)). - -Axiom to_nat_sub_high : forall (b:bv) (j:Z) (i:Z), (j < i)%Z -> - ((to_nat_sub b j i) = 0%Z). - -Axiom to_nat_of_zero2 : forall (b:bv) (i:Z) (j:Z), ((j < size)%Z /\ - ((i <= j)%Z /\ (0%Z <= i)%Z)) -> ((forall (k:Z), ((k <= j)%Z /\ - (i < k)%Z) -> ((nth b k) = false)) -> ((to_nat_sub b j 0%Z) = (to_nat_sub b - i 0%Z))). - -Axiom to_nat_of_zero : forall (b:bv) (i:Z) (j:Z), ((j < size)%Z /\ - (0%Z <= i)%Z) -> ((forall (k:Z), ((k <= j)%Z /\ (i <= k)%Z) -> ((nth b - k) = false)) -> ((to_nat_sub b j i) = 0%Z)). - -Axiom to_nat_of_one : forall (b:bv) (i:Z) (j:Z), ((j < size)%Z /\ - ((i <= j)%Z /\ (0%Z <= i)%Z)) -> ((forall (k:Z), ((k <= j)%Z /\ - (i <= k)%Z) -> ((nth b k) = true)) -> ((to_nat_sub b j - i) = ((pow2 ((j - i)%Z + 1%Z)%Z) - 1%Z)%Z)). - -Require Import Why3. -Ltac ae := why3 "alt-ergo" timelimit 15; admit. -Open Scope Z_scope. - -(* Why3 goal *) -Theorem to_nat_sub_footprint : forall (b1:bv) (b2:bv) (j:Z) (i:Z), - ((j < size)%Z /\ (0%Z <= i)%Z) -> ((forall (k:Z), ((i <= k)%Z /\ - (k <= j)%Z) -> ((nth b1 k) = (nth b2 k))) -> ((to_nat_sub b1 j - i) = (to_nat_sub b2 j i))). -(* Why3 intros b1 b2 j i (h1,h2) h3. *) -(* intros b1 b2 j i (h1,h2) h3. *) -intros b1 b2 j i (Hij,Hipos). -assert (h:(j < i \/ i <= j)) by omega; destruct h. -ae. -generalize Hij. -pattern j; apply Zlt_lower_bound_ind with (z:=i); auto. -clear j Hij H. -intros j Hind Hij Hj Hfootprint. -assert (h:i=j \/ i<j) by omega; destruct h. -ae. -assert (h : (nth b1 j = false \/ nth b1 j = true)). - elim (nth b1 j); auto. -destruct h. -rewrite to_nat_sub_zero; auto with zarith. -ae. -rewrite to_nat_sub_one; auto with zarith. -ae. -Admitted. - diff --git a/examples/bitvectors/bitvector/why3session.xml b/examples/bitvectors/bitvector/why3session.xml index ac493f61a7..28e0927c63 100644 --- a/examples/bitvectors/bitvector/why3session.xml +++ b/examples/bitvectors/bitvector/why3session.xml @@ -3,10 +3,9 @@ "http://why3.lri.fr/why3session.dtd"> <why3session shape_version="4"> <prover id="0" name="Alt-Ergo" version="1.30" timelimit="5" steplimit="0" memlimit="1000"/> -<prover id="1" name="Coq" version="8.7.1" timelimit="7" steplimit="0" memlimit="1000"/> <prover id="2" name="Alt-Ergo" version="0.99.1" timelimit="5" steplimit="0" memlimit="1000"/> <prover id="3" name="CVC3" version="2.4.1" timelimit="5" steplimit="0" memlimit="1000"/> -<prover id="4" name="Alt-Ergo" version="2.0.0" timelimit="1" steplimit="0" memlimit="1000"/> +<prover id="4" name="Alt-Ergo" version="2.0.0" timelimit="30" steplimit="0" memlimit="1000"/> <prover id="5" name="CVC4" version="1.5" timelimit="1" steplimit="0" memlimit="1000"/> <prover id="6" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/> <prover id="9" name="Z3" version="3.2" timelimit="3" steplimit="0" memlimit="1000"/> @@ -48,13 +47,48 @@ </transf> </goal> <goal name="to_nat_of_zero" proved="true"> - <proof prover="1" timelimit="30" edited="bitvector_BitVector_to_nat_of_zero_1.v"><result status="valid" time="1.01"/></proof> + <transf name="intros" proved="true" arg1="b,j"> + <goal name="to_nat_of_zero.0" proved="true"> + <transf name="induction" proved="true" arg1="j"> + <goal name="to_nat_of_zero.0.0" expl="base case" proved="true"> + <proof prover="5"><result status="valid" time="0.09"/></proof> + </goal> + <goal name="to_nat_of_zero.0.1" expl="recursive case" proved="true"> + <proof prover="5"><result status="valid" time="0.15"/></proof> + </goal> + </transf> + </goal> + </transf> </goal> - <goal name="to_nat_of_one" proved="true"> - <proof prover="1" timelimit="5" edited="bitvector_BitVector_to_nat_of_one_1.v"><result status="valid" time="0.96"/></proof> + <goal name="VC to_nat_of_one" expl="VC for to_nat_of_one" proved="true"> + <transf name="split_vc" proved="true" > + <goal name="VC to_nat_of_one.0" expl="variant decrease" proved="true"> + <proof prover="5"><result status="valid" time="0.02"/></proof> + </goal> + <goal name="VC to_nat_of_one.1" expl="precondition" proved="true"> + <proof prover="5"><result status="valid" time="0.03"/></proof> + </goal> + <goal name="VC to_nat_of_one.2" expl="precondition" proved="true"> + <proof prover="5"><result status="valid" time="0.06"/></proof> + </goal> + <goal name="VC to_nat_of_one.3" expl="postcondition" proved="true"> + <proof prover="5"><result status="valid" time="0.16"/></proof> + </goal> + </transf> </goal> <goal name="to_nat_sub_footprint" proved="true"> - <proof prover="1" edited="bitvector_BitVector_to_nat_sub_footprint_1.v"><result status="valid" time="1.40"/></proof> + <transf name="intros" proved="true" arg1="b1,b2,j"> + <goal name="to_nat_sub_footprint.0" proved="true"> + <transf name="induction" proved="true" arg1="j"> + <goal name="to_nat_sub_footprint.0.0" expl="base case" proved="true"> + <proof prover="5"><result status="valid" time="0.13"/></proof> + </goal> + <goal name="to_nat_sub_footprint.0.1" expl="recursive case" proved="true"> + <proof prover="5"><result status="valid" time="0.36"/></proof> + </goal> + </transf> + </goal> + </transf> </goal> <goal name="nth_from_int_low_even" proved="true"> <proof prover="2"><result status="valid" time="0.02" steps="68"/></proof> @@ -86,7 +120,7 @@ <proof prover="3"><result status="valid" time="0.11"/></proof> </goal> <goal name="nth_from_int2c_plus_pow2" proved="true"> - <proof prover="4"><result status="valid" time="0.16" steps="118"/></proof> + <proof prover="4" timelimit="1"><result status="valid" time="0.16" steps="118"/></proof> </goal> </theory> <theory name="BV32" proved="true"> @@ -138,83 +172,78 @@ <proof prover="2"><result status="valid" time="0.05" steps="70"/></proof> <proof prover="3" timelimit="3"><result status="valid" time="0.07"/></proof> <proof prover="6"><result status="valid" time="0.05"/></proof> - <proof prover="9" timelimit="9"><result status="valid" time="2.52"/></proof> + <proof prover="9" timelimit="9"><result status="valid" time="2.90"/></proof> <proof prover="10"><result status="valid" time="0.53"/></proof> </goal> <goal name="to_nat_0x00000000" proved="true"> - <proof prover="2"><result status="valid" time="0.04" steps="78"/></proof> - <proof prover="3" timelimit="3"><result status="valid" time="0.10"/></proof> <proof prover="6"><result status="valid" time="0.05"/></proof> - <proof prover="9"><result status="valid" time="2.84"/></proof> <proof prover="10"><result status="valid" time="0.52"/></proof> </goal> <goal name="to_nat_0x00000001" proved="true"> - <proof prover="6" timelimit="120"><result status="valid" time="85.20"/></proof> + <proof prover="4"><result status="valid" time="8.30" steps="2706"/></proof> </goal> <goal name="to_nat_0x00000003" proved="true"> - <proof prover="6" timelimit="120"><result status="valid" time="64.88"/></proof> + <proof prover="6" timelimit="120"><result status="valid" time="83.02"/></proof> </goal> <goal name="to_nat_0x00000007" proved="true"> - <proof prover="6" timelimit="60" memlimit="4000"><result status="valid" time="54.54"/></proof> + <proof prover="4"><result status="valid" time="14.00" steps="2976"/></proof> </goal> <goal name="to_nat_0x0000000F" proved="true"> - <proof prover="6" timelimit="120"><result status="valid" time="42.60"/></proof> + <proof prover="4"><result status="valid" time="10.91" steps="2846"/></proof> </goal> <goal name="to_nat_0x0000001F" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="37.94"/></proof> + <proof prover="4"><result status="valid" time="9.80" steps="2687"/></proof> </goal> <goal name="to_nat_0x0000003F" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="31.43"/></proof> + <proof prover="4"><result status="valid" time="9.26" steps="2537"/></proof> </goal> <goal name="to_nat_0x0000007F" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="26.21"/></proof> + <proof prover="4"><result status="valid" time="8.38" steps="2389"/></proof> </goal> <goal name="to_nat_0x000000FF" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="21.03"/></proof> + <proof prover="4"><result status="valid" time="8.33" steps="2309"/></proof> </goal> <goal name="to_nat_0x000001FF" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="15.80"/></proof> + <proof prover="4"><result status="valid" time="7.41" steps="2187"/></proof> </goal> <goal name="to_nat_0x000003FF" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="13.72"/></proof> + <proof prover="4"><result status="valid" time="6.57" steps="2046"/></proof> </goal> <goal name="to_nat_0x000007FF" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="11.20"/></proof> + <proof prover="4"><result status="valid" time="5.61" steps="1914"/></proof> </goal> <goal name="to_nat_0x00000FFF" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="8.76"/></proof> + <proof prover="4"><result status="valid" time="5.33" steps="1784"/></proof> </goal> <goal name="to_nat_0x00001FFF" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="7.74"/></proof> + <proof prover="4"><result status="valid" time="5.03" steps="1718"/></proof> </goal> <goal name="to_nat_0x00003FFF" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="4.70"/></proof> + <proof prover="4"><result status="valid" time="4.23" steps="1603"/></proof> </goal> <goal name="to_nat_0x00007FFF" proved="true"> - <proof prover="6" timelimit="30" memlimit="4000"><result status="valid" time="4.44"/></proof> + <proof prover="4"><result status="valid" time="3.64" steps="1480"/></proof> </goal> <goal name="to_nat_0x0000FFFF" proved="true"> - <proof prover="6"><result status="valid" time="3.03"/></proof> + <proof prover="4"><result status="valid" time="3.14" steps="1364"/></proof> </goal> <goal name="to_nat_0x0001FFFF" proved="true"> - <proof prover="6"><result status="valid" time="2.38"/></proof> + <proof prover="4"><result status="valid" time="2.96" steps="1259"/></proof> </goal> <goal name="to_nat_0x0003FFFF" proved="true"> - <proof prover="6"><result status="valid" time="1.80"/></proof> + <proof prover="6" timelimit="30"><result status="valid" time="2.26"/></proof> </goal> <goal name="to_nat_0x0007FFFF" proved="true"> - <proof prover="6"><result status="valid" time="1.34"/></proof> + <proof prover="6" timelimit="30"><result status="valid" time="1.57"/></proof> </goal> <goal name="to_nat_0x000FFFFF" proved="true"> - <proof prover="6"><result status="valid" time="0.94"/></proof> + <proof prover="6" timelimit="30"><result status="valid" time="1.16"/></proof> </goal> <goal name="to_nat_0x00FFFFFF" proved="true"> - <proof prover="6"><result status="valid" time="0.28"/></proof> + <proof prover="4" timelimit="1"><result status="valid" time="0.92" steps="665"/></proof> </goal> <goal name="to_nat_0xFFFFFFFF" proved="true"> - <proof prover="2"><result status="valid" time="0.04" steps="78"/></proof> - <proof prover="3" timelimit="3"><result status="valid" time="0.12"/></proof> - <proof prover="6"><result status="valid" time="0.05"/></proof> + <proof prover="5"><result status="valid" time="0.10"/></proof> </goal> </theory> </file> diff --git a/examples/bitvectors/bitvector/why3shapes.gz b/examples/bitvectors/bitvector/why3shapes.gz index a28489978be6e586d8b23f3dbab27d7d08c66d06..e1a3048aa0bad9be2ecbb1bb366b9ee62ae59ed4 100644 GIT binary patch literal 1982 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 N|EyZ0;WJSN1_1Mi-P`~G literal 1556 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 -- GitLab