簡體   English   中英

Prolog - 列表成員的總和

[英]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/3bagof/3 ,存在量化是一種說法,即OtherCountry將采用各種值,但您對分組的目的不感興趣。 有很多場景, findall/3只會產生一個結果但你可能想要基於Goal參數中的一些其他變量進行單獨的分組,所以我認為即使findall/3很可能也很了解這種技術在這種情況下更直接的解決方案。 可以在這個答案中找到更多的討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM