2016-09-28 1 views
1

여기에 2 개의 입력에 대한 더하기 코드가 있습니다. 결과에 대해 X + 1과 Y가 Z + 1 인 경우 Z에서 결과를 원합니다.2 개 이상의 입력에 대해 후속 함수를 추가로 사용하려면 어떻게해야합니까?

natural_number(0). 
    natural_number(s(X)) :- natural_number(X). 

    pl(0,X,X) :- natural_number(X). 
    pl(s(X),Y,s(Z)) :- pl(X,Y,Z). 

는하지만 그것이 우리가 사전에 감사

pl(s(0),s(s(0)),s(s(s(0))),W) 
    and got a result W = s(s(s(s(s(s(0)))))) 

같은 세 구성 요소의 유사한 코드를 사용할 수 있습니다 궁금합니다.

+0

첫 번째를 두 번째로 추가 한 다음 세 번째 결과를 추가 하시겠습니까? –

+1

해지 사유에 대한 일반적인 접근 방법은 [이 해답] (http://stackoverflow.com/a/10141181/772868)을 참조하십시오. – false

답변

1
pl(A, B, C, Sum) :- 
    pl(A, B, Tmp), 
    pl(Tmp, C, Sum). 

또는, 당신은 자연 번호 목록을 추가하려는 경우, 당신은 물론 그 위에 배를 수행 할 수 있습니다

pl([], 0). 
pl([N|Ns], Sum) :- 
    foldl(pl, Ns, N, Sum). 

또는 (후 CapelliC에 의해 제안) :

pl(Ns, Sum) :- foldl(pl, Ns, 0, Sum). 

PS : 후임 표기법을 사용하는 것이 항상 좋은 생각은 아닙니다. 적어도 하나의 유효한 사용은 큐의 길이를 추적하는 데 사용합니다 (this answer 참조).

+2

더 짧습니까? – CapelliC

+1

'pl/4'는 매우 열악한 터미네이션을 가지고 있습니다 : ['pl (A, B, C, D) terminates_if b (A),'p (Ns, Sum) b (B), b (C), b (A), b (B), b (D) .' (http://www.complang.tuwien.ac.at/cti/cgi/cti?texta= 자연수 280 % 29. % 0D % 0 자연수 28s % 28X % 29 % 29+ % 3A- + 자연수 28X % 29. % 0D % 0A % 0D % 0Apl % 280 % 2CX % 2CX % 29 + % 3A- + 자연 _ 번호 28X % 29. % 0D % 0Apl % 28s % 28X % 29 % 2CY % 2Cs % 28Z % 29 % 29 + % 3A- + pl % 28X % 2CY % 2CZ % 29. % 0D % 0A % 0D % 0Apl % 28A % 2C + B % 2C + C % 2C + 합계 % 29 + % 3A- % 0D % 0A ++++ pl % 28A % 2C + B % 2C + Tmp % 29 % 2C % 0D % 0A ++++ pls % 28Tmp % 2C + C % 2C + Sum % 29.) – false

+0

@false 후속 표기법 산술의 종료는 여기에서 논의되었으므로 여기를 참고하십시오. –

관련 문제