2014-11-22 3 views
2

Prolog에 정수의 digit sum을 계산하는 규칙을 어떻게 정의 할 수 있습니까?프롤로그에서 숫자 합

예 :

digitsum[Integer, Result] :- ... 

되도록 X = 6 (= 1 + 2 + 3)에 질의 결과 digitsum(123, X).. SWI-Prolog에서 실행되는 솔루션은 높이 평가됩니다.

+0

아무 것도 시도하지 않았습니까? 또한, 1digitsum [Integer, Result]'는 Prolog에서 부적절한 구문입니다. – lurker

답변

2

이 문제는 자연스럽게 library(clpfd)를 사용하여 구현에 이르게 :

:- use_module(library(clpfd)). 

digitsum(Z,S) :- 
    Z #= 0, 
    S #= 0. 
digitsum(Z0, S0) :- 
    Z0 #> 0, S0 #> 0, 
    S0 #= Z0 mod 10 + S1, 
    Z1 #= Z0 // 10, % should be rather div 
    digitsum(Z1, S1). 

?- digitsum(D,S). 
D = S, S = 0 ; 
D = S, 
S in 1..9 ; 
D in 10..99, 
D/10#=_G5601, 
D mod 10#=_G5613, 
_G5601 in 1..9, 
_G5613+_G5601#=S, 
_G5613 in 0..9, 
S in 1..18 ... 

첫 번째 대답은 약 제로이다. 두 번째는 숫자 1..9가 합계와 같습니다. 그런 다음 번호 10 ... 99 등등에 대해 이야기합니다.

+0

@mat :'div'는 SWI에 없습니다. 응답은'/'하지만'//'또는'div'를 포함해서는 안됩니다 - 따라서. – false

+0

Thx, 답을 정확히 사용하면 예제 쿼리에서 오류가 발생합니다 :'ERROR : Domain error :'clpfd_expression '예상,'123 // 10''. 내가 뭘 잘못 했니? – user2030503

+0

@ user2030503 : 매우 오래된 버전의 clpfd가 있습니다. 당신은 대신에'/'를 쓸 수 있습니다. * à la rigueur * – false