我是 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 很乐意将 N
与 5
以及 Y
与 foo
统一起来。此查询将输出 [5, foo]
。
所以,更进一步,如果我有事实 fact(foo - bar).
,那么查询 ?-fact(X - Y), write([X, Y]).
很乐意统一并返回 [foo, bar]
。 -
并不表示减法 - 它是所表示事实的结构的一部分。
关于计算阶乘的 Prolog 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32042043/