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

避免在Prolog绝对值谓词中使用cut,prolog,prolog-cut,Prolog,Prolog Cut,我用以下代码在prolog中实现了以下函数: abs2(X, Y) :- X < 0, Y is -X. abs2(X, X) :- X >= 0, !. abs2(X,Y):-X=0!。 如果不使用cut(“!”),我如何实现此功能?我的序言有点生疏,但为什么还要使用cut?如果正确编写谓词,回溯将无法成功,因此不需要剪切: abs(X, Y) :- number(X) , X < 0 , Y is -X . abs(X, X) :- number(X) , X >

我用以下代码在prolog中实现了以下函数:

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

如果不使用cut(“!”),我如何实现此功能?

我的序言有点生疏,但为什么还要使用cut?如果正确编写谓词,回溯将无法成功,因此不需要剪切:

abs(X, Y) :- number(X) , X <  0 , Y is -X .
abs(X, X) :- number(X) , X >= 0 .
abs(X,Y):-number(X),X<0,Y是-X。
abs(X,X):-number(X),X>=0。
在Prolog的if-then-else构造中有一个“隐藏”切口:

abs2(X,Y) :- X < 0 -> Y is -X ; Y = X.
尼古拉斯的评论还提出了将绝对值“算术化”的方法(而不是使用逻辑定义),并避免以这种方式“切割”。

无需使用

简单地写下:

abs2(X,Y) :- Y is abs(X).

您的代码仍然有一个选择点。这个选择会导致失败,但它仍然被考虑过。切分可以避免这种情况。如果您知道您正在处理整数值,您可以通过旋转位使用选择点计算ABS:另一个选项是:
ABS(X,Y):-Y是符号(X)*X。
(假设您的prolog实现支持内置的符号/1谓词)。另一个选项:
ABS(X,Y):-Y是ABS(X).
您命名的“隐藏切割”的行为与切割不同:/0还阻止尝试替换子句,但if-then-else中的本地commit不会。因此我觉得这个术语很糟糕。@mat:我很高兴能学到更好的术语。我写了“隐藏的切割”作为我提供解决方案的一种披露,避免(明显的)使用切割,因此读者可以判断我的解决方案是有效的还是“欺骗”。比较控制谓词的SWI Prolog文档(第2.4.7节),了解本地化提交/切入“if-then-else”的解释。
abs2(X,Y) :- Y is abs(X).