Prolog Error: Out of Local Stack in factorial
Prolog Error: Out of Local Stack in factorial
我正在尝试在 prolog 中生成阶乘代码,但出现了超出本地堆栈的错误,也就是说,它陷入了无限循环。我不明白怎么办。
这是我的代码:
fact(0,1).
fact(1,1).
fact(X,Y):- X\==0, A=X-1, fact(A,Z), Y=X*Z.
我哪里错了?
是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.
根据您对阶乘的定义:如果您修正算术,它应该可以工作。请注意,如果 X
的条件在开始时说的是 X > 1
而不是 X \== 0
会更清晰:您当前的程序对 fact(1,F)
做了什么,以及有多少答案你明白了吗?
我正在尝试在 prolog 中生成阶乘代码,但出现了超出本地堆栈的错误,也就是说,它陷入了无限循环。我不明白怎么办。 这是我的代码:
fact(0,1).
fact(1,1).
fact(X,Y):- X\==0, A=X-1, fact(A,Z), Y=X*Z.
我哪里错了?
是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.
根据您对阶乘的定义:如果您修正算术,它应该可以工作。请注意,如果 X
的条件在开始时说的是 X > 1
而不是 X \== 0
会更清晰:您当前的程序对 fact(1,F)
做了什么,以及有多少答案你明白了吗?