在Prolog中减少相同的变量

时间:2017-02-26 09:06:47

标签: prolog

这样的事情:

decr(X, X) :-
    X is X-1.

我想用它来减少父规则中的数字,如果这个数字等于0,例如,父规则返回false.

2 个答案:

答案 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 _-1decr(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.