2010-12-08 3 views
0

От старого финал для моего класса:Пролог Пример кода: Унификация

Вот некоторые пролог код:

mystery(1, 1). 
mystery(N, F) :- 
    N1 is N-1, 
    mystery(N1,F1), 
    F is F1*N. 

Вопрос 1: Какое значение объединяется с P в

mystery(3, P). 

Вопрос 2: Если точка с запятой нажата после того, как Prolog производит и отвечает за тайну, и интерпретатор в конечном итоге сообщит «ОШИБКА: из локального стека». Почему это происходит, и как вы можете изменить тайну, чтобы избежать ошибки?


Вопрос 1: я

P = 6 ? 

Вопрос 2: Если я нажимаю запятой, чтобы получить ответы на все вопросы, я получить из локальной ошибки стека. Я не уверен, что этот код пытается выполнить или как его исправить, поэтому я не выхожу из локального стека. Есть идеи?

+0

У вас был вопрос «Вопрос 1»? Вы понимаете, почему ответ 6? – aschepler 2010-12-08 22:32:21

ответ

2

Выездная ошибка стеки, вероятно, потому, что, когда вы получаете вниз к mystery(1, F1) разрешающим к mystery(1, 1) и попросить больше решений, вы попали в следующий пункт, который вызывает mystery(0, F1). На этом этапе он пытается найти решение, но единственное условие, которое соответствует вызовам mystery(-1, F1), и которое вызывает mystery(-2, F1) и так далее. Это означает, что требуются совпадения до тех пор, пока первый номер не обернется до 1 или вы не получите переполнение стека, поскольку каждое ожидающее соответствие занимает пространство стека.

0

@David Thornley уже объяснил, почему поиск дополнительных ответов взорвает ваш стек. Вы можете исправить это с помощью оператора разреза:

mystery(1, F) :- !, F is 1. 
mystery(N, F) :- 
    N1 is N-1, 
    mystery(N1,F1), 
    F is F1*N. 

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

Смежные вопросы