CatBPos_false
CatBPos, incorrect version
function getHdopBPosGetTime(self: Ref) : Int
function getBPosGetTime(self: Ref) : Int
function getBPosGetStat(self: Ref) : Int
//function getBPosIsDeparture(self: Ref) : Bool
function getBPosIsVacation(self: Ref) : Bool
function getBPosIsDeparture(self: Ref) : Bool
function getBPosIsArrival(self: Ref) : Bool
function getHdopBPosGetTimeIsNotVoid(self: Ref) : Bool
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
ensures (rel(o1, 0) == rel(o2, 2) && rel(o2, 0) == rel(o1, 2)) ==> (sgn(rel(res, 0)) == -sgn(rel(res, 2))) // P1
ensures (rel(o1, 2) == rel(o2, 1) && rel(o2, 2) == rel(o1, 1)) ==> (sgn(rel(res, 2)) == -sgn(rel(res, 1))) // P1
ensures (rel(o1, 0) == rel(o1, 1) && rel(o2, 0) == rel(o2, 1)) ==> (rel(res, 0) == rel(res, 1)) // deterministic
ensures (rel(o1, 0) == rel(o1, 2) && rel(o2, 0) == rel(o2, 2)) ==> (rel(res, 0) == rel(res, 2)) // deterministic
ensures (rel(o1, 2) == rel(o1, 1) && rel(o2, 2) == rel(o2, 1)) ==> (rel(res, 2) == rel(res, 1)) // deterministic
ensures ((rel(res, 0) > 0) && rel(res, 1) > 0 && rel(o2, 0) == rel(o1, 1) && rel(o1, 2) == rel(o1, 0) && rel(o2, 2) == rel(o2, 1)) ==> (rel(res, 2) > 0) // P2
ensures (rel(o2, 0) == rel(o1, 1) && rel(o1, 2) == rel(o1, 0) && rel(o2, 2) == rel(o2, 1) && rel(res, 0) == 0) ==> (sgn(rel(res, 1)) == sgn(rel(res, 2)))
ensures (rel(o2, 0) == rel(o1, 1) && rel(o1, 2) == rel(o1, 0) && rel(o2, 2) == rel(o2, 1) && rel(res, 1) == 0) ==> (sgn(rel(res, 0)) == sgn(rel(res, 2)))
ensures (rel(o2, 0) == rel(o1, 1) && rel(o1, 2) == rel(o1, 0) && rel(o2, 2) == rel(o2, 1) && rel(res, 2) == 0) ==> (sgn(rel(res, 1)) == sgn(rel(res, 0)))
method compare(o1: Ref, o2: Ref) returns (res: Int)
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 lCompare : Int
var returned : Bool
returned := false
if (getHdopBPosGetTimeIsNotVoid(o1) && getHdopBPosGetTimeIsNotVoid(o2)) {
lCompare := Int_compare(getHdopBPosGetTime(o1), getHdopBPosGetTime(o2));
if (lCompare != 0) {
res := lCompare
returned := true
}
}
if (!returned) {
lCompare := Int_compare(getBPosGetTime(o1), getBPosGetTime(o2));
if (lCompare != 0) {
res := lCompare;
returned := true
}
if (!returned) {
if (getBPosIsDeparture(o1) && getBPosIsVacation(o2)) {
res := 1
returned := true
} else {
if (getBPosIsVacation(o1) && getBPosIsArrival(o2)) {
res := 1
returned := true
}
}
// Ankunft und Abfahrt für denselben Bahnhof sollen in der richtigen Reihenfolge sein
if (!returned && getBPosIsDeparture(o1) && getBPosIsArrival(o2) && (getBPosGetStat(o1) == getBPosGetStat(o2))) {
res := 1
returned := true
}else{
res := 0
returned := true
}
}
}
assert returned
}