Неразорванные петли петли

Привет, у меня есть проблема, которую я не могу решить. Я новичок в Prolog, и я видел массу примеров этого генеалогического древа, но ни один из них, похоже, не решает мою проблему.

Скажи, что у меня есть

son(X, Y) :-
   \+daughter(X, Y),
   father(Y, X).

father(Y, X) :-
   male(X),
   son(X, Y).

и я вызываю один из них, он будет переключаться между условиями, потому что каждый из них будет удовлетворять предыдущему, что приведет к локальной ошибке стека.

Большинство, похоже, рекомендуют удалить одно из определений, но мне нужно ответить на вопросы отца и сына. Пожалуйста, помогите, это кажется таким простым, но я никак не могу в этом разобраться. Как я могу сломаться после цикла один раз?

ТИА


person Texas Ag    schedule 29.06.2012    source источник


Ответы (1)


Ты мог:

1) вы можете использовать предикат-оболочку:

father(Y,X):-
   male(X),
   son_data(X,Y).

son(X,Y):-
   son_data(X,Y).
son(X,Y):-
   \+daughter(X, Y), 
    father(Y, X).

ваша база данных должна выглядеть

son_data(mike,steph).
....
father(nick,john).
....

(нет сына/2 записи)

2) используйте версию пролога, которая поддерживает таблицу (например, XSB) ( или реализовать его; не такая уж хорошая идея c)

person Thanos Tintinidis    schedule 29.06.2012