Пролог Ошибка "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.