这样的事情:
decr(X, X) :-
X is X-1.
我想用它来减少父规则中的数字,如果这个数字等于0,例如,父规则返回false.
答案 0 :(得分:2)
Prolog是声明性的:声明性语言的一个属性是一旦你设置了一个变量,就不能再给它另一个值了。在Prolog回溯当然可以" unground"一个变量,此外你可以为一个变量(如X=f(1,_)
)分配一个部分接地的表达式,但是当你深入调用堆栈时,每个表达式只能进一步接地。
结果:你必须使用另一个变量。像:
decr(X,NX) :-
NX is X-1.
这也是合乎逻辑的:在这里你定义了decr(X,X)
,因为 Prolog中谓词的参数没有输入/输出方向,所以不清楚是否要像{{{ 1}},decr(4,3)
,decr(X,3)
或decr(4,X)
。那么Prolog" 如何知道"您的第二个decr(X,Y)
应该是"新X
"?因此它是一个基本属性" Prolog你不能使用X
,调用一个谓词,突然X
有一个不同的值(但它可以 - 如前所述 - 进一步接地,但整数不能进一步接地)
始终错误或失败的原因是,X
未实例化:(如X
)在这种情况下,Prolog无法计算decr(_,_)
或者你给了一个参数中的一个(X is _-1
,decr(X,3)
或decr(4,X)
),但是在这种情况下你要求两个操作数都可以统一(因为它们都是{{ 1}})并且同时关闭一个,这是一个矛盾。
答案 1 :(得分:1)
正如已经提到的,你不能在Prolog中重新分配变量,但是最接近你明显想要的东西是succ / 2谓词:
?- succ(1, X).
X = 2.
?- succ(X, 5).
X = 4.
下一个最接近的可能是加/ 3:
?- plus(1, 2, X).
X = 3.
?- plus(1, X, 3).
X = 2.
?- plus(X, 2, 3).
X = 1.