Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog确定性-分组事实_Prolog_Deterministic - Fatal编程技术网

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不同。