Пролог не завершается по запросу с 2 аргументами

Я новичок в Прологе и у меня есть вопрос к упражнению по программированию:

У меня есть программа, которая, по моему мнению, работает большую часть времени, но с конкретным запросом я не получаю ответ

is_number(0).
is_number(s(N)) :-
  is_number(N).

numberpair(pair(X,Y)) :-
  is_number(X),
  is_number(Y).

?- numberpair(pair(A,B)), A=s(s(0)), B=s(s(s(0))).

Итак, я понимаю, что Пролог теперь пробует все возможные числа для A и B -> [0,s(0),s(s(0)),s(s(s(0))), ...], но если он находит ответ для А (а именно s(s(0))) он терпит неудачу в B и при следующем вызове он пытается следующий ответ для A (а именно s(s(s(0)))) и так далее. Теперь дело в том, что я хочу, чтобы Пролог остановился, если он нашел ответ для А, и теперь ищет ответ только для Б.

Кто-нибудь может дать мне подсказку, как это решить?

1 ответ

Решение

Редактировать: как указано неверно:причина, по которой вы не найдете ответ, заключается в том, что ваша пара правил номер 1 не прекратит работу. Причина, по которой вы не можете найти ответ, заключается в том, что Prolog перечисляет ваш ответ таким образом, что сначала перечисляются все возможности для A, а затем возможности для B (обратите внимание, что у обоих есть бесконечные возможности). Пролог пытается найти ответ сначала для пары чисел предложения (пара (A,B)), а затем для следующих предложений A=s(s(0)) и B=s(s(s(0))), Но поскольку номерная пара уже не прекратится, она пока не "придет".

Если вы измените порядок целей ваших пунктов и просто позвоните A=s(s(0)) перед числовой парой (пара (A,B)), он выдаст вам список всех ответов для возможностей B (обратите внимание, что это все еще выиграно не прекратить!).

?- A=s(s(0)), numberpair(pair(A,B)).

A = s(s(0)),
B = 0 ;
A = s(s(0)),
B = s(0) ;
A = B, B = s(s(0)) ;
A = s(s(0)),
B = s(s(s(0))) .

Отредактируйте 2, чтобы предоставить также версию, которая будет перечислять "честно"!

is_number(0).
is_number(s(N)) :-
  is_number(N).

number_number_sum(0,A,A).
number_number_sum(s(A),B,s(C)) :-
    number_number_sum(A,B,C).

numberpair(pair(X,Y)) :-
    is_number(Z),
    number_number_sum(X,Y,Z).

Что даст нам

?- numberpair(pair(A,B)).
A = B, B = 0 ;
A = 0,
B = s(0) ;
A = s(0),
B = 0 ;
A = 0,
B = s(s(0)) ;
A = B, B = s(0) ;
A = s(s(0)),
B = 0 ;
A = 0,
B = s(s(s(0))) ;
A = s(0),
B = s(s(0)) ;
A = s(s(0)),
B = s(0) ;
A = s(s(s(0))),
B = 0 .
Другие вопросы по тегам