Пролог семейных правил - PullRequest
0 голосов
/ 18 октября 2018

У меня есть несколько фактов:

parent(bob, anne). % bob is a. parent of anne.
sibling(anne, mary).

Я пытаюсь выяснить у родителей факты, связанные с братьями и сестрами, поэтому, если я запрашиваю * 1004, * bob должен быть выводом.Пока мои правила таковы:

siblingOf(X,Y) :- sibling(X,Y).
siblingOf(X,Y) :- sibling(Y,X).

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

Это идет по бесконечному циклу.Я подозреваю, что это потому, что рекурсивный вызов не имеет конечного условия.Что я могу сделать, чтобы это работало?

1 Ответ

0 голосов
/ 19 октября 2018

Вы уже использовали тот же прием: создайте предикат с другим именем и, таким образом, убедитесь, что вы не вызываете предикат здесь:

parentOf(P, C) :-
    parent(P, C).
parentOf(P, C) :-
    siblingOf(C, S),
    parent(P, S).

Таким образом, мы говорим, что X может бытьродитель Y на основе двух условий:

  1. мы определили факт parent/2, поэтому явно упомянул родительское отношение;или
  2. P является parent/2 из sliblingOf/2 нашего ребенка C.

Тогда мы получим:

?- parentOf(X, Y).
X = bob,
Y = anne ; 
X = bob, 
Y = mary.
?- parentOf(X, mary).
X = bob.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...