Чтобы расширить ваш вопрос в комментариях к @ ScottHunter,
Полагаю, мой вопрос в том, почему другие мои предикаты "Знают", что они имеют правильный ответ, а этот и еще один - нет?
Ответ связан с наличием точек выбора в стеке. Рассмотрим следующую ситуацию:
reasonably_big(L, X) :- member(X, L), X > 100.
?- reasonably_big([105, 2], X).
X = 105 ;
false.
?-
Сравните это с этим:
?- reasonably_big([2, 105], X).
X = 105.
?-
Во втором случае Пролог «знал», что решений больше нет; в первом случае это не так. Разница между этими двумя ситуациями заключается в том, что в первом случае member
оставил точку выбора в стеке: в списке был еще один элемент, который он мог бы рассмотреть, чтобы найти другой ответ. Во втором случае остальная часть списка была пуста, и SWI-Prolog member
достаточно умен, чтобы в этом случае не оставлять точку выбора в стеке, поэтому он никогда не спрашивал вас, хотите ли вы другое решение.
Если вы получаете лишние очки выбора, это часто указывает на логическую ошибку. Например, рассмотрим это определение min
:
min(X, Y, X) :- X =< Y.
min(X, Y, Y).
Это неисправно, потому что вы всегда можете вернуться назад и получить другое значение; для остроумия:
?- min(3,4, X).
X = 3 ;
X = 4.
Второе решение там ошибочное. Но вы все равно можете получить ненужную точку выбора, сделав неправильное улучшение:
min(X, Y, X) :- X =< Y.
min(X, Y, Y) :- Y =< X.
Посмотрим, что произойдет, когда мы попробуем разные значения:
?- min(4,3,X).
X = 3.
?-
?- min(3,4,X).
X = 3 ;
false.
?-
Первый работал нормально, но второй оставил точку выбора в стеке, имея второе тело. Вы можете устранить это зеленым срезом:
min(X,Y,X) :- X =< Y, !.
min(X,Y,Y) :- Y =< X.
?- min(3,4,X).
X = 3.
?-
?- min(4,3,X).
X = 3.
?-
Срез связывает Пролог с конкретным решением. Он говорит, что, как только вы сделали это здесь, нет необходимости пробовать какие-либо другие решения для этого предиката, потому что мы нашли единственное, что нам нужно. Понимание того, как применять сокращение, является сложной темой, но устранение нежелательных точек выбора является важным использованием.