Пример кода пролога: унификация - PullRequest
0 голосов
/ 09 декабря 2010

Из старого финала для моего класса:

Вот код пролога:

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: Если я нажму точку с запятой, чтобы получитьвсе ответы, я получаю ошибку локального стека.Я не уверен, что этот код пытается выполнить или как это исправить, чтобы я не выходил из локального стека.Есть идеи?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

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

0 голосов
/ 09 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...