0

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

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

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

我以某种方式设法编写了第二个这样的:

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

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

有什么帮助吗?

4

2 回答 2

1

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

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

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

于 2013-10-29T13:24:09.333 回答
1

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

  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.
于 2013-10-29T13:25:39.470 回答