2016-02-27 76 views
1

我有一些Prolog代碼,並希望能夠跳過添加元素到結果列表,如果X和Y的產品大於某個值。任何想法我會如何去做這件事?序言,跳過基於規則添加元素到列表

例如

if Product > 10 

我到目前爲止

make_quads(_,[],[]). 
make_quads(X,[Y|TAIL],[[X,Y,Sum,Product]|Result]):- 
    make_quads(X,TAIL,Result), 
    Product is X * Y, 
    Product > 2, 
    Sum is X + Y. 

的函數被調用的代碼如下:

?- make_quads(5, [1,2,3,4,5,6], X). 

這將使以下的輸出:

X = [[5, 1, 6, 5], [5, 2, 7, 10], [5, 3, 8, 15], [5, 4, 9, 20], [5, 5, 10, 25], [5, 6, 11|...]] 

我我已經嘗試了一些方法以下,但SWI-Prolog的,只要我打電話

make_quads(_,[],[]). 
make_quads(X,[Y|TAIL],[[X,Y,Sum,Product]|Result]):- 
    make_quads(X,TAIL,Result), 
    Product is X * Y, 
    Product > 20, % I need to skip here 
    % Else continue running 
    Sum is X + Y. 
+0

你的代碼,在我看來,缺少頭部你的第二個謂語條款或有某種錯字。第二行顯示:make_quads(X,[Y | TAIL],[[X,Y,Sum,Product] |'似乎被截斷了嗎?另外,作爲Prolog中的一個術語,這些不是*謂詞*。 – lurker

+0

您的代碼中的哪個位置定義了您不希望超過的*特定值?或者您是否打算將該參數作爲參數傳遞給謂詞調用? – lurker

+0

我已更新說明概述了我已經嘗試過的方法,我知道產品> 20的目標,需要對其下面的代碼評估爲True,但我仍然不確定如何防止產品和總和被添加到結果列表如果產品是一個較小的值 –

回答

1

你已經觀察到,你的斷言失敗的原因是因爲它需要成功(沒有失敗)如果Product =< 20函數返回false,只是不保留這些值。就目前而言,一旦你的謂詞在Product > 20上失敗,整個謂詞就會失敗,因爲它缺少這樣一個子句

你是主子句需要分解成兩種情況。這樣做的簡單方法是在Product =< 20的情況下添加另一個子句。此外,您可以在這裏使用尾遞歸,這可以通過一些Prolog解釋器進行優化。無需設置值之前遞歸:

make_quads(_, [], []). 
make_quads(X, [Y|TAIL], [[X,Y,Sum,Product] | Result]):- 
    Product is X * Y, 
    Product > 20, 
    Sum is X + Y, 
    make_quads(X, TAIL, Result). 
make_quads(X, [Y|TAIL], Result):- 
    Product is X * Y, 
    Product =< 20, 
    make_quads(X, TAIL, Result). 

您還可以使用Prolog的->運營商,這是一個小更高效:

make_quads(_, [], []). 
make_quads(X, [Y|TAIL], Result):- 
    Product is X * Y, 
    ( Product > 20 
    -> Sum is X + Y,     % Do this if Product > 20 
     Result = [[X,Y,Sum,Product]|R] 
    ; Result = R      % Do this if Product =< 20 
    ), 
    make_quads(X, TAIL, R). 
+0

非常感謝您的耐心和您的幫助!(我會upvote你的答案,如果我有業力)乾杯,傑克 –

+0

@傑克埃文斯感到高興它幫助你可能無法upvote,但你可以通過點擊複選標記來接受答案:) – lurker