max(X, Y, X) :- X >= Y.

max(X, Y, Y) :- Y >= X.

min(X, Y, X) :- Y >= X.

min(X, Y, Y) :- X >= Y.

instequivclassesn([], M, N).

instequivclassesn([M | R], M, N) :-
   M > 0, P is M+1, max(P,N,Q), instequivclassesn(R, Q, Q).

instequivclassesn([X | R], M, N) :-
   M > 1, P is M-1, instequivclassesn([X | R], P, N).

instequivclasses(X) :- instequivclassesn(X, 1, 1).

trivequiv(0, []).

trivequiv(N, [X | R]) :- N > 0, P is N-1, ...

insert(1, X, Y, ... ).

insert(I, X, [Y | R], ... ) :- ...

unitequiv(N, I, J, X) :- N > 1, I =\= J, ...

join( .... ).
