2013-04-22 45 views
3

我想在Prolog中編寫一個元素處理函數。它幾乎與prolog謂詞成員/ 2相同,但它必須以不同的方式完成這項工作。爲了具體;我必須說,成員/ 2謂詞函數是這樣的:Prolog中的元素處理問題,但不是在常規列表中?

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

當你給例如查詢:member(X, [1,2,3])

它爲您提供X = 1; X = 2; X = 3;所有重做的順序。我想要一個元素函數幾乎相同。我想與成員函數相同的結果時,我給這樣的查詢:

element(X, (1,2,3)). 

的區別只是括號,而不是像這樣bracekts:[]
爲了做到這一點,我試過了:

element(X, (X,_)). 
element(X, (_,Tail)) :- 
    element(X,Tail). 

這與member/2謂詞函數的實現完全相同。但是,這並不工作,因爲它不會給最後一個元素是X=3. 所以我增加了一個事實,那就是:

element(X, X). 

但是,這並不工作,或者是因爲(明顯)它提供不必要的用以下真實元素回答:

X=(1,2,3) 
X=(2,3) 

我該如何處理?

+1

你的'成員/ 2'代碼爲關:應該讀作[_ |尾]',不'[_,Tail]' – m09 2013-04-22 13:56:04

+0

是的,我在這裏寫錯了,對不起,我現在正在改正。順便說一句,我正如你所說的以正確的方式在程序中使用它。 – 2013-04-23 09:10:52

回答

3

如同一個切割可以解決你的問題:

element(X, (X, _)). 
element(X, (_, Tail)) :- 
    !, element(X, Tail). 
element(X, X). 

測試:

?- element(X, (1,2,3)). 
X = 1 ; 
X = 2 ; 
X = 3. 

?- element(2, (1,2,3,2)). 
true ; 
true. 
+0

非常感謝,我很尷尬,我看不到這一點。我試圖使用剪輯,但因爲我對prolog非常陌生,所以無法在需要的地方正確放置它。我試圖弄清楚如何在測試時通過trace選項爲不同情況編寫prolog,但我無法真正理解cut(!)運算符的作用。任何人都可以用適當的方式解釋它嗎?再次感謝您的答覆。 – 2013-04-23 09:09:28

+0

我找到了這樣的解釋,它看起來不錯;我現在可以瞭解更多,但對於使用我必須習慣它:[鏈接](http://en.wikipedia.org/wiki/Cut_(logic_programming))。 – 2013-04-23 09:17:27

1

像Prolog中的(1,2,3)這樣的術語以逗號作爲主要函數。可能你想要使用運算符univ,用中指=..或其緊密關係functor/3arg/3來挑選這些元組。