2012-10-23 337 views
0

我的規則應該統一第一個參數與列表中的第三個元素。該列表是規則中的第二個參數。如果沒有第三個元素,這應該失敗。SWI-Prolog規則

經過很多例子和困惑,我創建了這條規則。

third(X,[_|T]):- 
    [_,Y] = T,!,fail, 
    (Y,X). 

所以我的理解,我認爲是不正確,將集合Y到列表T的第三個要素,因爲T爲初始列表的尾部。然後它會統一Y及其X.

仍然困惑的代碼,「統一」這些元素

回答

2

fail!確保你的程序將不會成功後,因爲你與切割commiting選擇和然後失敗。

只有當列表中有三個元素時,纔可以訪問列表的第三個元素:您跳過過程頭部的第一個元素,然後從尾部獲取第二個元素。

third(X,[_|T]):- 
    [_,X] = T. 

請注意,如果列表中沒有完全三個元素,則此過程將失敗。

然而,這是更簡單,直接在該過程的頭訪問所述第三元件,e.g:

third(X, [_, _, X|_]). 

這將統一X與來自第二個參數列表的第三個元素。 |_部分允許列表擁有更多元素(它將統一尾部與匿名變量)。