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
?