Декларативное использование 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
?