Истинно, когда Min является наименьшим членом в стандартном порядке терминов. Ошибка, если List пуст.
?- min_member(3, [1,2,X]).
X = 3.
Объяснение, конечно, состоит в том, что переменные встречаются перед всеми другими терминами в стандартном порядке терминов, и используется унификация. Однако заявленное решение кажется каким-то неправильным.
Как это можно оправдать? Как интерпретировать это решение?
EDIT:
Один из способов предотвратить выполнение 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.