避免在Prolog绝对值谓词中使用cut

时间:2011-01-26 19:54:31

标签: prolog prolog-cut

我在prolog中使用以下代码实现了以下功能:

abs2(X, Y) :- X < 0, Y is -X.
abs2(X, X) :- X >= 0, !.

如何在不使用cut(“!”)的情况下实现此功能?

3 个答案:

答案 0 :(得分:9)

在Prolog的if-then-else结构中有“隐藏”的切口:

abs2(X,Y) :- X < 0 -> Y is -X ; Y = X.

这是一种怪癖,但Prolog并没有回溯构成if-then或if-then-else结构的“前提”的子目标。这里,如果X < 0成功完成第一次尝试,然后选择“then”子句覆盖“else”子句(因此将此行为描述为“隐藏”剪切)。

在问题中写的谓词 abs2 / 2 first 子句中,有更多的作用。正如尼古拉斯指出的那样,第二个条款末尾的削减没有任何影响(当你到达那里时没有选择点)。但正如卡雷尔指出的那样,如果第一个条款成功,就会有一个选择点。

所以我写的,允许使用剪切,是这样的:

abs2(X,X) :- X >= 0, !.
abs2(X,Y) :- Y is -X.

尼古拉斯的评论还提出了一种方法来“绝对化”绝对价值(而不是使用逻辑定义)并避免“削减”这种方式。

答案 1 :(得分:6)

我的序言有点生疏,但为什么你甚至需要削减?如果正确编写谓词,则回溯不能成功,因此不需要剪切:

abs(X, Y) :- number(X) , X <  0 , Y is -X .
abs(X, X) :- number(X) , X >= 0 .

答案 2 :(得分:3)

无需使用

简单地写一下:

fillna()