predicate IsOdd(x: int) {
newtype Odd = n : int | IsOdd(n) witness 3
0 <= |s| <= this.capacity &&
forall i :: 0 <= i < |s| ==> IsOdd(s[i] as int)
method insert(index: nat, element: Odd)
requires 0 <= index <= |s|
requires |s| + 1 <= this.capacity
ensures |s| == |old(s)| + 1
ensures s[index] == element
ensures old(capacity) == capacity
method pushFront(element: Odd)
requires |s| + 1 <= this.capacity
ensures |s| == |old(s)| + 1
ensures old(capacity) == capacity
method pushBack(element: Odd)
requires |s| + 1 <= this.capacity
ensures |s| == |old(s)| + 1
ensures s[|s| - 1] == element
ensures old(capacity) == capacity
method remove(element: Odd)
ensures |s| == |old(s)| - 1
ensures old(capacity) == capacity
method removeAtIndex(index: nat)
requires 0 <= index < |s|
ensures |s| == |old(s)| - 1
ensures old(capacity) == capacity
method popFront() returns (x: Odd)
ensures |s| == |old(s)| - 1
ensures old(capacity) == capacity
method popBack() returns (x: Odd)
ensures old(s)[|old(s)| - 1] == x
ensures |s| == |old(s)| - 1
ensures old(capacity) == capacity
method length() returns (n: nat)
method at(index: nat) returns (x: Odd)
requires 0 <= index < |s|
method BinarySearch(element: Odd) returns (index: int)
requires forall i, j :: 0 <= i < j < |s| ==> s[i] <= s[j]
ensures 0 <= index ==> index < |s| && s[index] == element
ensures index == -1 ==> element !in s[..]
method mergedWith(l2: OddList) returns (l: OddList)
requires this.capacity >= 0
requires l2.capacity >= 0
requires forall i, j :: 0 <= i < j < |s| ==> s[i] <= s[j]
requires forall i, j :: 0 <= i < j < |l2.s| ==> l2.s[i] <= l2.s[j]
ensures l.capacity == this.capacity + l2.capacity
ensures |l.s| == |s| + |l2.s|
class OddList extends OddListSpec
constructor (capacity: nat)
ensures this.capacity == capacity
this.capacity := capacity;
method insert(index: nat, element: Odd)
requires 0 <= index <= |s|
requires |s| + 1 <= this.capacity
ensures |s| == |old(s)| + 1
ensures s[index] == element
ensures old(capacity) == capacity
s := s[..index] + [element];
method pushFront(element: Odd)
requires |s| + 1 <= this.capacity
ensures |s| == |old(s)| + 1
ensures old(capacity) == capacity
method pushBack(element: Odd)
requires |s| + 1 <= this.capacity
ensures |s| == |old(s)| + 1
ensures s[|s| - 1] == element
ensures old(capacity) == capacity
method remove(element: Odd)
ensures |s| == |old(s)| - 1
ensures old(capacity) == capacity
invariant forall k :: 0 <= k < i ==> s[k] != element
s := s[..i] + s[i + 1..];
method removeAtIndex(index: nat)
requires 0 <= index < |s|
ensures |s| == |old(s)| - 1
ensures old(capacity) == capacity
s := s[..index] + s[index + 1..];
method popFront() returns (x: Odd)
ensures |s| == |old(s)| - 1
ensures old(capacity) == capacity
method popBack() returns (x: Odd)
ensures old(s)[|old(s)| - 1] == x
ensures |s| == |old(s)| - 1
ensures old(capacity) == capacity
method length() returns (n: nat)
method at(index: nat) returns (x: Odd)
requires 0 <= index < |s|
method BinarySearch(element: Odd) returns (index: int)
requires forall i, j :: 0 <= i < j < |s| ==> s[i] <= s[j]
ensures 0 <= index ==> index < |s| && s[index] == element
ensures index == -1 ==> element !in s[..]
var left, right := 0, |s|;
invariant 0 <= left <= right <= |s|
invariant element !in s[..left] && element !in s[right..]
var mid := (left + right) / 2;
method mergedWith(l2: OddList) returns (l: OddList)
requires this.capacity >= 0
requires l2.capacity >= 0
requires forall i, j :: 0 <= i < j < |s| ==> s[i] <= s[j]
requires forall i, j :: 0 <= i < j < |l2.s| ==> l2.s[i] <= l2.s[j]
ensures l.capacity == this.capacity + l2.capacity
ensures |l.s| == |s| + |l2.s|
l := new OddList(this.capacity + l2.capacity);
while i < |s| || j < |l2.s|
invariant 0 <= j <= |l2.s|
invariant |l.s| <= l.capacity
invariant l.capacity == this.capacity + l2.capacity
decreases |s| - i, |l2.s| - j
trait CircularLinkedListSpec<T(==)>
0 <= |l| <= this.capacity
method insert(index: int, element: T)
requires |l| + 1 <= this.capacity
ensures |old(l)| == 0 ==> l == [element]
ensures |l| == |old(l)| + 1
ensures |old(l)| > 0 ==> l[index % |old(l)|] == element
ensures old(capacity) == capacity
method remove(element: T)
ensures |l| == |old(l)| - 1
ensures old(capacity) == capacity
method removeAtIndex(index: int)
ensures |l| == |old(l)| - 1
ensures old(capacity) == capacity
method length() returns (n: nat)
method at(index: int) returns (x: T)
ensures l[index % |l|] == x
method nextAfter(index: int) returns (x: T)
ensures |l| == 1 ==> x == l[0]
ensures |l| > 1 && index % |l| == (|l| - 1) ==> x == l[0]
ensures |l| > 1 && 0 <= index && |l| < (|l| - 1) ==> x == l[index % |l| + 1]
class CircularLinkedList<T(==)> extends CircularLinkedListSpec<T>
constructor (capacity: nat)
ensures this.capacity == capacity
this.capacity := capacity;
method insert(index: int, element: T)
requires |l| + 1 <= this.capacity
ensures |old(l)| == 0 ==> l == [element]
ensures |l| == |old(l)| + 1
ensures |old(l)| > 0 ==> l[index % |old(l)|] == element
ensures old(capacity) == capacity
var actualIndex := index % |l|;
var tail := l[actualIndex..];
l := l[..actualIndex] + [element];
method remove(element: T)
ensures |l| == |old(l)| - 1
ensures old(capacity) == capacity
invariant forall k :: 0 <= k < i ==> l[k] != element
l := l[..i] + l[i + 1..];
method removeAtIndex(index: int)
ensures |l| == |old(l)| - 1
ensures old(capacity) == capacity
var actualIndex := index % |l|;
l := l[..actualIndex] + l[actualIndex + 1..];
method length() returns (n: nat)
method at(index: int) returns (x: T)
ensures l[index % |l|] == x
var actualIndex := index % |l|;
method nextAfter(index: int) returns (x: T)
ensures |l| == 1 ==> x == l[0]
ensures |l| > 1 && index % |l| == (|l| - 1) ==> x == l[0]
ensures |l| > 1 && 0 <= index && |l| < (|l| - 1) ==> x == l[index % |l| + 1]
var actualIndex := index % |l|;
if (actualIndex == (|l| - 1))
method isIn(element: T) returns (b: bool)
ensures |l| == 0 ==> b == false
ensures |l| > 0 && b == true ==> exists i :: 0 <= i < |l| && l[i] == element
ensures |l| > 0 && b == false ==> !exists i :: 0 <= i < |l| && l[i] == element
invariant forall k :: 0 <= k < i ==> l[k] != element