Prolog错误:在factorial中超出本地堆栈

时间:2016-09-16 05:46:19

标签: prolog factorial

我正在尝试在prolog中创建一个阶乘代码但是从本地堆栈中得到错误,也就是说,它陷入了无限循环。我无法理解。 这是我的代码:

fact(0,1).
fact(1,1).

fact(X,Y):- X\==0, A=X-1, fact(A,Z), Y=X*Z.

我哪里错了?

1 个答案:

答案 0 :(得分:2)

A=X-1,后来是Y=X*Z。 Prolog顶级产品的优点在于您可以轻松地尝试代码所做的事情:

?- A = X-1.
A = X-1.

?- A = 5-1.
A = 5-1.

显然,Prolog嘲笑我们:)。 =运算符用于统一;如果你想做算术,你必须使用is/2

?- is(A, -(5, 1)).
A = 4.

通常写成:

?- A is 5-1.
A = 4.

这只是为了向您展示表达式是一个术语,并在第二个参数中评估该术语:

?- Expr = X-1, X = 3, Result is Expr.
Expr = 3-1,
X = 3,
Result = 2.

您对factorial的定义:如果您修复算术,它应该有效。请注意,如果开始时X的条件为X > 1而不是X \== 0,那么它会更干净:您当前的程序对fact(1,F)做了什么,以及有多少答案可以做你明白了吗?