[package] [Java implementation] [Execution output]


Relational


import church.lang.operators.Logical;

class Ordering: {LT, EQ, GT};

abstract <T> Ordering: compare(T: a, T: b);

/*
Arrange the relational operators so that, at a minimum, each type only has to provide a single implementation:
    '==', for unordered types
    'compare', for ordered types

The parentheses below were included for clarity, but are not required by the parser.
*/
abstract <T> boolean: (T: a) == (T: b);

 (a == b) = (compare(a, b) == Ordering.EQ);
 (a != b) = not (a == b);

  (a < b) = (compare(a, b) == Ordering.LT);
  (a > b) = (compare(a, b) == Ordering.GT);

 (a <= b) = (compare(a, b) != Ordering.GT);
 (a >= b) = (compare(a, b) != Ordering.LT);

min(a, b) = (a <= b ? a : b);
max(a, b) = (a >= b ? a : b);