2013-04-06 51 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