import java.util.*; /** * A simple stack example illustrating use of JML, with equvalent Z in comments * to the right. The funky non-ascii Z symbols are approximated as best as * possibe. */ // // Java and JML: // Z: // public abstract class StackZ { // __ Stack __ public final int maxSize = 20000; // maxSize == 20000 public List items; // items : seq Object /*@ public invariant // __________________ items.size() < maxSize; @*/ // #items <= maxSize public StackZ() { // StackInit __ Stack' items = null; // items' = <> } /*@ requires items.size() != 0; @*/ // items != <> /*@ ensures items.equals(\old(items)) && // |-| Stack \result == items.get(0); @*/ // x! = head items public abstract Object top(); // __ Top __ /*@ assignable items; @*/ // /_\ Stack /*@ requires items.size() != 0; @*/ // items != <> /*@ ensures items == // items' = tail items \old(items).subList(1,\old(items).size()) && \result == \old(items).get(0); @*/ // x! = head items public abstract Object pop(); // __ Pop __ x! : Object /*@ assignable items; @*/ // /_\ Stack /*@ requires items.size() < maxSize; @*/ // #items < maxSize /*@ ensures items.equals( // items' = ^ items \old(items).add(x)); @*/ public abstract void push(Object x); // __ Push __ x? : Object }