如何在turbo prolog中模拟循环



我想计算给定范围内奇数的总和,比如1到9是给定的输入。我的程序将显示1到9之间所有奇数的总和。虽然这个任务在理论上很简单,但作为turbo prolog的初学者,我无法处理计算总和的循环。任何帮助都将不胜感激。。

提前感谢。

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

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).

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

第二个子句处理第一个值不超过最后一个值的正常递归情况。第一个值被添加到累加器以创建更新的累加器,并且"第一个"值被递增以创建新的第一个值。对sum_values的递归调用使用新的累加器计算和的剩余部分。

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

注意,我本可以在不引入累加器的情况下实现这一点,但我不会有尾部递归,Prolog系统可以对其进行优化(如果需要)。非累加器版本如下:

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.

这稍微短了一点,但没有可以重构的尾部递归。

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

  • =/2替换is/2(我认为TP使用=/2进行表达式求值)
  • 你可能不得不用<=代替=<(我不记得TP喜欢哪一个了)
  • 检查First是否为奇数。如果不是,则需要跳过将其添加到累加器中

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

最新更新