Container_true
ArrayInt, correct version
function departureTimeIsBefore(self: Ref, t: Int) : Bool
function departureTime(self: Ref) : Int
function departureMaxDuration(self: Ref) : Int
function departureTransportCompany(self: Ref) : Int
function departureTransportType(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 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 rv : Int
// Times
rv := Int_compare(departureTime(o1), departureTime(o2));
if (rv == 0) {
// Duration
if (departureMaxDuration(o1) < departureMaxDuration(o2)) {
rv := -1;
}
else{
if (departureMaxDuration(o1) > departureMaxDuration(o2)) {
rv := 1;
}
else {
// Transport company
rv := Int_compare(departureTransportCompany(o1), departureTransportCompany(o2));
if (rv == 0) {
// Transport type
rv := Int_compare(departureTransportType(o1), departureTransportType(o2));
}
}
}
}
return(rv)
assert returned
}