Deklarative Verwendungen von memberchk / 2

memberchk/2 ist ein allgemein definiertes Prädikat, das definiert ist alsmember/2 wie so:

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

Es gelingt also nur bei der ersten Antwort vonmember/2. Ihre volle prozedurale Bedeutung passt nicht in eine reine Beziehung. Als Beispiel für sein nicht relationales Verhalten betrachten

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

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

Auf der anderen Seite, in vielen Fällenmemberchk/2 wird mit @ aufgeruf ausreichend instanziiert Argumente, bei denen es sich um eine effiziente Annäherung einer reinen Beziehung handelt.

Eine solche reine Beziehung dahinter istmemberd/2 (mitif_/3):

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

Gibt es noch andere reine Beziehungen, die durch @ angenähert werden könnememberchk/2 für ausreichend instanziierte Fälle?

it anderen Worten: Istmemberd/2 ein vollständiger, deklarativer Ersatz fürmemberchk/2 oder gibt es noch legitime Fälle, in denenmemberchk/2 kann nicht durch @ ersetzt werdmemberd/2?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage