【问题标题】:Prolog determinacy - grouping factsProlog 确定性 - 分组事实
【发布时间】:2012-05-25 20:19:05
【问题描述】:

我有一个事实如此设置......

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。

任何想法都将不胜感激。

【问题讨论】:

    标签: prolog deterministic


    【解决方案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+sort 得到一个类列表(性别/年龄)。第二个 findall 获取每个班级最喜欢的水果列表。

    【讨论】:

    • findall/3 + sort/2 -> setof/3
    • @Paulo Moura:不完全是,setof 失败,结果集为空,而 findall+sort 没有。
    • 所以?如果上面的 findall/3 调用以空列表成功, sort/2 当然也会给出一个空列表,然后对 member/2 的调用将失败,因为空列表中没有元素。因此,您可以将上面的 findall/3 + sort/2 调用替换为对 setof/3 的调用。
    • 没错,但我的意思是 findall/3 + sort/2 与 setof/3 相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    相关资源
    最近更新 更多