Comportamento contra-intuitivo de min_member / 2
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.