2

我在 Windows 7 上使用 SWI-Prolog V 6.2.3。我编写了以下谓词来计算整数的绝对值和平方:

myabs(X,X):- X > = 0.

myabs(X,Y):- Y is -X.

mysq(X,S):- myabs(X,Y), S is Y * Y.

我收到以下行的错误(操作员错误):

2:Prolog 似乎不接受 -X。

3:Prolog 似乎不接受 Y * Y(当被 2 * 2 替换时,我没有收到错误)

我知道这些函数有内置谓词,但由于我是新手,这些都是帮助我学习的小程序。

4

2 回答 2

3

您在规则 1 中有错字:删除后面的空格>

myabs(X,X):- X >= 0.
myabs(X,Y):- Y is -X.
mysq(X,S):- myabs(X,Y), S is Y * Y.

然后,修正后:

?- mysq(-3,X).
X = 9.

您知道平方不需要 myabs 吗?

?- X = -3, Y is X*X.
X = -3,
Y = 9.

如@false 所述进行编辑,myabs/2 也需要更正,以防止在输入为正涉及回溯时出现错误结果。在第二个子句中添加一个守卫可以:

myabs(X, Y):- X < 0, Y is -X.

但我更喜欢 if/then/else 构造,即将这两个子句替换为

myabs(X, Y) :- X >= 0 -> Y is X ; Y is -X.
于 2013-01-04T23:59:23.087 回答
2

除了语法错误:您的定义myabs/2计算数字的绝对值。也就是说,它确实计算了它,但另外它做了一些不正确的事情!

?- myabs(2,Abs).
Abs = 2 ;
Abs = -2.

所以它说两个的绝对值是2 和 -2 这当然是不正确的。

Prolog 使用每条规则独立地导出解决方案,这意味着您可以单独阅读每条规则。有一些方法可以使规则相互依赖,但暂时让我们保持简单。您的第二条规则如下:

myabs(X,Y):- Y is -X.

的绝对值X是否定的X。不管是什么X。所以这条规则也适用于Xbeing 2。你需要一个进一步的条件,即X是否定的。

作为初学者,最好使用library(clpfd)代替(is)/2see

于 2013-01-05T13:43:50.723 回答