我正在尝试在prolog中创建一个阶乘代码但是从本地堆栈中得到错误,也就是说,它陷入了无限循环。我无法理解。 这是我的代码:
fact(0,1).
fact(1,1).
fact(X,Y):- X\==0, A=X-1, fact(A,Z), Y=X*Z.
我哪里错了?
答案 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)
做了什么,以及有多少答案可以做你明白了吗?