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?