match([_], []). match([X|Xs], Ys) :- group_pairs_by_key(Y, [X-Xs]), append(Y, Y1, Ys), match(Xs, Y1). game([], G, G). game([X1-X2|Xs], Ys, G) :- append(Y1, [Y|Y2], Ys), \+ memberchk(Y, Y2), \+ memberchk(X1-_, Y), \+ memberchk(_-X1, Y), \+ memberchk(X2-_, Y), \+ memberchk(_-X2, Y), append(Y1, [[X1-X2|Y]|Y2], Z), game(Xs, Z, G). round_robin(N, G) :- N mod 2 =:= 0, numlist(1, N, X), match(X, Y), N1 is N - 1, length(G0, N1), maplist(ord_empty, G0), game(Y, G0, G). :- writeln('4 teams'), forall(round_robin(4, G), writeln(G)), writeln('6 teams'), forall(round_robin(6, G), writeln(G)).