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
?