2014-12-27 3 views
1

최근에 프롤로그를 배우기 시작했고이 질문에 ... 붙어 있어요주어진 정수 N과 A에 대해 '1 * A + 2 * A + 3 * A + ... + N * A'를 계산합니다.

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

결과는 항상 하나가 꺼져있는 것처럼 보이 :

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

나는 그것을 알아낼 수 없습니다. 미리 감사드립니다!

+0

, ... – CapelliC

+0

이것은 정수 "a"가없는 값만 제공합니다. "a"도 포함되도록 어떻게 변경합니까? – Prolog

+2

이것은 생각만큼 어렵지 않습니다. 분명히 인수로'A'를 도입해야합니다. 가장 쉬운 대답은 결과가'A * sum (n)'인데, 여기서'sum (n) '은 현재 결과입니다. 'suma (N, Res) : - sum (N, Res1), Res is A * Res.'의 보조 술어로 현재'sum'을 사용할 수 있습니다.'A ''Res is Res2 + A * N'의 '1'의 배수로했던 것처럼. 그러나 그것은 더 많이 곱합니다. 비슷한 접근법이 있습니다. – lurker

답변

2

을 사용하십시오!

equidistant_stride/2, length/2을 바탕으로
:- use_module(library(clpfd)). 

하고는 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 
관련 문제