像这样:
decr(X, X) :-
X is X-1.
我想用它来递减父规则中的数字,如果这个数字等于 0,例如,父规则返回 false。
最佳答案
Prolog 是声明性的:声明性语言的一个特性是一旦设置了一个变量,就不能再给它另一个值。在 Prolog 中,回溯当然可以“取消接地”一个变量,而且你可以将一个部分接地的表达式分配给一个变量(比如 X=f(1,_)
),但是当你深入调用时堆栈,每个表达式只能进一步接地。
因此:您必须使用另一个变量。喜欢:
decr(X,NX) :-
NX is X-1.
这也是合乎逻辑的:这里你定义了decr(X,X)
并且由于Prolog 中谓词的参数没有输入/输出方向,不清楚是否你想像 decr(4,3)
、decr(X,3)
、decr(4,X)
或 这样调用它>decr(X,Y)
。那么 Prolog 如何“知道”您的第二个 X
应该是“新的 X
”?因此,它是 Prolog 的一个“基本属性”,您不能使用 X
,调用谓词,突然间 X
具有不同的值(但是它可以 - 如前所述之前 - 进一步接地,但整数不能进一步接地)。
它会总是出错或失败的原因是,要么 X
没有被实例化:(比如 decr(_,_)
) 在这种情况下,Prolog 无法计算 X is _-1
,或者您已经为其中一个参数指定了一个数字 (decr(X,3)
, decr( 4,X)
或 decr(3,3)
),但在那种情况下,您要求两个操作数可以统一(因为它们都是 X
)和同时相差一个,矛盾。
关于prolog - 递减 Prolog 中的相同变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42466637/