我最近开始学习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.
我无法理解。提前谢谢!
答案 0 :(得分:2)
使用clpfd!
:- use_module(library(clpfd)).
基于equidistant_stride/2
,length/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