Декларативное использование memberchk / 2

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?

Ответы на вопрос(3)

Ваш ответ на вопрос