我试图用这个功能来计算整个欧洲人口:
printEuropePopulation(A) :-
country(_, X, _, _),
printEuropePopulation(A+X),
true.
printEuropePopulation(A) :- write(A).
程序给了我
超出本地堆栈
当我打电话给我的功能时
printEuropePopulation(0)
事实如下:
country("Slovenia",20,2009,27300).
country("Finland",338,5238,35500).
country("France",549,60876,33800).
我该如何解决?提前谢谢。
答案 0 :(得分:2)
我认为你不能用递归谓词做到这一点?收集所有事实然后找到总和更容易。
total_population(Total) :-
findall(P, country_population(_, P), Ps),
list_sum(Ps, Total).
在你的定义中,你正在看看它看起来的区域,但我把人口数千:
country_population(C, P) :- country(C, _, P, _).
如果你想找到总和,你可以做一个递归谓词,因为现在你有一个列表中的所有人口数(第二个参数?)。
list_sum([], 0).
list_sum([X|Xs], Sum) :-
list_sum(Xs, S0),
Sum is S0 + X.
现在您可以查询它以查找country
?- total_population(P).
P = 68123.
但是如果您使用SWI-Prolog,您还可以使用一个名为“aggregate”的库,因为您可以使用它来聚合例如总和:
?- aggregate_all(sum(P), country(_, _, P, _), Total_population).
Total_population = 68123.