public class SimpleSet { //@ non_null int contents[]; int size; //@ invariant size>= 0; //@ invariant size <= contents.length; //@ requires capacity>= 0; //@ ensures contents.length == capacity; //@ ensures size == 0; SimpleSet(int capacity) { contents = new int[capacity]; size = 0; } //@ requires size < contents.length || contains(i); //@ modifies size, contents[*]; //@ ensures \result == (size == \old(size+1)); //@ ensures !\result == (size == \old(size)); //@ ensures (\forall int j; (0 <= j && j < \old(size)) ==> contents[j] == \old(contents[j])) //@ ensures contains(i); boolean add(int i) { if (contains(i)) return false; contents[size++]=i; return true; } //@ pure //@ ensures \result == (\exists int j; 0 <= j && j < size && contents[j]==i); boolean contains(int i) { for (int j = 0; j < size; ++j) if (contents[j] == i) { return true; } return false; } } class SimpleSetDriver { void testConstructor() { SimpleSet s = new SimpleSet(2); //@ assert !s.contains(5); } void testAdd() { SimpleSet s = new SimpleSet(2); s.add(5); //@ assert !s.contains(4); //@ assert s.contains(5); s.add(4); //@ assert s.contains(4); s.add(4); } }

AltStyle によって変換されたページ (->オリジナル) /