Solution_false
Solution, incorrect version
function getValue(self: Ref) : Int
function solutionCost(self: Ref) : Int
function target() : 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
function abs(i: Int) : Int
{
i < 0 ? -i : i
}
method compare(o1: Ref, o2: Ref) returns (res: Int)
requires rel(o2, 0) == rel(o1, 1) && rel(o1, 2) == rel(o1, 0) && rel(o2, 2) == rel(o2, 1)
ensures ((rel(res, 0) > 0) && rel(res, 1) > 0) ==> (rel(res, 2) > 0) // P2
{
var returned : Bool
returned := false
var v1 : Int
var v2 : Int
v1 := getValue(o1)
v2 := getValue(o2);
if ((v1 == -1) && (v2 == -1)){
return(0)
}elseif (v1 == -1){
return(1)
}elseif (v2 == -1){
return(-1)
}elseif (v1 == v2){
return(sgn(solutionCost(o1) - solutionCost(o2)))
}
else {
return(sgn(abs(target()- v1) - abs(target() - v2)));
}
assert returned
}