2013-03-15 3 views
1

프롤로그 프로그램을 사용하여 시리즈의 합을 찾고 싶습니다. 내가 생각프롤로그에 시리즈의 합

1+n+n^2+n^3+..................+n^m 

위의 코드를 잘입니다 :

pow(N,1,R):- R is N. 
pow(N,M,R):- X is M-1,pow(N,X,R1),R is R1*N. 

sum(N,1,R) :- R is N+1 . 
sum(N,M,R) :- X is M-1, X>1,sum(N,X,R1),pow(N,M,R2), R is (R1+R2). 

나는 다음과 같은 일련의 합계를 찾으려는이 목적을 위해, 나는 다음과 같은 프로그램을 작성했습니다. 그러나 프로그램을 실행하면 "아니오"출력이 표시됩니다. 왜 ? 나는 많은 노력을했지만 기대했던 결과를 얻을 수 없었다.

+0

하는 당신이 방법을 공유 할 수 합계 술어를 호출할까요? –

+0

합계 술어를 sum (2,7, R)로 호출합니다. 답은 255 여야하지만 놀랍게도 출력은 "아니오"입니다. –

답변

0

당신은 X>1의 다른 지점을 그리워하고 당신이 그것을 제거하면, 당신은 결과를 얻을 :

... 
sum(N,M,R) :- X is M-1, sum(N,X,R1), pow(N,X,R2), R is (R1+R2). 
... 
?- sum(2,3,X). 
X = 15 ; 
^C 

을하지만 프로그램 (^ C는 루프를 중단하는 데 사용) 종료되지 않습니다.

내가 더 나은 LCO (마지막 통화 최적화)에 의해 허용 효율성과 펑 내장 얻기 위해, 어큐뮬레이터를 사용하여 재 작성합니다 :

sum(N,M,R) :- sum(N,M,0,R). 

sum(N,M,A,R) :- 
    ( M > 0 
    -> A1 is A + N^M, %% N**M, 
     M1 is M-1, 
     sum(N,M1,A1,R) 
    ; R is A + 1 
    ). 

편집 조작에 대한 SWI - 프롤로그 문서를 (**)/2이 잘못되었습니다 : 더 나은/2를 사용 (^)을, @false

+0

(^)/2 대신 (**)/2를 사용해야합니다. – false

+0

@false : [docs] (http://www.swi-prolog.org/pldoc/doc_for?object=f%28%28^%29/2%29)는 **/2가 ISO라고 말하면서 ^/2는 이전 버전과의 호환성을위한 것입니다 ... – CapelliC

+0

이 문서는 거짓입니다. http://www.complang.tuwien.ac.at/ulrich/iso-prolog/dtc2#pow를 참조하십시오. 그리고'(**)/2' **는 항상 ISO에서 float를 제공합니다 **. – false

0

에 의해 언급 나를에 의해 또 다른 해결책은 다음과 같다 :

pow(N,1,R):- R is N. 
pow(N,M,R):- X is M-1,pow(N,X,R1),R is R1*N. 

sum(N,1,R) :- R is N+1 . 
sum(N,M,R) :- M>1,X is M-1,sum(N,X,R1), R is (R1+N**M).