Usos declarativos do memberchk / 2

memberchk/2 é um predicado comumente definido em termos demember/2 igual a:

memberchk(X, Xs) :-
   once(member(X, Xs)).

Por conseguinte, consegue apenas a primeira resposta demember/2. Seu significado processual completo não se encaixa em uma relação pura. Como exemplo de seu comportamento não relacional, considere

?- memberchk(b, [X,b]), X = a.
false.

?- X = a, memberchk(b, [X,b]).
X = a.

Por outro lado, em muitos casosmemberchk/2 será chamado comsuficientemente instanciado argumentos, onde pode ser visto como uma aproximação eficiente de uma relação pura.

Uma dessas relações puras por trás émemberd/2 (usandoif_/3):

memberd(E, [X|Xs]) :-
   if_(E = X, true, memberd(E, Xs) ).

Existem outras relações puras que podem ser aproximadas pormemberchk/2 para casos suficientemente instanciados?

Em outras palavras: Émemberd/2 um substituto declarativo completo paramemberchk/2 ou ainda existem casos legítimos em quememberchk/2 não pode ser substituído pormemberd/2?

questionAnswers(3)

yourAnswerToTheQuestion