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?