Тебе нужен способ, чтобы сначала собрать всех людей.
person(X) :- parent(X, _).
person(X) :- parent(_, X).
Затем используйте setof/3
, чтобы получить список людей без дубликатов:
setof(X, person(X), People)
и соберите все пары из этого:
pair_of_people(X,Y) :-
setof(P, person(P), People),
member(X, People),
member(Y, People),
X \= Y.
Это, кстати, создает "зеркальные" пары: и (X,Y)
, и (Y,X)
для всех X
и Y
. Вы можете добиться большего успеха с адаптированной версией member
, которую поддерживают многие прологи. Ознакомьтесь с руководством по Прологу.
Наконец, отфильтруйте пары, которые related
:
unrelated(X,Y) :-
pair_of_people(X,Y),
not(related(X,Y)).