0

我目前正在学习 FOL,并且有一些我正在尝试将其表述为 FOL 语句的英语语句。

我有英语陈述以及我在每个方面的 FOL 尝试。我只是想知道是否有人可以让我知道我是否以及在哪里出错了,谢谢。

英语陈述

  1. 一个高个子可以达到一个高钩。

  2. 一个小个子可以达到一个低钩。

  3. 高钩是免费的。

  4. 如果有一个免费的衣帽钩,一个男人会挂他的外套,并且这个男人可以够到那个衣帽钩。

  5. 保罗是个高个子。

  6. 约翰是个矮个子。

  7. 谁能把他们的外套挂在什么挂钩上?

一阶逻辑语句尝试

  1. ∀x man(X, tall) ->reach_hook(X, high_hook)。

  2. ∀x man(X, small) ->reach_hook(X, low_hook)。

  3. 免费(high_hook)。

  4. ∀x,y free(X) ^reach_hook(Y,X) -> hang_coat(Y, X)。

  5. 男人(保罗,高)。

  6. 男人(约翰,短)。

  7. ?- hang_coat(X,Y)。

4

1 回答 1

0

当您说 FOL 时,我假设您是指 Prolog。它们不是同一件事。

一般评论:Prolog 变量被隐式地普遍(全部)量化,因此您不需要 ∀ 量词,这就是 Prolog 没有它的原因。存在量词写成 X^,如

X^(man(X), tall(X))

但只能用于谓词体。如果你想说“有一个高个子”之类的话,你需要用一个原子来代表他,如

tall(xyzzy001).
man(xyzzy001).

所以,你的例子。在 #1 和 #2 中,人和钩子显然都被普遍量化了,但是你使用原子作为钩子(或两个钩子)。而且似乎是临时的man/2reach_hook/1所有人都只有一种财产吗?与架子、壁架、门把手相比,伸手可及的挂钩有什么特别之处……也许像下面这样的东西可能会更好。

reach(X,Y) :- man(X), tall(X), hook(Y), high(Y).
reach(X,Y) :- man(X), small(X), hook(Y), low(Y).

(更改为使其语法有效。)

在#3 中,您适当地使用了原子,但为了使其与前面的子句保持一致,我们可以改为说

hook(xyzzy002).
high(xyzzy002).
free(xyzzy002).

示例#5 和#6 类似。在#4中,您似乎已将钩子的规范简化为“衣钩”,这可能并不重要,并且您的谓词可能更通用,例如

hang(X,Z,Y) :- man(X), hook(Y), coat(Z), reach(X,Y), free(Y).

(更改为使其语法有效。)

假设这种形式化和填充数据库,问题#7可以表述为

?- hang(X,Z,Y), coat(Z), owns(X,Z).

并且owns/2可能也应该包含在#4 中。

于 2017-05-22T17:31:33.613 回答