public class TickTockClock {
//@ public model int _time_state;
//@ protected invariant 0 <= hour && hour <= 23;
protected int hour; //@ in _time_state;
//@ protected invariant 0 <= minute && minute <= 59;
protected int minute; //@ in _time_state;
//@ protected invariant 0 <= second && second <= 59;
protected int second; //@ in _time_state;
//@ assignable this.*;
//@ ensures getHour() == 12 && getMinute() == 0 && getSecond() == 0;
public /* @ pure @*/ TickTockClock() {
hour = 12; minute = 0; second = 0;
}
//@ requires true;
//@ ensures 0 <= \result && \result <= 23;
//@ ensures \result == hour;
public /*@ pure @*/ int getHour() { return hour; }
//@ ensures 0 <= \result && \result <= 59;
//@ ensures \result == minute;
public /*@ pure @*/ int getMinute() { return minute; }
//@ ensures 0 <= \result;
//@ ensures \result <= 59;
//@ ensures \result == second;
public /*@ pure @*/ int getSecond() { return second; }
/*@ requires getSecond() < 59;
@ assignable hour, minute, second; // NB for expository purposes only
@ assignable _time_state;
@ ensures getSecond() == \old(getSecond() + 1) &&
@ getMinute() == \old(getMinute()) &&
@ getHour() == \old(getHour());
@ also
@ requires getSecond() == 59;
@ assignable _time_state;
@ assignable hour, minute, second; // NB for expository purposes only
@ ensures getSecond() == 0;
@*/
public void tick() {
second++;
if (second == 60) { second = 0; minute++; }
if (minute == 60) { minute = 0; hour++; }
if (hour == 24) { hour = 0; }
}
}