递归计数SWI-Prolog

时间:2017-05-06 17:02:42

标签: recursion prolog

我试图用这个功能来计算整个欧洲人口:

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

我该如何解决?提前谢谢。

1 个答案:

答案 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.