Prolog 用户定义的平方谓词

Prolog 用户定义的平方谓词,prolog,clpfd,Prolog,Clpfd,我正在Windows7上使用SWI Prolog v6.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时,我不会得到错误) 我知道这些函数有内置的谓词,但由于我是新手,这些是帮助我学习的小程序。规则1:

我正在Windows7上使用SWI Prolog v6.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时,我不会得到错误)


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

规则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 noted,myabs/2也需要更正,以防止在输入为正且涉及回溯时出现错误结果。在第二个子句中添加一个保护可以:

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

除了语法错误:您对
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
为负值


作为初学者,最好使用
库(clpfd)
代替
(is)/2
参见thannnnnks!!是的,我看到myabs不是必需的,只是使用规则来更好地理解一个用户定义的谓词如何使用另一个谓词。
myabs(X,Y):- Y is -X.