maxnoncom(L) :- noncom(L), length(L, LenL), forall((noncom(M), L \= M), (length(M, LenM), LenL >= LenM)). noncom(L) :- elements(L), L \= [_], no_commutations(L). element(X) :- internal(X,_,_). element(X) :- internal(_,X,_). element(X) :- internal(_,_,X). no_commutations([]). no_commutations([X|Xs]) :- forall(member(Y, Xs), \+ commute(X, Y)), no_commutations(Xs). elements(L) :- setof(C, element(C), Cs), sorted_subset(Cs, L). commute(A, B) :- internal(A, B, C), internal(B, A, C). sorted_subset(_, []). sorted_subset(L0, [X|Xs]) :- member(X, L0), delete(L0, X, L1), sorted_subset(L1, Xs), ([Y|_] = Xs -> X @=< Y; true).