我已经使用以下代码实现了以下功能:

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

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

有帮助吗?

解决方案

在序言的If-then-else结构中,有“隐藏”的削减:

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

这是一个怪癖,但是Prolog并未在构成If-then或If-then-else构造的“前提”的子目标上回溯。在这里,如果x <0成功了第一次尝试,则选择“ else”子句的“然后”子句的选择(因此,将此行为描述为“隐藏”剪辑)。

削减的角色更多 第一的 谓词的子句 ABS2/2 正如问题所写。正如尼古拉斯(Nicholas)指出的那样,第二子句结束时的削减没有任何效果(到达那里时没有选择点)。但是,正如Kaarel指出的那样,如果第一个条款成功,则可以选择一个选择点。

因此,我会写的,允许使用削减的内容是:

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

尼古拉斯(Nicholas)的评论还提出了“算法”绝对值(而不是使用逻辑定义)并避免“剪切”的方法。

其他提示

我的序言有点生锈,但是为什么您甚至需要剪裁呢?如果您正确编写谓词,则回溯无法成功,因此不需要削减:

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

无需使用 !

只需写:

abs2(X,Y) :- Y is abs(X).
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top