2013-04-06 114 views
1

我有一個Prolog程序,它是爲了找出列表中所有數字的平方和而被三或五整除。然而,它返回多個結果,我不知道爲什麼。Prolog遞歸程序返回的結果太多

% --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). 

我得到以下輸出:

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

34是唯一的輸出我應該得到

回答

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(頭部)

您使用SWI-Prolog的,所以你可以使用模塊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

謝謝!我不知道prolog的削減哈哈(我是Prolog的新手)。我會看看lambda模塊:) – thegalah 2013-04-06 12:30:29