Prolog 递归溢出

发布于 2024-11-16 17:57:13 字数 156 浏览 4 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦情居士 2024-11-23 17:57:13

请注意,对于像 fact(0,N) 这样的查询,这两个定义(OP 和 pad)都不会终止。但 fact(1,2) 也不会终止。它应该失败。对于 fact(N, F) 它只给出一个正确答案,但应该有无穷多个。为此目的使用削减是非常棘手的。解决此问题的最简洁方法是添加目标 N > 0 到规则并有一个事实 fact(0,1)。 如果您使用 SWI-Prolog,还有更好的方法:使用 library(clpfd)代码>.在文档中,您会发现 n_factorial/2 已定义。它可用于以下查询:

?- n_factorial(47, F).
   F = 258623241511168180642964355153611979969197632389120000000000
;  false.
?- n_factorial(N, 1).
   N = 0
;  N = 1
;  false.
?- n_factorial(N, 3).
   false.

Please note that both definitions (the OP's and pad's) do not terminate for a query like fact(0,N). But also fact(1,2) does not terminate. It should fail. And for fact(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 goal N > 0 to the rule and have a fact fact(0,1). There is an even better way, provided you use SWI-Prolog: Use library(clpfd). In the documentation, you find n_factorial/2 already defined. It can be used for queries like:

?- n_factorial(47, F).
   F = 258623241511168180642964355153611979969197632389120000000000
;  false.
?- n_factorial(N, 1).
   N = 0
;  N = 1
;  false.
?- n_factorial(N, 3).
   false.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文