对给定的整数“N”和“A”计算“1 * A + 2 * A + 3 * A + ... + N * A”

时间:2014-12-27 15:19:12

标签: prolog clpfd

我最近开始学习Prolog并且坚持这个问题......

如何更改此规则以获得“A * 1 + A * 2 + A * 3 + ... + A * N”的值?

sum(1,A,1).
sum(N,A,Res) :-
  N > 1, 
  Nminus1 is N-1,
  sum(Nminus1,A,Res2),
  Res is Res2 + N*A.

结果总是显示为1,如以下查询所示:

?- sum(4,2,Res).
Res = 19 ;                 % NO! expected: `Res = 20`
false.

我无法理解。提前谢谢!

1 个答案:

答案 0 :(得分:2)

使用

:- use_module(library(clpfd)).

基于equidistant_stride/2length/2和clpfd库谓词sum/3,我们写道:

n_a_sum(N,A,Sum) :-
   length(Zs,N),
   Zs = [A|_],
   equidistant_stride(Zs,A),
   sum(Zs,#=,Sum).

以下是OP给出的示例查询:

?- n_a_sum(4,2,Sum).
Sum = 20.              % expected result