关系逻辑【Relational logic】通过逻辑变量【logical variable】对命题逻辑【propositional logic】进行了扩展,使我们能够讨论任意的未命名个体【arbitrary un-named individuals】。但是,请考虑以下陈述【statement】:
Everybody loves somebody.
用关系从句逻辑【elational clausal logic,】来表达该陈述的唯一方法,就是明确列出每一对人,使得在每一对中,第一个人爱第二个人,例如:
loves(peter,peter). loves(anna,paul). loves(paul,anna).
首先,这并不是对上述陈述【statement】的精确逻辑翻译,因为它太露骨了(例如,Peter 爱自己的事实并不是从原来的陈述中得出的)。其次,这种转换只适用于有限域【 finite domains】,而原来的陈述【statement】也允许无限域【infinite domains】。许多有趣的领域是无限的,比如自然数的集合。全从句逻辑允许我们通过引入常数和变量之外的更复杂的术语来推理【eason about】无限域。上述陈述【statement】翻译成全从句逻辑为:
loves(X,person_loved_by(X)).
loves(peter,person_loved_by(peter))
这一事实是该从句的一个逻辑结论【logical consequence】。 既然我们知道每个人都爱着某个人【Everybody loves somebody】,那么一定存在 Peter 爱的人。我们给这个人起了抽象的名字:
person_loved_by(peter)
没有明确说明 Peter 爱的是谁。正如我们将看到的,这种由简单名称组成复杂名称的方式也使我们有可能在逻辑公式中反映出域【domain】的结构。
Exercise 2.9
翻译下面这几个逻辑从句:
-
every mouse has a tail;
-
somebody loves everybody;
-
every two numbers have a maximum.
Syntax
一个项【term】要么简单,要么复杂。常量和变量是简单的项【term】。一个复杂项【complex term】是一个函子【functor】(它遵循与常量和谓词相同的符号约定),后面跟着许多项【term】,用括号括起来并用逗号分隔,例如最年长的孩子 eldest_child_of(anna,paul)
。括号内的项【term】称为函子的自变量【arguments】,自变量【arguments】的个数是函子的元【arity】。同样,基本项【ground term】是没有变量的项。所有其他定义(原子【atom】、从句【,clause】、文字【literal】、程序【 program】)都与关系从句逻辑中的定义相同。
Unification vs. evaluation
函子【Functors】不应与数学函数【mathematical functions】混淆。尽管两者都可以看作是从对象【objects】到对象【objects】的映射,但并不像在数学中那样对包含函子的表达式进行求值【evaluated】来确定映射的值。相反,映射【mapping】的结果是一个名称【name】,它由合一【unification】决定。例如,给定复杂项【complex term】
person_loved_by(X)
,如果我们想知道 Peter 映射到的对象的名称,我们将 X 与 peter 合一【unify】得到person_loved_by(peter)
;这个基本从句【ground term】无法进一步求值【evaluated】了。这种方法的缺点是,我们为不同的个体引入不同的名称,但其结果可能是相同的,例如
person_loved_by(peter)
可能与peter 是
相同的。因此,关于相等【equality】(同一对象的不同名称)的推理是从句逻辑中的一个问题。有几种可能的解决方案,但它们不在本书的讨论范围之内。