如何在Prolog中计算数字序列的总和 [英] How to calculate a sum of sequence of numbers in Prolog

查看:162
本文介绍了如何在Prolog中计算数字序列的总和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

任务是计算0到M之间的自然数之和.我使用SWI-Prolog编写了以下代码:

The task is to calculate a sum of natural numbers from 0 to M. I wrote the following code using SWI-Prolog:

my_sum(From, To, _) :- From > To, !.
my_sum(From, To, S) :-
  From = 0,
  Next is 1,
  S is 1,
  my_sum(Next, To, S).
my_sum(From, To, S) :-
  From > 0,
  Next is From + 1,
  S is S + Next,
  my_sum(Next, To, S).

但是当我尝试计算时:

my_sum(0,10,S), writeln(S).

我得到了False而不是正确的数字.这个示例出了什么问题?

I got False instead of correct number. What is going wrong with this example?

推荐答案

对于下一个\ = 0:S is S + Next来说,这肯定是错误的.另一个更基本的问题是您以反向"顺序进行计算.也就是说,当From > To和程序停止时,您不会取回"结果.然后,您应该添加一个累加器(另一个要传播到所有递归调用的参数),并在最后一步将其与部分和统一起来.

this is surely false for Next \= 0: S is S + Next. Another more fundamental problem is that you're doing the computation in 'reverse' order. That is, when From > To and the program stop, you don't 'get back' the result. Then you should add an accumulator (another parameter, to be propagated to all recursive calls) and unify it with the partial sum at that last step...

无论如何,应该更简单:

Anyway, should be simpler:

my_sum(From, To, S) :-
  From < To,
  Next is From + 1,
  my_sum(Next, To, T),
  S is T + From.
my_sum(N, N, N).

| ?- my_sum(2, 4, N).
N = 9

这篇关于如何在Prolog中计算数字序列的总和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