Testing. Initial revision.

This already finds a mistake in the current version:

   %?- sat(A*B), sat(C#D), maplist(call, [A=D,A=C]), labeling([A,B,C,D]).
   %@ A = B, B = C, C = D, D = 1.

   %?- sat(A*B * (C#D)), maplist(call, [A=D,A=C]), labeling([A,B,C,D]).
   %@ false.

Thus, aliasing between variables still needs to be corrected.