02 一阶逻辑:语法与语义

逻辑系统的表达能力是和其符号数量、语法、语义的定义的复杂性成正相关的。因为命题逻辑符号数量少,语法语义的定义简单,所以其表达能力也有限。从命名也可以看出来,命题逻辑是把“命题”作为原子对象来处理的,这就使得它无法触及语言中更细节的东西,比如“自然数”、“函数”、“…是…”、“存在…”等等。

所以,人们引入定义了一套更复杂因而也更精细的逻辑系统,称为谓词逻辑(Predicate Logic)系统。谓词逻辑是一个逻辑系统族,包含一阶谓词逻辑、二阶谓词逻辑、高阶谓词逻辑等等。弗雷格(Frege)是谓词逻辑的奠基人。相比于命题逻辑,他引入了量词符号“存在”与“任意”,这使得逻辑系统可以处理复杂的数学表述,是逻辑学发展史上的里程碑。本文讨论一阶谓词逻辑,简称一阶逻辑(First Order Logic, FOL)。

一阶逻辑的语法

一阶逻辑的字母表包含以下内容:

  • 变量符号(variable symbols):与命题逻辑完全相同,变量符号有,变量总数是至多可数的,为了方便也可以记为
  • 连接符号(connectives):非(),与(),或(),推出(),等价();
  • 量词(quantifiers):存在(),任意();
  • 等号(equality symbol):();(注意不是算术中常用的())
  • 括号(parentheses):(),()。用来区分优先级;
  • 关系符号(relation symbols):对于任意一个,有一组“元关系符号”(也可以没有);
  • 函数符号(function symbols):对于任意一个,有一组“元函数符号”(也可以没有);
  • 常数符号(constant symbols),,或者也可以用特殊的字母表示;

因为一阶逻辑引入了作为符号,所以我们从现在开始不再用表示语义等价关系。

以上分类中的最后三类比较特殊。前面五类在所有场合都相同,而后三类则通常在需要时再引入,甚至如果讨论中不涉及的话可以为空。我们把后三类符号统称为符号集(symbol set),记为。前五类符号记为。整个字母表记为。所以,在一阶逻辑中我们通常会在不同的场合会使用“不同”的字母表,这些不同的字母表只在符号集上有差异。所以在讨论一阶逻辑时,必须首先指明符号集是什么。

虽然我们还没有定义一阶逻辑的语法和语义,但我们可以先简略地讨论一下为什么要使用符号集。因为我们要描述更细节的数学对象,所以必须在逻辑系统中有专门的符号来代表运算符、函数、关系、常数等等。而在形式化不同的数学表达时,我们需要不同的符号。例如如果我们想用一阶逻辑形式化自然数上的定理,那么我们就可能需要二元关系“整除”,二元函数“加法”,以及常量“”。而如果我们想要形式化群论上的定理,则不需要整除或加法这些符号,而需要群元素间的运算(二元函数),“逆元”(一元函数),“单位元”(常量)等等。只有确定要形式化的对象之后我们才能确定字母表,字母表确定了以后所有一阶逻辑写出的命题就只能包含字母表中的字符了。

