FileItem_true
FileItem, correct version
function getFileName(self: Ref) : Ref
function sectorCode(self: Ref) : Int
function industryCode(self: Ref) : 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 FileItem_compare(o1: Ref, o2: Ref) 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
if (o1 == null) {
if (o2 == null) {
return(0)
} else {
return(1) // this will put null in the end
}
} else{
if (o2 == null) {
return(-1)
}else {
var n1 : Ref
n1 := getFileName(o1);
var n2 : Ref
n2 := getFileName(o2);
if (n1 == null) {
if (n2 == null) {
return(0)
} else {
return(1) // this will put null names after non null names
}
} else {
if (n2 == null) {
return(-1)
}else{
var tmp : Int
tmp := FileItem_compare(n1, n2)
return(tmp)
}
}
}
}
assert returned
}