Prolog确定性-分组事实
我有一套事实Prolog确定性-分组事实,prolog,deterministic,Prolog,Deterministic,我有一套事实 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中的aggregate或f
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中的aggregate
或findall
函数返回某种类型的列表,如
female, young = 2 (apple, bannana)
male, young = 1 (apple)
male, old = 1 (bannana)
female, old = 1 (apple)
…这样我就可以检查每个成员的总数并测试它是否大于1
任何想法都将不胜感激。怎么样
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获得每一类最喜欢的水果的列表。findall/3+sort/2->setof/3@PauloMoura:不完全是这样,setof在结果集为空时失败,而findall+sort则不然。那么,如果上面的findall/3调用在空列表的情况下成功,sort/2当然也会给出一个空列表,那么对member/2的调用将以t失败空列表中没有元素。因此,您可以将上面的findall/3+sort/2调用替换为对setof/3.True的调用,但我要说的是findall/3+sort/2与setof/3不同。