和命题逻辑相比,有了符号集以后我们可以用一个符号来表示一个命题(一张真值表),还可以用符号表示函数。可见,尽管我们还没有定义谓词逻辑的语法和语义,但我们已经感受到其复杂性。为什么把这样的逻辑系统称为“谓词逻辑”,其实有复杂的由来。这部分内容可以参考我[关于弗雷格语言哲学的笔记],弗雷格用带空洞的语词来表示谓词,而把量词“任意”和“存在”还原为了二阶谓词。而一阶逻辑就是量词之后的空洞只能填入原子对象的谓词逻辑系统。例如,我们可以说“对于任意一个自然数,…”,但不能直接说“对于任意一个自然数的子集,……”。因为自然数是原子对象,而自然数集的一个子集已经是一个一元关系了。一阶逻辑只接受把原子对象放进量词中,而不接受把一元关系放进量词中。如果接受把一元关系放进量词中,我们就来到了二阶逻辑。如果接受把一元关系的集合放进量词中,就来到了三阶逻辑(比如“对于任意自然数子集的集合,…”。依次类推,人们还定义了阶逻辑,接受把无穷阶对象放进量词中。

为什么我们要着重讨论一阶逻辑呢?首先,逻辑系统越复杂,表达能力就越强,但是越复杂的对象研究起来就越困难,一阶逻辑是这些系统中最简单的;其次,我们将会看到哥德尔证明了越复杂的逻辑系统越可能产生缺陷;最重要的是,人们证明了:通过一些基于集合论的转化,我们原则上可以用一阶逻辑表达当今世界上的所有数学定理。也就是说本质上对一阶逻辑的讨论就是对所有数学定理的讨论,我们之后会看到如何做到这一点。

Terms & Formulas

对于特定的符号集,我们归纳地定义下的一阶逻辑的项(称为-term):

  • 单个变量是一个-term;

  • 单个常数是一个-term;

  • 对于,如果都是-term,那么对于任意元函数符号也是一个-term;

基于term的定义,我们归纳地定义下的一阶逻辑的公式(称为-formula):

  • 如果是两个-term,那么是一个-formula;
  • 对于,如果都是-term,那么对于任意元关系符号,也是一个-formula;
  • 如果-formula,是一个变量,也是-formula;
  • 如果-formula,也是-formula。
  • 如果-formula,是一个变量(不是一般的term),也是-formula;

符号集下全体一阶逻辑formula称为符号集下一阶逻辑的语言,记为。这里的就是指language。全体-term的集合也有一个记号

我们要求一阶逻辑的term和formula都是有限长的字符串。

我们可以基于结构归纳法,定义语法意义下关于term或formula的函数。例如,一个重要的基于结构归纳的函数用来指明term中出现的所有变量的集合,这个函数可以定义如下:

Sentences

量词是一阶逻辑中最核心也最复杂的问题。在数学语言中,出现在量词后面的变量是很特殊的。比如,“对于任意正整数不是奇数就是偶数”这句话的出现在全称量词中,那么完全可以用另一个变量名替换之而完全不改变句子的含义:“对于任意正整数不是奇数就是偶数”。然而,如果变量不出现在量词中,那么不可以随意改名:“存在变量使得”,不能替换成“存在变量使得”。

这有点类似程序语言中的局部变量与全局变量。在一阶逻辑中我们把前者称为受限变量(bound variables),后者称为自由变量(free variables)。我们利用结构归纳严格地定义formula中的自由变量列表(受限变量就是所有不是自由变量的变量):

  • ,其中表示,,,

我们注意到根据定义,,即便曾出现在某个后过。这是合理的,因为如果某个变量在小的层面是临时的,如果它又在更大的层面充当全局的,则应当被理解为是全局的。这就好像程序语言中局部变量可以与全局变量重名,但不影响全局变量依然具有全局性。

如果一个formula中没有自由变量,也即如果所有变量都是局部的,那么这个formula一定描述了一些重要的性质,这性质不依赖于某些特定的变量,而是所讨论的数学对象本身的性质。比如“群中的任意元素总是存在逆元”,这是群这一代数结构本身的特性,而与群中某几个元素之间的关系如何无关。我们把没有自由变量的formula称为一个sentence。通常,我们会把公式集中只包含作为自由变量的子集记为,这样所有sentence的集合就可以记为。Sentence是一阶逻辑中的一个核心概念。

Remark: 仅通过语法我们就能判断出一个formula中的var, free列表,可以判断一个formula是否是sentence,与“语义”无关。

一阶逻辑的语义

在命题逻辑中,只需给出所有原子命题的真值指派,就可以确定任何命题的真值。在一阶逻辑中,我们依然坚持这种从原子出发向上的语义构成规则。但由于现在的原子对象不再是命题,所以语义解释不再是指派“真值”,而需要为变量指派某一特定的数学对象,为函数符号、关系符号、常量符号指派数学含义。在所有这些指派完成了之后,符合语法的一阶逻辑term和formula就会自动产生“意义”。对于formula来说,它将会结合组成它的term的含义以及逻辑连接词的含义(这一部分再次与命题逻辑重合)而产生真值。再一次我们强调,由此得到的formula的真值是客观、唯一的,只有在承认指派的客观唯一性以及数学规则的客观唯一性的前提下才能讨论一阶逻辑的语义。

就像命题逻辑中同一个变量有可能被指派为真也有可能被指派为假,一阶逻辑中同一个符号也可能被指派多种含义。例如,对于,我们可以为它赋予一种语义,将其解读为“任何自然数都能整除自己”,这就是一个“真命题”;也可以赋予它另一种语义,将其解读为“任何实数都小于自己”,就变成了一个“假命题”。

Structures

在一阶逻辑中,由于量词的存在,首先需要确定我们讨论的数学对象的“范围”。因为这关系到当你说“对于任意”时,你究竟说的对于任意实数,还是对于任意整数,还是对于任意平面,等等。因此,我们首先要指定一个集合,这个称为论域(universe),记为。指定论域之后,符号集的论域也随之确定。一个元关系就是某个的子集,例如当我们说实数满足小于关系,就是指有序对落在的子集当中;同理,一个元函数就是某个的映射。每个常数符号对应中某个特定的元素。

指定论域以后,我们需要指定符号集中每个符号的数学含义。我们把这个从符号到其具体含义的映射记为,根据定义。例如,如果我们指定符号表示实数上的小于关系,那么就会把映射到的子集

指定了以后,所有sentence(不含自由变量的formula)的语义就已经被完全解释了。虽然我们还没有通过结构归纳法严格定义如何从确定语义,但我们可以通过例子看到这一点:假设我们已经指定为实数集为实数上的小于关系,那么的语义就是“对于任意实数,我们有”。

由此可见,二元组本身已经为很大一部分一阶逻辑formula赋予了语义(并且根据我们对sentence的理解,是“重要的”那部分)。我们把二元组记为,称为一个上的结构(-structure)。确定了所有变量的“定义域”和符号集中每个符号的数学含义。为了方便,常把简记为

例如,对于符号集,其中是二元函数符号,是二元关系符号,是常数符号。取为自然数的加法运算,为自然数的乘法运算,为自然数的序关系;为自然数上的加法单位元和乘法单位元这两个常数。这样就是一个自然数算数的structure,常记为,为了方便也可以展开写作

Interpretations

在确定了structure以后,我们给变量赋值。我们给出一个的映射,这个映射称为赋值(assignment)。有了,我们就应当可以确定每个term和formula的语义。所以,我们把一个-structure和一个-assignment的二元组称为一个下的解释(-interpretation),记为

基于结构归纳,定义term的语义为:

formula的语义定义如下:(我们用来表示的语义为真,来表示的语义为假。)

  • 当且仅当“是论域当中的同一个元素”为真;
  • 当且仅当“元关系成立”为真;
  • 当且仅当“”;
  • 当且仅当“并且”为真;
  • 当且仅当“或者”为真;
  • 当且仅当“,或者”为真;
  • 当且仅当“,或者”为真;

当变量出现在量词中时,我们实际上并不关心该变量的赋值。想表达的是,用论域中的每个元素代入中出现的所有,同时保持其它的变量的赋值不变,都有始终为真。为此,我们需要一个描述为formula中的某个特定变量赋特殊的值的方便的符号。对于变量,定义,表示在原赋值中把变量的赋值强制修改为。相应地,。这样,我们就可以给出带量词的formula的语义的定义:

  • 当且仅当“对于任意中的元素都有”为真;
  • 当且仅当“存在中的元素使得”为真;

Remark: 对于sentence,我们在讨论语义时给出structure就足够了。此时我们可以把简写为

和命题逻辑中一样,我们可以定义语义性质和语义关系:

-formula 是永真式,如果在任何解释下都有,用符号“”来表示;例如

-formula 是可满足的,如果存在解释使得,用符号“”来表示;

在选定符号集以后,对于两个-formula ,如果对于任何一个解释都成立“只要,就有”,就称的语义后承,记为

是一个-formula集合,是一个-formula。如果对于任何一个解释都成立“只要满足‘所有都有’,就有‘’”,就称命题是命题集合的语义后承,用同样的符号记为

对于两个-formula ,如果对于任何一个解释都成立“当且仅当”,就称是语义等价的。

由结构归纳以及真值表可以证明:

  • 等价于
  • 等价于
  • 等价于

由此可见,一阶逻辑中符号有功能完全性。在之后做formula的结构归纳时,我们只需对这三个符号做归纳。

The Coincidence Lemma

对于两个不同的interpretation ,什么时候它们对一个term 的解释是相同的?自然,如果本身有相同的universe,对符号集的交集有相同的解释, 对中的每个变量有相同的解释,那么就一定满足

什么时候两个不同的interpretation 对一个formula 有相同的解释?是相同的?自然,如果本身有相同的universe,对符号集的交集有相同的解释,对中的自由变量有相同解释,那么就一定满足

我们把以上两点总结成一条引理,称为The Coincidence Lemma:如果有相同的universe ,在符号集的交集上对符号都有相同的解释,那么:

  • 如果在所有的变量上有相同解释,就成立
  • 如果的所有自由变元上有相同解释,就成立

通过简单的结构归纳即可证明。

The Isomorphism Lemma

现在考虑是sentence,此时只需要更弱的条件。首先,对于sentence我们只需退回到structure层面做讨论。其次,我们可以定义structure之间的同构关系(isomorphism),而不再要求universe和符号集的解释完全相同。两个同构的structure本质上是完全相同的,只是元素和符号的名称不同。定义如下:

对于两个-structure ,如果它们对应的universe 存在一个的双射,并且对于中的任何元关系符号成立 ,对于中的任何元函数符号成立 ,对于中的任何常数符号成立,就称是同构的,记为。容易证明isomorphism关系是一种等价关系,也即满足自反、对称、传递三条性质。

如果,那么对于任意-sentence ,成立,这称为The Isomorphism Lemma。

这一引理可以通过对formula的结构归纳严格证明(注意,不能对sentence归纳,因为sentence是基于formula定义的对变量有特殊限制的formula,不存在对sentence的归纳定义)。

特别需要指出的一点是,The Isomorphism Lemma的逆命题是错误的。“对任意-sentence 成立”不能推出是同构的。然而这一点在符号集是有限的时候是正确的,有限时The Isomorphism Lemma是充分必要的,因为容易想象此时我们可以构造一个sentence,使得满足这个sentence的structure一定具有唯一的结构。然而当是无限集的时候,就无法构造出这样的sentence了(sentence是有限长的),我们之后会看到反例来说明尽管两个structure总是同时满足所有的-sentence,但却是不同构的。

The Substitution Lemma

在数学上,我们经常会用到代入(substitution)这一操作:代入操作是指对于某个term 或formula ,将其中的某个变量替换为某个term

term的代入操作是简单的,应当就是在字符串意义上把所有出现的地方简单地替换为。对于term ,把“同时把中的代换为代换为”这一操作记为,定义:(这里的中括号和横线并不是一阶逻辑符号,只是一个“记号”,在不会引起歧义的场合可以省略)

然而我们发现,formula中的代入操作并不应当只是在字符串意义上把所有出现的地方替换为。这是由量词引发的问题,考虑这样一个例子:,在自然数运算的解释下这个formula的语义是“是偶数”。所以我们期待如果我们把任何变量“代入”,它的语义都是“是偶数”。然而,如果我们把出现在量词中的代入,得到的是,这个formula的语义显然不是“是偶数”而是“存在自然数与自己的和等于自身”,也即“是自然数”。如果替换新的存在量词,,语义就满足了。所以,我们在代入时应当对量词中的变量做一些特别的关照。对于formula ,把“同时把中的代换为代换为”这一操作记为,定义:(有了语义等价,我们可以减少一些归纳的情况了)

  • 对于,取出中那些属于的变量构成一个子列。如果不在当中出现,那么 ;否则,,其中是不在中出现的变量,且是中下标最小的那个;

我们来理解我们对量词替换的修正。首先,对非自由变量的替换没有意义,把自己替换成自己也没有意义;其次,应当保证新的量词变量不在替换后的项中出现,如果不需要修改量词变量就不修改,否则就修改为从未出现过的一个变量,为了定义的确定性我们规定选择下标最小的那个。

以上替换规则是基于我们想让“替换后语义得以保持”的愿望定义的一系列字符串变换操作。简而言之它会把term中所有想要替换的变量替换成新的项,把formula中的想要替换的自由变量替换成新的项。我们需要验证,这样的变换确实“保持了语义”。而对语义的保持与否体现在用于解释这些term和formula的interpretation中赋值函数是否发生了“合理的变化”。首先,我们推广赋值函数上“替换”的概念:定义。对于任意interpretation ,我们想要验证以下两件事成立:

  • 对于任意term ,始终成立
  • 对于任意formula ,始终成立

再一次,我们可以用结构归纳说明以上两点确实成立。这称为The Substitution Lemma。这说明以上定义的“语法”上的替换方案确实达到了我们想在“语义”上达成的目的。