2011-12-08 56 views
4

如何編碼成員/ 2確定性最後 元素。目前我使用:代碼/ 2與某些確定

member(X,[X|_]). 
member(X,[_|Y]) :- member(X,Y). 

當我查詢以下:

?- member(X,[1,2]). 
X = 1 ; 
X = 2 ; 
No 

解釋器繼續返回2,因爲 還有一個選擇點後左搜索。我怎麼能實現成員/ 2 ,以便這不再發生?

但成員/ 2的全語義應予以保留,即 答案,如:

?- member(X,Y) 
Y = [X|_1] ; 
Y = [_1,X|_2] ; 
etc.. 

仍然將正常運行befor。

再見

+1

那麼它會波及到其他謂詞。當成員對最後一個元素是確定性的,那麼使用成員的其他謂詞也會得到更多的確定性。確定性很好,因爲它允許Prolog解釋器修剪環境並執行垃圾收集。 –

+1

好像你可以去看看swi pl的成員/ 2,它對最後一個元素是確定性的。 – m09

回答

4
member(B, [C|A]) :- 
    member_(A, B, C). 
member_(_, A, A). 
member_([C|A], B, _) :- 
    member_(A, B, C). 

是對SWI兩家上市調用的結果。

+1

是的,它在編制索引時起作用確定性。太好了。 –