Пролог не завершается по запросу с 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 .