2012-05-25 27 views
2

我有一個事實設爲所以......Prolog的確定性 - 分組事實

fav_fruit(male, young, apple). 
fav_fruit(female, young, bannana). 
fav_fruit(male, old, bannana). 
fav_fruit(female, old, apple). 
fav_fruit(female, young, apple). 

我需要找出是否有任何一組(性別,年齡),那裏有更多的一個最喜歡的水果(上述事實的答案將是(女性,年輕)

我一直在想解決的是如何使用prolog中的aggregatefindall函數來返回某種類型的列表,如....

female, young = 2 (apple, bannana) 
male, young = 1 (apple) 
male, old = 1 (bannana) 
female, old = 1 (apple) 

...這樣我可以檢查每個成員的總數,並測試它是否大於1.

任何想法將不勝感激。

回答

2

如何

fav_fruit_class(Gender-Age, List):- 
    findall(Gender-Age, fav_fruit(Gender, Age, _), LGenderAge), 
    sort(LGenderAge, SGenderAge), 
    member(Gender-Age, SGenderAge), 
    findall(Fruit, fav_fruit(Gender, Age, Fruit), List). 

第一的findall +排序得到的類的列表(性別/年齡)。第二個findall獲得每個班級最喜歡的水果列表。

+1

findall/3 + sort/2 - > setof/3 –

+0

@Paulo Moura:不完全,setof失敗,空結果集,而findall + sort不。 – gusbro

+0

那麼?如果上面的findall/3調用成功使用一個空列表,sort/2當然也會給出一個空列表,然後對member/2的調用將失敗,因爲在空列表中沒有元素。因此,您可以用setof/3的調用替換上面的findall/3 + sort/2調用。 –