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<Object> 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' = <x?> ^ items
               \old(items).add(x));  @*/
  public abstract void push(Object x);          // __ Push __  x? : Object

}