ArrayInt_false
ArrayInt, incorrect version
function get(self: Ref, pos: Int): Int
function length(self: Ref): Int
function sgn(i: Int) : Int
ensures i > 0 ==> result == 1
ensures i == 0 ==> result == 0
ensures i < 0 ==> result == -1
method compare(o1: Ref, o2: Ref) returns (res: Int)
requires rel(o1, 0) == rel(o2, 1) && rel(o2, 0) == rel(o1, 1)
ensures (sgn(rel(res, 0)) == -sgn(rel(res, 1))) // P1
{
var returned : Bool
returned := false
var index : Int
var aentry : Int
var bentry : Int
index := 0
while (index < length(o1) && index < length(o2) && !returned)
invariant (rel(o1, 0) == rel(o2, 1) && rel(o2, 0) == rel(o1, 1)) ==> (rel(returned, 0) == rel(returned, 1))
invariant (rel(o1, 0) == rel(o2, 1) && rel(o2, 0) == rel(o1, 1)) ==> (rel(index, 0) == rel(index, 1))
invariant (rel(o1, 0) == rel(o2, 1) && rel(o2, 0) == rel(o1, 1)) ==> ((rel(returned, 0) && rel(returned, 1)) ==> (sgn(rel(res, 0)) == -sgn(rel(res, 1))))
{
aentry := get(o1, index)
bentry := get(o2, index)
if (aentry < bentry) {
returned := true
res := -1
}
if (!returned && aentry > bentry) {
returned := true
res := 1
}
if (!returned) {
index := index + 1
}
}
if (!returned) {
res := 0
returned := true
}
assert returned
}