// Define counter instance methods
define invariant-method increment (counter :: <counter>)
counter.value := counter.value + 1;
end;
define invariant-method decrement (counter :: <counter>)
counter.value := counter.value - 1;
end;
// Define method and class invariants
define invariant increment (counter :: <counter>, old)
counter.value == old.value + 1;
end;
define invariant increment (counter :: <counter>, old)
counter.value == old.value - 1;
end;
define class invariant (counter :: <counter>)
counter.value >= 0;
end;
The implementation would look something like this:
define method increment (counter :: <counter>)
let old = counter.shallow-copy;
counter.value := counter.value + 1;
increment-invariant (counter, old);
class-invariant (counter, old);
end;