prolog - 我正在尝试为 fibbonaci 系列编写一个 prolog 程序。这段代码正在无限循环中。有人能告诉你错误是什么吗?
问题描述
fib(0,0).
fib(1,1).
fib(A,Result):-
fib(A-1,R),
fib(A-2,P),
Result is R+P.
解决方案
要了解原因,首先要缩小未终止的原因。这是程序中仍然循环的最小部分:
fib(0,0) :-假的。fib(1,1) :-假的。 fib(A,结果):- fib(A-1,R), false ,fib(A-2,P),结果是 R+P。
不管参数是什么,这个程序都会循环。因此,您的原始程序也会循环。
要解决此问题,您需要更改可见部分中的某些内容:您需要确保A > 1
. 以这种方式,程序现在终止。
此外,正如@andsanmar 正确指出的那样,A-1
单独不是一个数字,而只是一个术语-(A,1)
,因此它永远不会是0
nor 1
。所以要么写
fib(N,0) :- N =:= 0.
fib(N,1) :- N =:= 1.
...
或(is)/2
按照@andsanmar 的建议添加。
有关如何缩小未终止原因的更多信息,请参阅failure-slice。
推荐阅读
- django - 如何在 Django 休息框架中放置一个空文件
- mysql - 计算另一列中值的最高共现次数(MySQL)
- python-3.x - 在 selenium python 中找不到跨度文本
- c# - Blazor 不会重新渲染以显示我的对象
- php - 由数组组成的对象的 PHPDoc
- python - 如何使用用户 ID 将一个角色赋予多个不和谐用户
- javascript - 如何修复 Puppeteer chromium-browserxdg-settings: not found 问题?
- javascript - 如何在 js admin django“django.jQuery”中使用标签 url
- r - 按值而不是显示的标签过滤数据表
- sql - 多对多和自我参考表!获取用户拥有的所有角色。实体框架