An Equiv.T is an element of an equivalence relation.
INTERFACEAEquiv ; EXCEPTION Forbidden; TYPE T <: Public; Public = OBJECT root: T; METHODS init(): T; union(y: T): T RAISES {Forbidden}; END; END Equiv.
NEW(Equiv.T).init() is in an equivalence class by itself. For any
existing element x, x.init().root = x. However, the element
x' = x.init() is not necessarily in its own equivalence class; there may
be other existing elements y such that y.root = x'.
The field x.root is the distinguished representative of x's
equivalence class.
The call x.union(y) combines the equivalence classes represented by x
and y and returns the representative of the new class. It is a checked
run-time error for x and y not to be roots of their equivalence
classes. The method raises Forbidden if the union operation is illegal;
the default union method never raises Forbidden, but it may be useful
for subtypes to override it.
After the call x.union(y), x.root = y.root. The distinguished
representative of the class formed by x.union(y) is guaranteed to be
either the distinguished representative of x's class or the distinguished
representative of y's class before the union.