Пролог получает бесконечный цикл при запросе другого решения

Я использую SWI Prolog, в моей домашней работе используется следующий код (код не домашняя, но необходим для написания методов, необходимых для курса):

nat(0).
nat(s(X)) :-
    nat(X).

plus(0,N,N) :- 
    nat(N).
plus(s(M),N,s(Z)) :-
    plus(M,N,Z).

times(0,N,0) :-
    nat(N).
times(s(M),N,Z) :-
    times(M,N,W),
    plus(W,N,Z).

exp(s(M),0,0) :-
    nat(M).
exp(0,s(M),s(0)) :-
    nat(M).
exp(s(N),X,Z) :-
    exp(N,X,Y),
    times(X,Y,Z).

exp(a,b,c) средства c=b^a,

Он скопирован прямо из книги: "Искусство пролога: передовые методы программирования".

Когда я запускаю следующий запрос:

exp(s(s(0)),L,s(s(s(s(0))))).

Я получаю ответ:

L = s(s(0))

Но когда я прошу другой ответ, введя;

L = s(s(0)) ;

Я получаю бесконечный цикл (заканчивающийся ошибкой вне стека), я ожидал получить false.

В чем проблема в коде? Есть ли код, который делает то же самое (с тем же представлением натуральных чисел), но ведет себя так, как я описал? и если это так, несколько указателей или предложений будут очень полезны.

Заранее спасибо.

1 ответ

Решение

Это нормально, что он запускается в бесконечный цикл для данной программы: если вы вызываете exp/3, С вторым элементом, который не реализован, он начинает разветвляться на все возможные значения для L, Другими словами, если вы запросите:

exp(s(s(0)),L,s(s(s(s(0))))).

Действует как:

Я создаю экземпляр L в s(0), является s(0) (таким образом 1) правильно?
Нет! Я создаю экземпляр L в s(s(0)) 2 правильно?
Да вернуть 2, Держись, пользователь просит больше ответов....
Является 3 правильный? нет
Является 4 правильный? нет
Верно? (вы поняли)

Каждый раз, когда вы делаете попытку, стек поднимается на один уровень глубже (потому что для его создания требуется еще один уровень s(X) над X...

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

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