type Integer { init(); Integer pred; Integer succ(); Integer plus(Integer y); Integer times(Integer y); } class Zero : Integer imp Integer { init() { my.pred = this; } Integer pred; Integer plus(Integer y) { return y; } Integer times(Integer y) { return this; } Integer succ() { Integer that = new Positive : Integer(); that.pred = this; return that; } export Integer : pred as pred, plus as plus, times as times, succ as succ; } class Positive : Integer imp Integer { init() { my.pred = null; } Integer pred; Integer plus(Integer y) { return pred.plus(y.succ()); } Integer times(Integer y) { return pred.times(y).plus(y); } Integer succ() { Integer that = new Positive : Integer(); that.pred = this; return that; } export Integer : pred as pred, plus as plus, times as times, succ as succ; }