prolog - 递减 Prolog 中的相同变量

标签 prolog

像这样:

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/

相关文章:

prolog - O(1) 术语查找

compiler-errors - 序言中的编译错误

list - 检查序言中多个不同的数字列表

prolog - 如何使用序言进行编程,使用列表进行逆向

prolog - 显示给定Prolog程序的WAM代码

syntax - prolog,非常简单的dcg语法

prolog - Prolog Rule-需要帮助以使某些工作正常进行?

prolog - 计算一组不同的奇数(如果存在的话),使得它们的总和等于给定的数字

prolog - 如何定义这个谓词,使其不会永远运行

prolog - 如何在序言中轮换列表?