计算阶乘的 Prolog 代码

标签 prolog factorial

我是 Prolog 新手,我正在尝试编写一段计算数字阶乘的代码。 此代码运行良好:

fact(0,1).
fact(N, R) :- N > 0, N1 is N - 1, fact(N1, R1), R is R1 * N.

但是这个没有:

fact(0, 1).
fact(N, R) :- N > 0, fact(N - 1, R1), R is R1 * N.

有人可以解释一下吗?

最佳答案

问题是 prolog 主要使用统一来进行计算。要让它执行算术运算,您需要使用 is 运算符显式告诉它执行算术运算。

因此,在您的第一个程序中,您明确地告诉它使用子句 N1 is N - 1 执行减法,这样就可以按预期工作。

但是在你的第二个程序中,当你编写 fact(N - 1, R1) 时,你并不要求算术计算,而是要求统一。

如果我定义了事实 fact(5 - 1, foo).,那么我可以查询 ?-fact(N - 1, Y), write([N, Y]). 和 prolog 很乐意将 N5 以及 Yfoo 统一起来。此查询将输出 [5, foo]

所以,更进一步,如果我有事实 fact(foo - bar).,那么查询 ?-fact(X - Y), write([X, Y]). 很乐意统一并返回 [foo, bar]- 并不表示减法 - 它是所表示事实的结构的一部分。

关于计算阶乘的 Prolog 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32042043/

相关文章:

Prolog fd_domain 未定义

list - Prolog:检查是否是矩阵并计算行数和列数

c - 需要左值作为赋值的左操作数

c - 为什么153的阶乘在下面的程序中失败了

python - 在 numba nopython 函数中计算阶乘的最快方法

正则锻炼: factorials

prolog - 提示不回来

prolog - 可以使用clpfd来实现覆盖算法吗?

prolog - Prolog 如何将 DCG 规则翻译成定句?

php - 如何在 PHP 中使用递归计算阶乘