2013-04-06 2 views
1

나는 3 또는 5로 나눌 수있는 모든 숫자의 제곱의 합을 구하는 프롤로그 프로그램을 가지고 있습니다. 그러나 그것은 하나 이상의 결과를 반환하고 나는 왜 확실하지 않습니다.너무 많은 결과를 반환하는 프롤로그 재귀 프로그램

% --divisibility tests-- 

div_test(N):- 
    % divisible by three? 
    0 is N mod 3. 
div_test(N):- 
    % divisible by five? 
    0 is N mod 5. 

% sum of an empty list is zero (base case) 
square_sum([], Sum):- 
    Sum is 0. 

% --recursive cases 
square_sum([Head | Tail], Sum) :- 
    div_test(Head), 
    square_sum(Tail, TempSum), 
    Sum is Head*Head + TempSum. 

square_sum([Head | Tail], Sum) :- 
    square_sum(Tail, TempSum), 
    Sum is TempSum. 

다음 입력이 주어 :

?-square_sum([1,2,3,4,5],Sum). 

I는 다음과 같은 출력 얻을 :

Sum = 34 ; 
Sum = 9 ; 
Sum = 25 ; 
Sum = 0. 

34 만 출력은 I 번째에

답변

2
% --recursive cases 
square_sum([Head | Tail], Sum) :- 
    div_test(Head), 
    square_sum(Tail, TempSum), 
    Sum is Head*Head + TempSum. 

square_sum([Head | Tail], Sum) :- 
    square_sum(Tail, TempSum), 
    Sum is TempSum. 

을 받아야 div_test 성공 여부를 테스트하지 않는 규칙 에드. 두 번째 규칙에서 (!)을 div_test (Head) 뒤에 추가하거나 \ + div_test (Head)을 추가 할 수도 있습니다.

당신은 SWI - 프롤로그를 사용, 그래서 당신은 모듈 lambda.pl를 사용할 수는 http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl이 발견

:- use_module(library(lambda)). 
div_test(N):- 
    % divisible by three? 
    0 is N mod 3. 
div_test(N):- 
    % divisible by five? 
    0 is N mod 5. 

square_sum(Lst, Sum) :- 
    foldl(\X^Y^Z^((div_test(X); div_test(X)) 
       -> Z is Y + X*X 
       ; Z = Y), Lst, 0, Sum). 
+0

감사 쓰기! 나는 프롤로그 하하 (나는 프롤로그에 처음 온 사람)의 컷에 대해 전혀 몰랐다. 나는 lambda 모듈을 살펴볼 것이다 :) – thegalah