NameComparator_false
NameComparator, incorrect version
function Name(self: Ref) : Int
function strNames(): Seq[Int]
define return(x) {
assert !returned
returned := true
res := x
}
function sgn(i: Int) : Int
ensures i > 0 ==> result == 1
ensures i == 0 ==> result == 0
ensures i < 0 ==> result == -1
method Int_compare(o1: Int, o2: Int) returns (res: Int)
ensures (rel(o1, 0) == rel(o2, 1) && rel(o2, 0) == rel(o1, 1)) ==> (sgn(rel(res, 0)) == -sgn(rel(res, 1))) // P1
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 x : Int
x := Name(o1)
var y: Int
y := Name(o2)
var i : Int
i :=0
var currentName : Int
while(i < |strNames()| && !returned)
invariant i >= 0
{
currentName := strNames()[i]
if(currentName == x) {
return(1)
}else{
if(currentName == y) {
return(-1)
}else{
i := i + 1
}
}
}
if (!returned) {
var tmp : Int
tmp := Int_compare(x,y)
return(tmp)
}
assert returned
}