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);
    }
}
