我在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替换时,我没有得到错误)
我理解这些函数有内置的谓词,但是我是新手,这些是帮助我学习的小程序。
答案 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
查看clpfd