Prolog 递归溢出
fact(1,1):-!.
fact(N,F):-
N1=N-1,
fact(N1,F1),
F=F1*N.
它会导致 stackoverflow(不是网站)!不应该是因为剪切(!)。它在 SWI-Prolog 中工作吗?
fact(1,1):-!.
fact(N,F):-
N1=N-1,
fact(N1,F1),
F=F1*N.
It leads to the stackoverflow(not the site)! It shouldn't because of the cut(!). Does it work in SWI-Prolog?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
请注意,对于像
fact(0,N)
这样的查询,这两个定义(OP 和 pad)都不会终止。但fact(1,2)
也不会终止。它应该失败。对于fact(N, F)
它只给出一个正确答案,但应该有无穷多个。为此目的使用削减是非常棘手的。解决此问题的最简洁方法是添加目标N > 0
到规则并有一个事实fact(0,1)。
如果您使用 SWI-Prolog,还有更好的方法:使用library(clpfd)
代码>.在文档中,您会发现n_factorial/2
已定义。它可用于以下查询:Please note that both definitions (the OP's and pad's) do not terminate for a query like
fact(0,N)
. But alsofact(1,2)
does not terminate. It should fail. And forfact(N, F)
it gives only one correct answer, but there should be infinitely many. Using cuts for such purpose is very tricky. The cleanest way to fix this is to add the goalN > 0
to the rule and have a factfact(0,1).
There is an even better way, provided you use SWI-Prolog: Uselibrary(clpfd)
. In the documentation, you findn_factorial/2
already defined. It can be used for queries like: