Нелогичное поведение min_member / 2
Истинно, когда 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.