Mehr Determinismus für `memberd / 2`?

Viele Systeme bieten eine reine und effiziente Implementierung vonmember/2. Insbesondere bleibt kein Auswahlpunkt offen für:

?- member(b,[a,b]).
true.

whereas, eine naive Implementierung vonmember/2 ergibt eher:

?- member(b,[a,b]).
true ;
false.

Das ist zwar deklarativ richtig, aber weniger effizient.

Auf der anderen Seite gibt es einige technische Probleme mitmember/2. Es erlaubt redundante Lösungen, wie in:

?- member(a,[a,a]).
true ;
true.

memberd/2 löst dieses Problem mitif_/3 und(=)/3.

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

?- memberd(a,[a,a]).
true.

Diese Definition lässt leider wieder Auswahlpunkte offen - produziert; false ("übrig gebliebene Auswahlpunkte") in Situationen, in denen das Mitglied nicht:

?- memberd(X,[a,b]).
X = a ;
X = b ;
false.    % BAD - to be avoided!

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

So meine Frage: Gibt es eine Definition vonmemberd/2 das vermeidet den Auswahlpunkt wie dieser oben?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage