Давайте сначала рассмотрим аналогичный запрос: [Изменить: сделайте это без добавления собственного определения; member/2
уже определено]
?- member(a,[b,a]).
true.
В этом случае вы получите оптимальный ответ: существует ровно одно решение. Но при обмене элементами в списке получаем:
?- member(a,[a,b]).
true ;
false.
По логике, оба утверждения являются лишь подтверждением того, что запрос верен.
Причина различия в том, что во втором запросе ответ true
дается сразу после нахождения a
в качестве элемента списка. Остающийся список [b]
не содержит подходящего элемента, но он еще не исследован. Только по запросу (нажатие SPACE или ;) проверяется остальная часть списка, в результате чего больше нет решения.
По сути, эта небольшая разница дает вам подсказку, когда вычисление полностью завершено и когда еще есть над чем поработать. Для простых запросов это не имеет значения, но в более сложных запросах эти открытые альтернативы (точки выбора) могут накапливаться и использовать память.
Старшие руководители всегда спрашивали, хотите ли вы увидеть дальнейшее решение, даже если его не было.
Редактировать:
Возможность не спрашивать следующий ответ, если его нет, сильно зависит от самих деталей реализации. Даже в пределах одной системы и загруженной одной и той же программы вы можете получить разные результаты. Однако в этом случае я использовал встроенное определение SWI для member/2
, тогда как вы использовали свое собственное определение, которое перезаписывает встроенное определение.
SWI использует следующее определение как встроенное, которое логически эквивалентно вашему, но упрощает избежание ненужных точек выбора для SWI, но многие другие системы не могут извлечь из этого выгоду:
member(B, [C|A]) :-
member_(A, B, C).
member_(_, A, A).
member_([C|A], B, _) :-
member_(A, B, C).
Чтобы еще больше усложнить ситуацию: многие прологи имеют другой верхний уровень, который никогда не запрашивает дальнейших ответов, если запрос не содержит переменной. Таким образом, в этих системах (например, YAP) у вас складывается неправильное впечатление.
Попробуйте выполнить следующий запрос, чтобы увидеть это:
?- member(X,[1]).
X = 1.
SWI снова может определить, что это единственный ответ. А вот YAP, например, нет.
person
false
schedule
30.01.2013