2016-02-27 38 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