【问题标题】:Basic prolog rule creation基本序言规则创建
【发布时间】:2013-10-29 13:11:07
【问题描述】:

我是 Prolog 新手。 我正在我的大学上一门人工智能课程,所以我们不能使用高级 Prolog 功能:只有简单的事实和超级简单的规则。

我在将这两个句子转换为 Prolog 子句时遇到了一些麻烦:

  1. 每个爱所有动物的人都会受到某人的爱。
  2. 杀死动物的人没有人爱。

我设法写了第二个这样的:

loves(X, Y) :- animal(A), \+killed(Y, A).

但即使对于这个,我也很确定它不太正确:这条规则告诉每个没有杀死动物的人都会受到每个人的爱,这与我想要表达的相反。

有什么帮助吗?

【问题讨论】:

  • 你有哪些事实(正面知识)?

标签: prolog


【解决方案1】:

你研究过谓词演算,量词的逻辑吗?

在Prolog中表达这两个语句的存在问题。第一个假设,对于爱“所有动物”的每个 Y,存在一个爱 Y 的 X,但没有告诉我们如何“构建”X。第二个表示知道否定陈述,“任何杀死动物的人没人爱。”

您可能拥有表达所有个人、谁爱谁、谁爱所有动物以及谁杀死了动物的知识的事实。然后您可以编写 查询 来检查 1,2 是否成立。这不同于试图通过规则和事实来断言 1,2 的真实性。

【讨论】:

    【解决方案2】:

    你用对立面重写了你的问题。很好。

    1. X 爱 Y 暗示 B 没有杀死 C,C 是动物。

    但是你把它表达为所有其他条件的析取。你应该改为定义

    killed_no_animal(Y) :- forall(animal(A), \+killed(Y, A)).
    

    并使用killed_no_animal 作为所有其他谓词的必要条件:

    loves(X, Y) :- killed_no_animal(Y), other predicate.
    loves(X, Y) :- killed_no_animal(Y), other predicate.
    

    【讨论】:

    • 请注意,如果存在 A 没有被 Y 杀死的 some 动物,则 killed_no_animal/1 成功,可能不是预期的。 Prolog 中的量词很棘手,部分原因是它们是隐式表达的。
    • 对,我忘了。自从我上次使用 Prolog 已经很久了。更正为forall
    • 啊,这很好(明确量化)。
    • 我的通用量化方法(forall/2 是一个 SWI 主义)是对被检查属性的否定的一个失败陷阱。这里的属性(不杀动物)已经是一个否定,所以逻辑被简化了。不过评论太多了。
    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2019-05-10
    • 2013-10-23
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多