Chromosome_true
Chromosome, correct version
function getScore(self: Ref, num: Int): Int
function isNull(self: Ref): Int
method Int_compare(o1: Int, o2: Int) returns (res: Int)
ensures (rel(o1, 0) == rel(o1, 1) && rel(o2, 0) == rel(o1, 2) && rel(o2, 2) == rel(o2, 1) && rel(res, 0) == 0) ==> (sgn(rel(res, 1)) == sgn(rel(res, 2)))
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 isNull(o1) != 0
requires rel(o1, 0) == rel(o1, 1) && rel(o2, 0) == rel(o1, 2) && rel(o2, 2) == rel(o2, 1)
ensures (rel(res, 0) == 0) ==> (sgn(rel(res, 1)) == sgn(rel(res, 2))) // P3
{
var returned : Bool
returned := false
res := 0
if (isNull(o2) == 0) {
returned := true
res := 1
}
if (!returned) {
var comp : Int
var i : Int
comp := 0
i := 0
while (i < 5 && !returned)
invariant (!rel(returned, 0) && !rel(returned, 1)) ==> (rel(i, 0) == rel(i, 1))
invariant (!rel(returned, 2) && !rel(returned, 1)) ==> (rel(i, 2) == rel(i, 1))
invariant (!rel(returned, 0) && !rel(returned, 2)) ==> (rel(i, 0) == rel(i, 2))
invariant (!rel(returned, 0) && rel(returned, 1)) ==> (rel(returned, 2) && sgn(rel(res, 1)) == sgn(rel(res, 2)))
invariant (!rel(returned, 0) && rel(returned, 2)) ==> (rel(returned, 1) && sgn(rel(res, 2)) == sgn(rel(res, 1)))
invariant returned ==> res != 0
{
comp := Int_compare(getScore(o1, i), getScore(o2, i))
if (comp != 0) {
res := comp
returned := true
}else{
i := i + 1
}
}
if (!returned) {
res := 0
returned := true
}
}
assert returned
}