Recursion 递归计数SWI Prolog

Recursion 递归计数SWI Prolog,recursion,prolog,Recursion,Prolog,我想用这个功能计算整个欧洲的人口: printEuropePopulation(A) :- country(_, X, _, _), printEuropePopulation(A+X), true. printEuropePopulation(A) :- write(A). 程序给了我 本地堆栈外 当我调用我的函数 printEuropePopulation(0) 事实似乎是: country("Slovenia",20,2009,27300). country("F

我想用这个功能计算整个欧洲的人口:

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

我怎样才能修好它?提前谢谢。

我想你不能用递归谓词来实现这一点吗?收集所有事实,然后找出总数是比较容易的

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.

我想你不能用递归谓词来做这个?收集所有事实,然后找出总数是比较容易的

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.

你的第二个论点不是人口(以千计),而是面积(以千平方公里计)。你的第三个论点是人口。你的第二个论点不是人口(以千计),而是面积(以千平方公里计)。你的第三个论点是人口。非常感谢,它是有效的。如何使用您的示例打印最终结果?@Burning打印最终结果是什么意思?当我按照答案所示进行查询时,它已经打印出来了。您想将其打印到打印机还是文件?不,仅在我的屏幕上打印,您的代码在输出中返回“false”。我试着在递归的每一步写下结果,结果非常完美,但我只需要最后一步value@Burning如果输出中显示“false”,则代码中存在错误,当我使用您的事实和答案中的代码时,我不会得到“false”,例如,我只会得到类似“Population=12354”的结果。也许你的代码弄错了?@烧掉这个对我来说就像写的一样有效,但是你缺少了
list\U sum/2
Y你没有从我的答案中复制完整的代码吗?它应该有结束条件的子句
list\u sum([],0)。
非常感谢,它可以工作。如何使用您的示例打印最终结果?@Burning打印最终结果是什么意思?当我按照答案所示进行查询时,它已经打印出来了。您想将其打印到打印机还是文件?不,仅在我的屏幕上打印,您的代码在输出中返回“false”。我试着在递归的每一步写下结果,结果非常完美,但我只需要最后一步value@Burning如果输出中显示“false”,则代码中存在错误,当我使用您的事实和答案中的代码时,我不会得到“false”,例如,我只会得到类似“Population=12354”的结果。也许你的代码弄错了?@烧掉这个对我来说就像写的一样有效,但是你缺少了
list\U sum/2
Y你没有从我的答案中复制完整的代码吗?它应该有结束条件的子句
list\u sum([],0)。