Commit 9999d201 authored by Clément Fumex's avatar Clément Fumex

Work on hackers-deligh & queens examples.

Add int.NumOf realization.
parent 72521ec5
......@@ -840,7 +840,7 @@ ifeq (@enable_coq_support@,yes)
ifeq (@enable_coq_libs@,yes)
COQLIBS_INT_FILES = Abs ComputerDivision Div2 EuclideanDivision Int MinMax Power
COQLIBS_INT_FILES = Abs ComputerDivision Div2 EuclideanDivision Int MinMax Power NumOf
COQLIBS_INT_ALL_FILES = Exponentiation $(COQLIBS_INT_FILES)
COQLIBS_INT = $(addprefix lib/coq/int/, $(COQLIBS_INT_ALL_FILES))
......
This diff is collapsed.
......@@ -2,9 +2,12 @@
*second edition *)
module Hackers_delight
use import int.Int
use import bool.Bool
(** {2 Utilitaries}
We introduce in this theory two functions that will help us
write properties on bit-manipulating procedures *)
theory Utils
use import bv.BV32
constant one : t = of_int 1
......@@ -14,19 +17,8 @@ module Hackers_delight
function max (x y : t) : t = (if ult x y then y else x)
function min (x y : t) : t = (if ult x y then x else y)
(** {2 ASCII cheksum }
In the beginning the encoding of an ascii character was done on 8
bits: the first 7 bits were used for the carracter itself while
the 8th bit was used as a cheksum: a mean to detect errors. The
cheksum value was the binary sum of the 7 other bits, allowing the
detections of any change of an odd number of bits in the initial
value. Let's prove it! *)
(** {6 Hamming distance } *)
(** In order to express these properties we start by introducing a
function that returns the number of 1-bit in a bitvector (p.82)
*)
(** We start by introducing a function that returns the number of
1-bit in a bitvector (p.82) *)
function count (bv : t) : t =
let x = sub bv (bw_and (lsr_bv bv one) (of_int 0x55555555)) in
......@@ -38,12 +30,34 @@ module Hackers_delight
let x = add x (lsr_bv x (of_int 16)) in
bw_and x (of_int 0x0000003F)
(** We can verify our definition by, first, checking that there are no
1-bits in the bitvector "zero": *)
(** We then define the associated notion of distance, namely
"Hamming distance", that counts the number of bits that differ
between two bitvectors. *)
function hammingD (a b : t) : t = count (bw_xor a b)
end
(** {2 Correctness of Utils}
Before using our two functions let's first check that they are correct !
*)
module Utils_Spec
use import int.Int
use import int.NumOf
use import bv.BV32
use import Utils
(** {6 count correctness } *)
(** Let's start by checking that there are no 1-bits in the
bitvector "zero": *)
lemma countZero: count zero = zero
(** And then, for b a bitvector with n 1-bits, checking that if its
lemma numOfZero: NumOf.numof (\i. nth zero i) 0 32 = 0
(** Now, for b a bitvector with n 1-bits, we check that if its
first bit is 0 then shifting b by one on the right doesn't
change the number of 1-bit. And if its first bit is one, then
there are n-1 1-bits in the shifting of b by one on the right. *)
......@@ -52,18 +66,6 @@ module Hackers_delight
(not (nth_bv b zero) <-> count (lsr_bv b one) = count b) /\
(nth_bv b zero <-> count (lsr_bv b one) = sub (count b) one)
use import int.NumOf
lemma tointzero: to_uint zero = 0
lemma tointone: to_uint one = 1
lemma numOfZero: NumOf.numof (\i. nth zero i) 0 32 = 0
lemma numof_change_equiv:
forall p1 p2: int -> bool, a b: int.
(forall j: int. a <= j < b -> p1 j <-> p2 j) ->
numof p2 a b = numof p1 a b
let rec lemma numof_shift (p q : int -> bool) (a b k: int) : unit
requires {forall i. q i = p (i + k)}
variant {b - a}
......@@ -72,15 +74,14 @@ module Hackers_delight
if a < b then
numof_shift p q a (b-1) k
let rec lemma countAux (bv : t) : unit
let rec lemma countSpec_Aux (bv : t) : unit
variant {bv with ult}
ensures {to_uint (count bv) = NumOf.numof (nth bv) 0 32}
=
if bv = zero then ()
else
begin
countAux (lsr_bv bv one);
countSpec_Aux (lsr_bv bv one);
assert {
let x = (if nth_bv bv zero then 1 else 0) in
let f = nth bv in
......@@ -93,32 +94,33 @@ module Hackers_delight
}
end
(** With these lemmas, we can now prove the correctness property of
count: *)
lemma countSpec: forall b. to_uint (count b) = NumOf.numof
(nth b) 0 32
(** We then define the associated notion of distance, namely
"Hamming distance", that counts the number of bits that differ
between two bitvectors. *)
function hammingD (a b : t) : t = count (bw_xor a b)
predicate nth_diff (a b : t) (i : int) = nth a i <> nth b i
(** {6 hammingD correctness } *)
use HighOrd as HO
function fun_or (f g : HO.pred 'a) : HO.pred 'a = \x. f x \/ g x
predicate nth_diff (a b : t) (i : int) = nth a i <> nth b i
(** The correctness property can be express as the following: *)
let lemma hamming_spec (a b : t) : unit
ensures {to_uint (hammingD a b) = NumOf.numof (nth_diff a b) 0 32}
=
assert { forall i. 0 <= i < 32 -> nth (bw_xor a b) i <-> (nth_diff a b i) }
(** It is indeed a distance in the algebraic sense: *)
(** In addition we can prove that it is indeed a distance in the
algebraic sens: *)
lemma symmetric: forall a b. hammingD a b = hammingD b a
lemma separation: forall a b. hammingD a b = zero <-> a = b
function fun_or (f g : HO.pred 'a) : HO.pred 'a = \x. f x \/ g x
let rec lemma numof_or (p q : int -> bool) (a b: int) : unit
variant {b - a}
ensures {numof (fun_or p q) a b <= numof p a b + numof q a b}
......@@ -133,16 +135,32 @@ module Hackers_delight
numof (fun_or (nth_diff a b) (nth_diff b c)) 0 32 >=
numof (nth_diff a c) 0 32}
lemma triangleInequality: forall a b c. (* not proved ! :-( *)
lemma triangleInequality: forall a b c.
uge (add (hammingD a b) (hammingD b c)) (hammingD a c)
end
module Hackers_delight
use import int.Int
use import int.NumOf
use import bool.Bool
use import bv.BV32
use import Utils
(** {2 ASCII cheksum }
In the beginning the encoding of an ascii character was done on 8
bits: the first 7 bits were used for the carracter itself while
the 8th bit was used as a cheksum: a mean to detect errors. The
cheksum value was the binary sum of the 7 other bits, allowing the
detections of any change of an odd number of bits in the initial
value. Let's prove it! *)
(** {6 Checksum computation and correctness } *)
(** A ascii character is valid if its number of bits is even.
(Remember that a binary number is odd if and only if its first
bit is 1) *)
predicate validAscii (b : t) = not (nth_bv (count b) zero)
predicate validAscii (b : t) = (nth_bv (count b) zero) = False
(** The ascii checksum aim is to make any character valid in the
sens that we just defined. One way to implement it is to count
......
......@@ -7,210 +7,251 @@
<prover id="2" name="Z3" version="4.3.2" timelimit="5" memlimit="1000"/>
<prover id="3" name="CVC3" version="2.4.1" timelimit="5" memlimit="1000"/>
<file name="../hackers-delight.mlw" expanded="true">
<theory name="Hackers_delight" sum="9c3b657273e4ea082027d6ac7909b8f1" expanded="true">
<theory name="Utils" sum="d41d8cd98f00b204e9800998ecf8427e" expanded="true">
</theory>
<theory name="Utils_Spec" sum="3967722ffb6389d883275ccf0879b34f" expanded="true">
<goal name="countZero" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.05"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.09"/></proof>
</goal>
<goal name="countStep" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="4.98"/></proof>
</goal>
<goal name="tointzero" expanded="true">
<proof prover="1" timelimit="15"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="tointone" expanded="true">
<proof prover="1" timelimit="15"><result status="valid" time="0.01"/></proof>
<proof prover="1"><result status="valid" time="0.03"/></proof>
<proof prover="2"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="numOfZero" expanded="true">
<proof prover="1" timelimit="15"><result status="timeout" time="16.00"/></proof>
<proof prover="0"><result status="valid" time="0.87" steps="228"/></proof>
<proof prover="3"><result status="valid" time="0.78"/></proof>
</goal>
<goal name="numof_change_equiv" expanded="true">
<proof prover="0" timelimit="15"><result status="valid" time="1.37" steps="587"/></proof>
<proof prover="1" timelimit="15"><result status="valid" time="0.10"/></proof>
<goal name="countStep" expanded="true">
<proof prover="1" timelimit="30"><result status="valid" time="5.82"/></proof>
</goal>
<goal name="numof_shift" expanded="true">
<proof prover="0" timelimit="15" obsolete="true"><result status="timeout" time="14.85"/></proof>
<proof prover="1" timelimit="15" obsolete="true"><result status="timeout" time="16.02"/></proof>
<proof prover="2" timelimit="15" obsolete="true"><result status="timeout" time="14.99"/></proof>
<proof prover="3" timelimit="15" obsolete="true"><result status="timeout" time="14.94"/></proof>
<goal name="WP_parameter numof_shift" expl="VC for numof_shift" expanded="true">
<proof prover="1"><result status="valid" time="0.24"/></proof>
<proof prover="2"><result status="valid" time="0.04"/></proof>
<proof prover="3"><result status="valid" time="0.34"/></proof>
</goal>
<goal name="WP_parameter countAux" expl="VC for countAux" expanded="true">
<goal name="WP_parameter countSpec_Aux" expl="VC for countSpec_Aux" expanded="true">
<transf name="split_goal_wp" expanded="true">
<goal name="WP_parameter countAux.1" expl="1. postcondition">
<proof prover="0" timelimit="15"><result status="valid" time="0.24" steps="137"/></proof>
<proof prover="1" timelimit="15"><result status="valid" time="0.08"/></proof>
<goal name="WP_parameter countSpec_Aux.1" expl="1. postcondition" expanded="true">
<proof prover="0"><result status="valid" time="0.89" steps="265"/></proof>
<proof prover="1"><result status="valid" time="0.04"/></proof>
<proof prover="3"><result status="valid" time="0.61"/></proof>
</goal>
<goal name="WP_parameter countAux.2" expl="2. variant decrease">
<proof prover="1" timelimit="15"><result status="valid" time="0.03"/></proof>
<goal name="WP_parameter countSpec_Aux.2" expl="2. variant decrease" expanded="true">
<proof prover="1"><result status="valid" time="0.02"/></proof>
<proof prover="2"><result status="valid" time="0.02"/></proof>
<proof prover="3"><result status="valid" time="0.99"/></proof>
</goal>
<goal name="WP_parameter countAux.3" expl="3. assertion" expanded="true">
<goal name="WP_parameter countSpec_Aux.3" expl="3. assertion" expanded="true">
<transf name="split_goal_wp" expanded="true">
<goal name="WP_parameter countAux.3.1" expl="1. assertion">
<proof prover="0"><undone/></proof>
<goal name="WP_parameter countSpec_Aux.3.1" expl="1. assertion" expanded="true">
<proof prover="3"><result status="valid" time="1.86"/></proof>
</goal>
<goal name="WP_parameter countAux.3.2" expl="2. assertion">
<proof prover="0"><undone/></proof>
<proof prover="3"><undone/></proof>
<goal name="WP_parameter countSpec_Aux.3.2" expl="2. assertion" expanded="true">
<proof prover="3"><result status="valid" time="0.60"/></proof>
</goal>
<goal name="WP_parameter countAux.3.3" expl="3. assertion">
<goal name="WP_parameter countSpec_Aux.3.3" expl="3. assertion" expanded="true">
<proof prover="0"><result status="valid" time="0.90" steps="158"/></proof>
</goal>
<goal name="WP_parameter countAux.3.4" expl="4. assertion">
<proof prover="3"><undone/></proof>
<goal name="WP_parameter countSpec_Aux.3.4" expl="4. assertion" expanded="true">
<proof prover="3" timelimit="15"><result status="valid" time="7.26"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter countAux.4" expl="4. postcondition" expanded="true">
<proof prover="1" timelimit="15" obsolete="true"><undone/></proof>
<goal name="WP_parameter countSpec_Aux.4" expl="4. postcondition" expanded="true">
<proof prover="1"><result status="valid" time="0.57"/></proof>
</goal>
</transf>
</goal>
<goal name="countSpec" expanded="true">
<proof prover="0"><result status="valid" time="0.04" steps="76"/></proof>
<proof prover="1"><result status="valid" time="0.08"/></proof>
<proof prover="2"><result status="valid" time="0.01"/></proof>
<proof prover="3"><result status="valid" time="0.06"/></proof>
<proof prover="0"><result status="valid" time="0.05" steps="72"/></proof>
<proof prover="1"><result status="valid" time="0.10"/></proof>
<proof prover="2"><result status="valid" time="0.00"/></proof>
<proof prover="3"><result status="valid" time="0.04"/></proof>
</goal>
<goal name="WP_parameter hamming_spec" expl="VC for hamming_spec" expanded="true">
<transf name="split_goal_wp" expanded="true">
<goal name="WP_parameter hamming_spec.1" expl="1. assertion" expanded="true">
<proof prover="0"><result status="valid" time="0.25" steps="216"/></proof>
<proof prover="3"><result status="valid" time="0.06"/></proof>
</goal>
<goal name="WP_parameter hamming_spec.2" expl="2. postcondition" expanded="true">
<proof prover="2"><result status="valid" time="0.14"/></proof>
</goal>
</transf>
</goal>
<goal name="symmetric">
<proof prover="1" obsolete="true"><result status="valid" time="0.02"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.01"/></proof>
<goal name="symmetric" expanded="true">
<proof prover="1"><result status="valid" time="0.11"/></proof>
<proof prover="2"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="separation" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.06"/></proof>
<proof prover="1"><result status="valid" time="0.39"/></proof>
<proof prover="2"><result status="valid" time="0.12"/></proof>
</goal>
<goal name="WP_parameter numof_or" expl="VC for numof_or" expanded="true">
<proof prover="1"><result status="valid" time="0.53"/></proof>
<proof prover="2"><result status="valid" time="0.06"/></proof>
<proof prover="3"><result status="valid" time="0.30"/></proof>
</goal>
<goal name="WP_parameter triangleInequalityInt" expl="VC for triangleInequalityInt" expanded="true">
<transf name="split_goal_wp" expanded="true">
<goal name="WP_parameter triangleInequalityInt.1" expl="1. assertion" expanded="true">
<transf name="split_goal_wp" expanded="true">
<goal name="WP_parameter triangleInequalityInt.1.1" expl="1. VC for triangleInequalityInt" expanded="true">
<proof prover="0"><result status="valid" time="0.04" steps="72"/></proof>
<proof prover="1"><result status="valid" time="0.06"/></proof>
<proof prover="2"><result status="valid" time="0.01"/></proof>
<proof prover="3"><result status="valid" time="0.04"/></proof>
</goal>
<goal name="WP_parameter triangleInequalityInt.1.2" expl="2. VC for triangleInequalityInt" expanded="true">
<proof prover="2"><result status="valid" time="0.17"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter triangleInequalityInt.2" expl="2. postcondition" expanded="true">
<proof prover="0"><result status="valid" time="0.05" steps="79"/></proof>
<proof prover="2"><result status="valid" time="0.04"/></proof>
<proof prover="3"><result status="valid" time="0.09"/></proof>
</goal>
</transf>
</goal>
<goal name="triangleInequality" expanded="true">
<proof prover="0" obsolete="true"><result status="timeout" time="4.88"/></proof>
<proof prover="1" obsolete="true"><result status="timeout" time="4.87"/></proof>
<proof prover="2" obsolete="true"><result status="timeout" time="5.00"/></proof>
<proof prover="1" timelimit="15"><result status="valid" time="2.35"/></proof>
</goal>
</theory>
<theory name="Hackers_delight" sum="c8ec539e41c47d4d821a25e51a788371" expanded="true">
<goal name="WP_parameter ascii" expl="VC for ascii" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.04"/></proof>
<proof prover="1"><result status="valid" time="0.09"/></proof>
<proof prover="2"><result status="valid" time="0.04"/></proof>
</goal>
<goal name="asciiProp" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="1.41"/></proof>
<proof prover="1" timelimit="20"><result status="valid" time="0.85"/></proof>
<proof prover="2" timelimit="20"><result status="valid" time="2.11"/></proof>
</goal>
<goal name="iso" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.40"/></proof>
<proof prover="1"><result status="valid" time="0.43"/></proof>
</goal>
<goal name="grayIsGray" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.05"/></proof>
<proof prover="1"><result status="valid" time="0.09"/></proof>
</goal>
<goal name="nthGray" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.05"/></proof>
<proof prover="1"><result status="valid" time="0.05"/></proof>
<proof prover="3"><result status="valid" time="2.73"/></proof>
</goal>
<goal name="lastNthGray" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.04"/></proof>
<proof prover="1"><result status="valid" time="0.04"/></proof>
<proof prover="3"><result status="valid" time="2.22"/></proof>
</goal>
<goal name="nthBinary" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.48"/></proof>
<proof prover="1" timelimit="30"><result status="valid" time="0.38"/></proof>
</goal>
<goal name="evenOdd" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.14"/></proof>
<proof prover="1"><result status="valid" time="0.14"/></proof>
</goal>
<goal name="DM1" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.01"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.01"/></proof>
<proof prover="1"><result status="valid" time="0.01"/></proof>
<proof prover="2"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="DM2" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.05"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.01"/></proof>
<proof prover="1"><result status="valid" time="0.05"/></proof>
<proof prover="2"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="DM3" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.07"/></proof>
<proof prover="1"><result status="valid" time="0.07"/></proof>
<proof prover="2"><result status="valid" time="0.04"/></proof>
</goal>
<goal name="DM4" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.11"/></proof>
<proof prover="1"><result status="valid" time="0.11"/></proof>
</goal>
<goal name="DM5" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.10"/></proof>
<proof prover="1"><result status="valid" time="0.10"/></proof>
</goal>
<goal name="DM6" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.07"/></proof>
<proof prover="1"><result status="valid" time="0.07"/></proof>
</goal>
<goal name="DM7" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.08"/></proof>
<proof prover="1"><result status="valid" time="0.08"/></proof>
</goal>
<goal name="DM8" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.09"/></proof>
<proof prover="1"><result status="valid" time="0.09"/></proof>
</goal>
<goal name="DMtest" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.07"/></proof>
<proof prover="1"><result status="valid" time="0.07"/></proof>
<proof prover="2"><result status="valid" time="0.18"/></proof>
</goal>
<goal name="Aa" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.06"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.06"/></proof>
<proof prover="2"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="Ac" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.07"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.07"/></proof>
<proof prover="2"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="Ad" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.06"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.06"/></proof>
<proof prover="2"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="Ae" expanded="true">
<proof prover="0" obsolete="true"><result status="valid" time="0.05" steps="72"/></proof>
<proof prover="1" obsolete="true"><result status="valid" time="0.04"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.00"/></proof>
<proof prover="0"><result status="valid" time="0.05" steps="74"/></proof>
<proof prover="1"><result status="valid" time="0.04"/></proof>
<proof prover="2"><result status="valid" time="0.00"/></proof>
<proof prover="3"><result status="valid" time="0.08"/></proof>
</goal>
<goal name="Af" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.03"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.09"/></proof>
<proof prover="1"><result status="valid" time="0.03"/></proof>
<proof prover="2"><result status="valid" time="0.09"/></proof>
</goal>
<goal name="Aj" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.02"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.00"/></proof>
<proof prover="1"><result status="valid" time="0.02"/></proof>
<proof prover="2"><result status="valid" time="0.00"/></proof>
</goal>
<goal name="An" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.12"/></proof>
<proof prover="1"><result status="valid" time="0.12"/></proof>
</goal>
<goal name="Ao" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.13"/></proof>
</goal>
<goal name="Aq" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.08"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.08"/></proof>
<proof prover="2"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="At" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.12"/></proof>
<proof prover="1"><result status="valid" time="0.12"/></proof>
</goal>
<goal name="Au" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.13"/></proof>
<proof prover="1"><result status="valid" time="0.13"/></proof>
</goal>
<goal name="Av" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.12"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.03"/></proof>
<proof prover="1"><result status="valid" time="0.12"/></proof>
<proof prover="2"><result status="valid" time="0.03"/></proof>
</goal>
<goal name="IE1" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.02"/></proof>
<proof prover="1"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="IE2" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.04"/></proof>
<proof prover="1"><result status="valid" time="0.04"/></proof>
</goal>
<goal name="IEa" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.04"/></proof>
<proof prover="1"><result status="valid" time="0.04"/></proof>
</goal>
<goal name="IEb" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.04"/></proof>
<proof prover="1"><result status="valid" time="0.04"/></proof>
</goal>
<goal name="IE3" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.03"/></proof>
<proof prover="1"><result status="valid" time="0.03"/></proof>
</goal>
<goal name="IE4" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.04"/></proof>
<proof prover="1"><result status="valid" time="0.04"/></proof>
</goal>
<goal name="SR1" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.04"/></proof>
<proof prover="1"><result status="valid" time="0.04"/></proof>
</goal>
<goal name="RS_left" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.11"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.01"/></proof>
<proof prover="1"><result status="valid" time="0.11"/></proof>
<proof prover="2"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="RS_right" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.09"/></proof>
<proof prover="2" obsolete="true"><result status="valid" time="0.01"/></proof>
<proof prover="1"><result status="valid" time="0.09"/></proof>
<proof prover="2"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="BP" expanded="true">
<proof prover="1" obsolete="true"><result status="valid" time="0.10"/></proof>
<proof prover="1"><result status="valid" time="0.10"/></proof>
</goal>
</theory>
</file>
......
......@@ -7,148 +7,159 @@
<prover id="2" name="CVC4" version="1.4" timelimit="5" memlimit="1000"/>
<prover id="3" name="Z3" version="4.3.2" timelimit="5" memlimit="1000"/>
<file name="../bitvectors.why" expanded="true">
<theory name="TestBV" sum="c1af0d73b67219351e5904090236ec3e" expanded="true">
<goal name="g1" expanded="true">
<theory name="TestBV" sum="d35077f1ef4ed4360e683835f5410ec4" expanded="true">
<goal name="g1">
<proof prover="2"><result status="valid" time="0.01"/></proof>
<proof prover="3"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="f1" expanded="true">
<proof prover="0"><result status="timeout" time="4.96"/></proof>
<goal name="f1">
<proof prover="0"><result status="timeout" time="3.02"/></proof>
<proof prover="1"><result status="timeout" time="4.98"/></proof>
<proof prover="2"><result status="unknown" time="0.01"/></proof>
<proof prover="3"><result status="timeout" time="4.97"/></proof>
</goal>
<goal name="g2" expanded="true">
<goal name="g2">
<proof prover="2"><result status="valid" time="0.01"/></proof>
<proof prover="3"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="f2" expanded="true">
<proof prover="0"><result status="timeout" time="4.84"/></proof>
<goal name="f2">
<proof prover="0"><result status="timeout" time="2.88"/></proof>
<proof prover="1"><result status="timeout" time="4.97"/></proof>
<proof prover="2"><result status="unknown" time="0.01"/></proof>
<proof prover="3"><result status="timeout" time="5.01"/></proof>
</goal>
<goal name="g3" expanded="true">
<goal name="g3">