/* Featherweight Java Example
 * Natural Numbers 
 */

class Nat extends Object {
    Nat () { super (); }
    Nat pred () { return this; }
    Nat add (Nat m)  { return m; }
    Nat mult (Nat m) { return this; }
    Nat subFrom (Nat m) { return m; }
    Nat sub (Nat m) { return m.subFrom (this); }
    Nat divCeil (Nat m) { return this; }
    Nat div (Nat m) { return this.sub(m.pred()).divCeil(m); }
}
class Zero extends Nat {
    Zero () { super (); }
}
class Succ extends Nat {
    Nat n;
    Succ (Nat n) { super (); this.n = n; }
    Nat pred () { return this.n; }
    Nat add (Nat m) { return new Succ (this.n.add (m)); }
    Nat mult (Nat m) { return this.n.mult (m).add (m); }
    Nat subFrom (Nat m) { return this.n.subFrom (m.pred()); }
    Nat divCeil (Nat m) { return new Succ(this.sub(m).divCeil(m)); }
}

Nat zero = new Zero();
Nat one  = new Succ(zero);
Nat two  = new Succ(one);
Nat three= one.add(two);
Nat six  = two.mult(three);
Nat five = six.pred();
Nat four = two.subFrom(six);
Nat n3   = five.divCeil(two);
Nat n2   = five.div(two);
// Nat inf  = five.div(zero);
