2017-05-06 166 views
0

我试图用这个温控功能来算整个欧洲人口:递归数SWI-Prolog的

printEuropePopulation(A) :- 
    country(_, X, _, _), 
    printEuropePopulation(A+X), 
    true. 
printEuropePopulation(A) :- write(A). 

和节目给了我

出局部栈的

当我打电话给我的功能

printE uropePopulation(0)

事实是这样的:

country("Slovenia",20,2009,27300). 
country("Finland",338,5238,35500). 
country("France",549,60876,33800). 

我怎样才能解决呢?提前致谢。

+1

你的第二个参数不是人口(以千计),它是面积(千平方公里)。你的第三个论点是人口。 – 2017-05-06 19:25:55

回答

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_all(sum(P), country(_, _, P, _), Total_population). 
Total_population = 68123. 
+0

非常感谢,它的工作原理。如何使用您的示例打印我的最终结果? – Burning

+0

@打印你的意思是打印最终结果?当我查询它已经打印的答案中显示的内容时。你想打印到打印机还是文件? – 2017-05-07 07:14:54

+0

不,只是要在我的屏幕上打印它,你的代码会在输出中返回“false”。我在递归的每一步都尝试过写结果,并且它非常完美,但我只需要最终的值 – Burning