Как вы сказали, OP, это тривиально.
Попробуйте
course(ai).
course(pl).
course(os).
have(X,Y) :- course(X), course(Y), X \== Y).
Это должно исправить ваш предикат.
Хотя, глядя на шаг вперед, математически выразив,вы, вероятно, ищете решение (n C 2), а не (n P 2), которое ваш предикат в настоящее время предоставляет - комбинация вместо перестановки, выбор выбора в противоположностьдоговоренности о выборе выбора.Это то, что я думаю.
Если это то, что вы хотите, я бы посоветовал вам попробовать
course(ai).
course(pl).
course(os).
have(X,Y) :- course(X), course(Y), X @< Y).
, что предотвратит повторяющиеся результаты в обратном порядке.
@<
означает атомно меньше, чем.<
для целых чисел, @<
для атомов.