[英]Prolog recursive program returning too many results
我有一个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是我应该获得的唯一输出
% --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-Prolog,因此可以使用http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl中找到的模块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).
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.