ArrayInt_false

ArrayInt, incorrect version

function get(self: Ref, pos: Int): Int function length(self: Ref): Int ensures result >= 0 function sgn(i: Int) : Int ensures i > 0 ==> result == 1 ensures i == 0 ==> result == 0 ensures i < 0 ==> result == -1 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 returned : Bool returned := false var index : Int var aentry : Int var bentry : Int index := 0 while (index < length(o1) && index < length(o2) && !returned) invariant index >= 0 && index <= length(o1) && index <= length(o2) invariant returned ==> res != 0 invariant (forall j : Int :: j >= 0 && j < index ==> (get(o1, j) == get(o2, j))) invariant returned && res > 0 ==> index < length(o1) && index < length(o2) && get(o1, index) > get(o2, index) invariant returned && res < 0 ==> index < length(o1) && index < length(o2) && get(o1, index) < get(o2, index) { aentry := get(o1, index) bentry := get(o2, index) if (aentry < bentry) { returned := true res := -1 } if (!returned && aentry > bentry) { returned := true res := 1 } if (!returned) { index := index + 1 } } if (!returned) { res := 0 returned := true } assert returned }