Пролог Ошибка "Out of local stack"

Вот моя простая программа Пролог:

friend(X,Y):-
   knows(X,Y).
friend(X,Z):-
   friend(X,Y),
   friend(Y,Z).

knows(brian,tom).
knows(tom,peter).

Если я наберу следующий запрос

friend(brian,peter).

Пролог выдаст следующий вывод:

?- friend(brian,peter).
true 

Если далее введите точку с запятой, Пролог скажет:

ERROR: Out of local stack

Что я здесь не так делаю?

2 ответа

Решение

Ошибка во втором предложении. Это должно быть вместо:

friend(X,Z):-
   knows(X,Y),
   friend(Y,Z).

В противном случае, когда вы просите у Пролога больше решений, у вас friend/2Предикат рекурсивно называет себя без предварительного установления knows/2промежуточное отношение. Вы можете узнать больше об ошибке в вашей программе, отслеживая обращения к friend/2 сказуемое. Пытаться:

?- trace, friend(brian,peter).

Чтобы понять источник прерывания в вашей программе, достаточно взглянуть на следующий срез-срез:

друг (X,Y):- неверно,
   знает (X, Y).
друг (X,Z):- 
   друг (X,Y), ложь,
   друг (Y, Z).знает (Брайан, Том): - ложь.знает (том, Питер): - ложь.

Это из-за friend(X, Z) :- friend(X, Y), ... что ваша программа не прекратится. Он будет давать ответы здесь и там, но в конечном итоге он будет повторяться. Для получения дополнительной информации см. Fail-slice.

Другие вопросы по тегам