如何在turbo prolog中模拟循环

时间:2016-05-21 16:06:47

标签: loops prolog

我想计算给定范围内奇数的总和,如1到9是给定输入。并且我的程序将显示1到9之间所有奇数的总和。尽管这个任务非常简单,但作为turbo prolog的启动程序,我无法处理循环来计算求和。任何帮助都会升值..

预感谢。

1 个答案:

答案 0 :(得分:0)

我不打算为你编写完整的解决方案,但可以提供一个如何以一般方式“循环”求和的想法。在Prolog中循环通常通过递归来完成。递归解决了这样一个事实:Prolog不会让你在实例化后在同一个谓词子句中重新实例化变量(除非你回溯)。以下是ISO Prolog语法。

nmap <Esc>[1;3D <C-w>h
nmap <Esc>[1;3B <C-w>j
nmap <Esc>[1;3A <C-w>k
nmap <Esc>[1;3C <C-w>l

第一个子句设置一个从值0开始的累加器。

第二个子句处理正常的递归情况,其中第一个值不超过最后一个。第一个值被添加到累加器以创建更新的累加器,并且“第一个”值递增以创建新的第一个值。对sum_values(First, Last, Sum) :- sum_values(First, Last, 0, Sum). sum_values(First, Last, Sum, Sum) :- First > Last. sum_values(First, Last, Acc, Sum) :- First =< Last, NewAcc is Acc + First, NewFirst is First + 1, sum_values(NewFirst, NewAcc, Sum). 的递归调用使用新累加器计算其余的和。

当第一个值最终超过最后一个值时,最后一个(第三个)子句将累加器的最终总和统一起来。

请注意,我可以在不引入累加器的情况下实现此功能,但是我不会拥有可以通过Prolog系统优化(如果需要)的尾递归。非累加器版本如下所示:

sum_values

这有点短,但没有可以重构的尾递归。

你需要为你的问题做的修改(这些是我所知道的,因为我对TP的一些语法只有一点熟悉):

  • sum_values(First, Last, 0) :- First > Last. sum_values(First, Last, Sum) :- First =< Last, NewFirst is First + 1, sum_values(NewFirst, Last, PartialSum), Sum is PartialSum + First. 替换为is/2(我认为TP使用=/2进行表达式评估)
  • 您可能需要将=/2替换为=<(我不记得TP喜欢哪一个)
  • 检查<=是否奇怪。如果不是,则需要跳过将其添加到累加器。

您还可以对奇数First进行初始检查,如果它不是奇数,则将其递增以形成新的First,然后继续通过递归而不是递增2加总和