3

我刚刚尝试在 Prolog 中实现绝对功能,但我遇到了一些奇怪的行为。我的代码是:

absval(X, RESULT) :- X >= 0, RESULT is X.
absval(X, RESULT) :- X < 0, RESULT is -X.

当我在 SWI-Prolog 中尝试时,absval(-2,X).我得到了

X = 2

yes

正如预期的那样。但否则,当我调用时absval(2,X),我得到X = 2 ?并且我应该插入另一个输入。按回车后我也得到了yes

第二个结果是什么意思?我的解决方案有什么问题?

4

2 回答 2

2

您报告的内容与我在这里得到的行为不符:

?- absval(2,X).
X = 2 ;
false.

这实际上是预期的。

如果您需要使其具有确定性,请使用剪切或更好的“if/then/else”构造:

absval(X, RESULT) :- X >= 0 -> RESULT is X ; RESULT is -X.
于 2014-05-17T17:53:04.483 回答
1

使用单个子句而不削减 if-then-else 结构的确定性版本:

absolute_value(Value, AbsoluteValue) :-
    AbsoluteValue is sign(Value) * Value.

请注意,这sign/1是一个标准的内置算术函数。

于 2014-05-17T18:47:13.263 回答