Истинно, когда Min является наименьшим элементом в стандартном порядке членов. Сбой, если список пуст.
?- min_member(3, [1,2,X]).
X = 3.
Объяснение, конечно, состоит в том, что переменные стоят перед всеми другими терминами в стандартном порядке терминов, и используется унификация. Однако заявленное решение кажется каким-то неправильным.
Как это можно оправдать? Как я должен интерпретировать это решение?
РЕДАКТИРОВАТЬ:
Один из способов предотвратить успех min_member/2
с помощью этого решения — изменить стандартную библиотеку (SWI-Prolog) реализация следующим образом:
xmin_member(Min, [H|T]) :-
xmin_member_(T, H, Min).
xmin_member_([], Min0, Min) :-
( var(Min0), nonvar(Min)
-> fail
; Min = Min0
).
xmin_member_([H|T], Min0, Min) :-
( H @>= Min0
-> xmin_member_(T, Min0, Min)
; xmin_member_(T, H, Min)
).
Причина неудачи вместо того, чтобы выдавать ошибку создания экземпляра (что @mat предлагает в своем ответе, если я правильно понял), заключается в том, что это четкий вопрос:
«Является ли 3 минимальным членом [1,2,X]
, когда X — свободная переменная?»
и ответ на это (по крайней мере, для меня) ясное «Нет», а не «Я не могу сказать».
Это тот же класс поведения, что и sort/2
:
?- sort([A,B,C], [3,1,2]).
A = 3,
B = 1,
C = 2.
И применяются те же приемы:
?- min_member(3, [1,2,A,B]).
A = 3.
?- var(B), min_member(3, [1,2,A,B]).
B = 3.