使用memberd/2
基於library(reif)
可用於SICStus | SWI,你在許多情況下獲得確定性:
?- memberd(a, [a,b]).
true.
?- memberd(a, [a,a]).
true.
?- memberd(a, [a,X]).
true.
?- memberd(a, [a|Xs]).
true.
比較這對member/2
:
?- member(a, [a,b]).
true
; false. % leftover choicepoint
?- member(a, [a,a]).
true
; true. % redundant solution
?- member(a, [a,X]).
true
; X = a. % redundant solution
?- member(a, [a|Xs]).
true
; Xs = [a|_A] % redundant answer
; Xs = [_A, a|_B] % redundant answer
; Xs = [_A, _B, a|_C] % redundant answer
...
而且仍然memberd/2
實施產生不同的答案,必要時
?- memberd(a, [X,Y]).
X = a
; Y = a,
dif(X, a)
; false.
即使在這種情況下,memberd/2
避免了冗餘member/2
:
?- member(a, [X,Y]).
X = a
; Y = a. % partially redundant
這兩個答案是部分多餘的:X = a, Y = a
由兩者描述!
?- member(a, [X,Y]), X = a, Y = a.
X = Y, Y = a
; X = Y, Y = a. % redundant solution
第一個'true'意味着它成功。 '假'意味着當你用''找到更多的解決方案時,它不會再找到解決方案,所以它在那個時候又回來了'假'。正常的Prolog行爲。另外,'member/2'是一個標準的Prolog謂詞。你應該把你的名字命名爲別的。標準謂詞具有與您顯示的行爲相同的行爲。 – lurker