Пролог - пары, которые не связаны - PullRequest
0 голосов
/ 21 марта 2011
parent(kresimir, jasna).
parent(kresimir, darko).
parent(vesna, darko).
parent(darko, vigor).
parent(darko, goran).
parent(vigor, ruzica).
parent(vigor, snjezana).
parent(mario, nenad).

ancestor(X, Y) :-
    parent(X, Y).

ancestor(X, Y) :-
    parent(X, Z),
    ancestor(Z, Y).


related(X, Y) :-
    parent(X,Y);
    parent(Y,X).
related(X, Y) :-
    X \= Y,
    ancestor(Z, X),
    ancestor(Z, Y).

Это мой файл пролога, мне нужно найти все пары людей, которые не связаны между собой, и я понятия не имею, как.

1 Ответ

1 голос
/ 21 марта 2011

Тебе нужен способ, чтобы сначала собрать всех людей.

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)).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...