List Prolog-列表成员的总和

List Prolog-列表成员的总和,list,recursion,prolog,sum,prolog-setof,List,Recursion,Prolog,Sum,Prolog Setof,我一直试图在序言中找到一个国家的周长 我有完成的谓词 borders(Country1, Country2, Length) 及 它给出了集合中满足条件的所有项目的列表 为了得到周长,我试着这样做: circumference(C, Country) :- setof(X, borders(Country,_,X), Set), sum_list(Set,C). sum_list([], 0). sum_list([H|T], C) :- sum_list(T, Res

我一直试图在序言中找到一个国家的周长

我有完成的谓词

borders(Country1, Country2, Length)

它给出了集合中满足条件的所有项目的列表

为了得到周长,我试着这样做:

circumference(C, Country) :-
    setof(X, borders(Country,_,X), Set),
    sum_list(Set,C).

sum_list([], 0).
sum_list([H|T], C) :-
   sum_list(T, Rest),
   C is H + Rest.
。。。但我得到的输出只是边界谓词中两国之间的长度

我的测试:

?– circumference(C,angola).
C = 201 ;
C = 1376 ;
C = 2511 ;
C = 1110.
规则:

borders(angola,namibia,1376).
borders(angola,congo,201).
borders(angola,zambia,1110).
borders(angola,zaire,2511).

为什么
C
不能成为这些数字的总和?

我交换了周长/2个参数,但你明白了

circumference(Country,C) :- aggregate(sum(Y),S^borders(Country,S,Y),C).

这个问题与另一个国家的变量绑定有关。起初看起来很疯狂:

?- setof(X, borders(Country,_,X), Set).
Country = angola,
Set = [201] ;
Country = angola,
Set = [1376] ;
Country = angola,
Set = [2511] ;
Country = angola,
Set = [1110].
但是,如果您命名该变量,就会清楚发生了什么:

?- setof(X, borders(Country,OtherCountry,X), Set).
Country = angola,
OtherCountry = congo,
Set = [201] ;
Country = angola,
OtherCountry = namibia,
Set = [1376] ;
Country = angola,
OtherCountry = zaire,
Set = [2511] ;
Country = angola,
OtherCountry = zambia,
Set = [1110].
它无法将它们组合在一起,因为其他国家不同,即使您对绑定收到的值不感兴趣。使用
setof/3
的正确解决方案是使
OtherCountry
存在量化,这对于分组来说并不重要:

?- setof(X, OtherCountry^borders(Country,OtherCountry,X), Set).
Country = angola,
Set = [201, 1110, 1376, 2511].

setof/3
bagof/3
中,存在量化是一种表示其他国家将采用各种值的方式,但出于分组目的,您对它们不感兴趣。在很多情况下,
findall/3
只会产生一个结果,但您可能需要基于目标参数中的一些其他变量进行单独分组,因此我认为了解这种技术是很好的,尽管在这种情况下,
findall/3
可能是一种更简单的解决方案。可以找到更多的讨论。

为什么不
findall/3
?你为什么不也检查一下边界(uu,Country,X)?我想找到包含一个特定国家的国家,这不会给我不必要的值吗?找到所有解决问题的方法,谢谢!
?- setof(X, OtherCountry^borders(Country,OtherCountry,X), Set).
Country = angola,
Set = [201, 1110, 1376, 2511].