我目前正在学习FOL,并且有许多英语陈述,我正在尝试将其表述为FOL陈述。
我有英文陈述以及我对每个陈述的 FOL 尝试。我只是想知道是否有人可以让我知道我是否以及在他们身上出了问题,谢谢。
英文声明
-
一个高个子可以达到一个高钩。
-
一个小个子可以达到一个低钩。
-
高钩是免费的。
-
如果有一个衣帽钩,男人会挂他的外套,男人可以拿到那个衣钩。
-
保罗是个高个子。
-
约翰是个矮个子。
-
谁能把外套挂在什么钩子上?
一阶逻辑语句尝试
-
∀x man(X, tall) -> reach_hook(X, high_hook).
-
∀x man(X, small) -> reach_hook(X, low_hook).
-
免费(high_hook)。
-
∀x,y free(X) ^ reach_hook(Y,X) -> hang_coat(Y, X).
-
男人(保罗,高)。
-
男人(约翰,矮子)。
-
?- hang_coat(X,Y)。
当你说FOL时,我假设你的意思是Prolog。它们不是一回事。
一般评论:Prolog变量是隐式通用(全部)量化的,所以你不需要∀量词,这就是为什么Prolog没有它的原因。存在量词写为 X^,如
X^(man(X), tall(X))
但只能在谓词的主体中使用。如果你想说"有一个高个子"之类的话,你需要用一个原子来代表他,比如
tall(xyzzy001).
man(xyzzy001).
所以,你的例子。在#1和#2中,人和钩子显然是普遍量化的,但是你用一个原子来做钩子(或两个钩子)。此外,man/2
和reach_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 中。