用户定义的方形谓词

时间:2013-01-04 23:51:49

标签: prolog

我在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替换时,我没有得到错误)

我理解这些函数有内置的谓词,但是我是新手,这些是帮助我学习的小程序。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:2)

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

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

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

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

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

X的绝对值是否定的X。无论X是什么。因此,此规则也适用于X 2。您需要另一个条件X为负数。

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