Comportamento contra-intuitivo de min_member / 2

min_member(-Min, + Lista)

Verdadeiro quando Min é o menor membro na ordem padrão de termos. Falha se a Lista estiver vazia.

?- min_member(3, [1,2,X]).
X = 3.

A explicação é obviamente que as variáveis vêm antes de todos os outros termos na ordem padrão dos termos e a unificação é usada. No entanto, a solução relatada parece errada.

Como isso pode ser justificado? Como devo interpretar essa solução?

EDITAR:

Uma maneira de prevenirmin_member/2 de ter sucesso com esta solução é alterar a biblioteca padrão (SWI-Prolog)implementação do seguinte modo:

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)
    ).

A lógica por trás da falha em vez de gerar um erro de instanciação (o que @mat sugere em sua resposta, se eu entendi corretamente) é que essa é uma pergunta clara:

"3 é o membro mínimo de[1,2,X], quando X é uma variável livre? "

e a resposta para isso é (pelo menos para mim) um claro "Não", em vez de "eu não sei dizer".

Essa é a mesma classe de comportamento quesort/2:

?- sort([A,B,C], [3,1,2]).
A = 3,
B = 1,
C = 2.

E os mesmos truques se aplicam:

?- min_member(3, [1,2,A,B]).
A = 3.

?- var(B), min_member(3, [1,2,A,B]).
B = 3.

questionAnswers(6)

yourAnswerToTheQuestion