[英]Prolog - sum of list members
我一直试图在Prolog找到一个国家的周长。
我有完成的谓词
borders(Country1, Country2, Length)
和
setof(Item, Condition, Set)
它给出满足条件的所有项目列表。
为了获得周长,我尝试这样做:
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
,存在量化是一种说法,即OtherCountry将采用各种值,但您对分组的目的不感兴趣。 有很多场景, findall/3
只会产生一个结果但你可能想要基于Goal参数中的一些其他变量进行单独的分组,所以我认为即使findall/3
很可能也很了解这种技术在这种情况下更直接的解决方案。 可以在这个答案中找到更多的讨论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.