Нелогичное поведение min_member / 2

min_member(-Мин + Список)

Истинно, когда 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.

Ответы на вопрос(6)

Ваш ответ на вопрос