memberchk/2
- это обычно определенный предикат, который определен в терминах member/2
следующим образом:
memberchk(X, Xs) :-
once(member(X, Xs)).
Следовательно, это удается только для первого ответа member/2
. Его полное процессуальное значение не вписывается в чистое отношение. В качестве примера для его нереляционного поведения рассмотрим
?- memberchk(b, [X,b]), X = a.
false.
?- X = a, memberchk(b, [X,b]).
X = a.
С другой стороны, во многих случаях memberchk/2
вызывается с достаточно интуитивными аргументами, где его можно рассматривать как эффективное приближение чистого отношения.
Одно из таких чистых отношений - memberd/2
(используя if_/3
):
memberd(E, [X|Xs]) :-
if_(E = X, true, memberd(E, Xs) ).
Существуют ли какие-либо другие чистые отношения, которые могут быть аппроксимированы memberchk/2
для достаточно инстанцированных случаев?
Другими словами: memberd/2
полная, декларативная замена для memberchk/2
или существуют ли законные случаи, когда memberchk/2
не может быть заменен на memberd/2
?