逻辑系统的表达能力是和其符号数量、语法、语义的定义的复杂性成正相关的。因为命题逻辑符号数量少,语法语义的定义简单,所以其表达能力也有限。从命名也可以看出来,命题逻辑是把“命题”作为原子对象来处理的,这就使得它无法触及语言中更细节的东西,比如“自然数”、“函数”、“...是...”、“存在...”等等。
所以,人们引入定义了一套更复杂因而也更精细的逻辑系统,称为谓词逻辑(Predicate Logic)系统。谓词逻辑是一个逻辑系统族,包含一阶谓词逻辑、二阶谓词逻辑、高阶谓词逻辑等等。弗雷格(Frege)是谓词逻辑的奠基人。相比于命题逻辑,他引入了量词符号“存在”与“任意”,这使得逻辑系统可以处理复杂的数学表述,是逻辑学发展史上的里程碑。本文讨论一阶谓词逻辑,简称一阶逻辑(First Order Logic, FOL)。
一阶逻辑的语法
一阶逻辑的字母表包含以下内容:
- 变量符号(variable symbols):与命题逻辑完全相同,变量符号有v0,v1,⋯,变量总数是至多可数的,为了方便也可以记为x,y,z,⋯或a,b,c,⋯;
- 连接符号(connectives):非(¬),与(∧),或(∨),推出(→),等价(↔);
- 量词(quantifiers):存在(∃),任意(∀);
- 等号(equality symbol):(≡);(注意不是算术中常用的(=))
- 括号(parentheses):((),())。用来区分优先级;
- 关系符号(relation symbols):对于任意一个n∈N,有一组“n元关系符号”(也可以没有);
- 函数符号(function symbols):对于任意一个n∈N,有一组“n元函数符号”(也可以没有);
- 常数符号(constant symbols),c0,c1,⋯,或者也可以用特殊的字母表示;
因为一阶逻辑引入了≡作为符号,所以我们从现在开始不再用≡表示语义等价关系。
以上分类中的最后三类比较特殊。前面五类在所有场合都相同,而后三类则通常在需要时再引入,甚至如果讨论中不涉及的话可以为空。我们把后三类符号统称为符号集(symbol set),记为S。前五类符号记为A。整个字母表记为AS。所以,在一阶逻辑中我们通常会在不同的场合会使用“不同”的字母表,这些不同的字母表只在符号集上有差异。所以在讨论一阶逻辑时,必须首先指明符号集是什么。
虽然我们还没有定义一阶逻辑的语法和语义,但我们可以先简略地讨论一下为什么要使用符号集。因为我们要描述更细节的数学对象,所以必须在逻辑系统中有专门的符号来代表运算符、函数、关系、常数等等。而在形式化不同的数学表达时,我们需要不同的符号。例如如果我们想用一阶逻辑形式化自然数上的定理,那么我们就可能需要二元关系“整除”,二元函数“加法”,以及常量“0”。而如果我们想要形式化群论上的定理,则不需要整除或加法这些符号,而需要群元素间的运算(二元函数),“逆元”(一元函数),“单位元”(常量)等等。只有确定要形式化的对象之后我们才能确定字母表,字母表确定了以后所有一阶逻辑写出的命题就只能包含字母表中的字符了。
和命题逻辑相比,有了符号集以后我们可以用一个符号来表示一个命题(一张真值表),还可以用符号表示函数。可见,尽管我们还没有定义谓词逻辑的语法和语义,但我们已经感受到其复杂性。为什么把这样的逻辑系统称为“谓词逻辑”,其实有复杂的由来。这部分内容可以参考我[关于弗雷格语言哲学的笔记],弗雷格用带空洞的语词来表示谓词,而把量词“任意”和“存在”还原为了二阶谓词。而一阶逻辑就是量词之后的空洞只能填入原子对象的谓词逻辑系统。例如,我们可以说“对于任意一个自然数n,…”,但不能直接说“对于任意一个自然数的子集S,……”。因为自然数n是原子对象,而自然数集的一个子集已经是一个一元关系了。一阶逻辑只接受把原子对象放进量词中,而不接受把一元关系放进量词中。如果接受把一元关系放进量词中,我们就来到了二阶逻辑。如果接受把一元关系的集合放进量词中,就来到了三阶逻辑(比如“对于任意自然数子集的集合Q,…”。依次类推,人们还定义了ω阶逻辑,接受把无穷阶对象放进量词中。
为什么我们要着重讨论一阶逻辑呢?首先,逻辑系统越复杂,表达能力就越强,但是越复杂的对象研究起来就越困难,一阶逻辑是这些系统中最简单的;其次,我们将会看到哥德尔证明了越复杂的逻辑系统越可能产生缺陷;最重要的是,人们证明了:通过一些基于集合论的转化,我们原则上可以用一阶逻辑表达当今世界上的所有数学定理。也就是说本质上对一阶逻辑的讨论就是对所有数学定理的讨论,我们之后会看到如何做到这一点。
Terms & Formulas
对于特定的符号集S,我们归纳地定义S下的一阶逻辑的项(称为S-term):
-
单个变量符号vi是一个S-term;
-
单个常数符号ci是一个S-term;
-
对于n≥1,如果t1,⋯,tn都是S-term,那么对于任意n元函数符号f,ft1t2⋯tn也是一个S-term;
基于term的定义,我们归纳地定义S下的一阶逻辑的公式(称为S-formula):
- 如果t1和t2是两个S-term,那么t1≡t2是一个S-formula;
- 对于n≥1,如果t1,⋯,tn都是S-term,那么对于任意n元关系R符号,Rt1t2⋯tn也是一个S-formula;
- 如果φ是S-formula,¬φ也是S-formula;
- 如果φ,ψ是S-formula,(φ∧ψ)、(φ∨ψ)、(φ→ψ)、(φ↔ψ)也是S-formula。
- 如果φ是S-formula,x是一个变量符号(不是一般的term),∀xφ、∃xφ也是S-formula;
符号集S下全体一阶逻辑formula称为符号集S下一阶逻辑的语言,记为LS。这里的L就是指language。全体S-term的集合也有一个记号TS。
我们要求一阶逻辑的term和formula都是有限长的字符串。
我们可以基于结构归纳法,定义语法意义下关于term或formula的函数。例如,一个重要的基于结构归纳的函数var用来指明term中出现的所有变量的集合,这个函数可以定义如下:
- var(vi):={vi};
- var(ci):=∅;
- var(ft1⋯tn):=var(t1)∪⋯∪var(tn);
Sentences
量词是一阶逻辑中最核心也最复杂的问题。在数学语言中,出现在量词后面的变量是很特殊的。比如,“对于任意正整数n,n不是奇数就是偶数”这句话的n出现在全称量词中,那么完全可以用另一个变量名替换之而完全不改变句子的含义:“对于任意正整数m,m不是奇数就是偶数”。然而,如果变量不出现在量词中,那么不可以随意改名:“存在变量x使得f(x)=a”,不能替换成“存在变量x使得f(x)=b”。
这有点类似程序语言中的局部变量与全局变量。在一阶逻辑中我们把前者称为受限变量(bound variables),后者称为自由变量(free variables)。我们利用结构归纳严格地定义formula中的自由变量列表(受限变量就是所有不是自由变量的变量):
- free(t1≡t2):=var(t1)∪var(t2);
- free(Rt1⋯tn):=var(t1)∪⋯∪var(tn);
- free(¬φ):=free(φ)
- free((φ∗ψ)):=free(φ)∪free(ψ),其中∗表示∧,∨,→,⟺;
- free(∀xφ):=free(φ)∖{x}
- free(∃xφ):=free(φ)∖{x}
我们注意到根据定义,free((Ryx→∀y¬y≡z))={x,y,z},即便y曾出现在某个∀后过。这是合理的,因为如果某个变量在小的层面是临时的,如果它又在更大的层面充当全局的,则应当被理解为是全局的。这就好像程序语言中局部变量可以与全局变量重名,但不影响全局变量依然具有全局性。
如果一个formula中没有自由变量,也即如果所有变量都是局部的,那么这个formula一定描述了一些重要的性质,这性质不依赖于某些特定的变量,而是所讨论的数学对象本身的性质。比如“群中的任意元素总是存在逆元”,这是群这一代数结构本身的特性,而与群中某几个元素之间的关系如何无关。我们把没有自由变量的formula称为一个sentence。通常,我们会把公式集LS中只包含v0,⋯,vn−1作为自由变量的子集记为LnS,LnS:={φ∣φ∈LnS且free(φ)⊆{v0,⋯,vn}},这样所有sentence的集合就可以记为L0S。Sentence是一阶逻辑中的一个核心概念。
Remark: 仅通过语法我们就能判断出一个formula中的var, free列表,可以判断一个formula是否是sentence,与“语义”无关。
一阶逻辑的语义
在命题逻辑中,只需给出所有原子命题的真值指派,就可以确定任何命题的真值。在一阶逻辑中,我们依然坚持这种从原子出发向上的语义构成规则。但由于现在的原子对象不再是命题,所以语义解释不再是指派“真值”,而需要为变量指派某一特定的数学对象,为函数符号、关系符号、常量符号指派数学含义。在所有这些指派完成了之后,符合语法的一阶逻辑term和formula就会自动产生“意义”。对于formula来说,它将会结合组成它的term的含义以及逻辑连接词的含义(这一部分再次与命题逻辑重合)而产生真值。再一次我们强调,由此得到的formula的真值是客观、唯一的,只有在承认指派的客观唯一性以及数学规则的客观唯一性的前提下才能讨论一阶逻辑的语义。
就像命题逻辑中同一个变量a有可能被指派为真也有可能被指派为假,一阶逻辑中同一个符号也可能被指派多种含义。例如,对于∀v0Rv0v0,我们可以为它赋予一种语义,将其解读为“任何自然数都能整除自己”,这就是一个“真命题”;也可以赋予它另一种语义,将其解读为“任何实数都小于自己”,就变成了一个“假命题”。
Structures
在一阶逻辑中,由于量词的存在,首先需要确定我们讨论的数学对象的“范围”。因为这关系到当你说“对于任意x”时,你究竟说的对于任意实数,还是对于任意整数,还是对于任意平面,等等。因此,我们首先要指定一个集合,这个称为论域(universe),记为A。指定论域之后,符号集的论域也随之确定。一个n元关系就是某个An的子集,例如当我们说实数a,b满足小于关系,就是指有序对(a,b)落在R2的子集{(a,b)∣a,b∈R,a<b}当中;同理,一个n元函数就是某个An→A的映射。每个常数符号对应A中某个特定的元素。
指定论域以后,我们需要指定符号集中每个符号的数学含义。我们把这个从符号到其具体含义的映射记为a,根据定义a(R)⊆An,a(f):An→A,a(ci)∈A。例如,如果我们指定符号R表示实数上的小于关系,那么a就会把R映射到R2的子集{(x,y)∣x<y}。
指定了A和a以后,所有sentence(不含自由变量的formula)的语义就已经被完全解释了。虽然我们还没有通过结构归纳法严格定义如何从A和a确定语义,但我们可以通过例子看到这一点:假设我们已经指定A为实数集R,R为实数上的小于关系,那么∀v0Rv0v0的语义就是“对于任意实数x,我们有x<x”。
由此可见,二元组(A,a)本身已经为很大一部分一阶逻辑formula赋予了语义(并且根据我们对sentence的理解,是“重要的”那部分)。我们把二元组(A,a)记为A,称为一个S上的结构(S-structure)。A确定了所有变量的“定义域”和符号集中每个符号的数学含义。为了方便,常把a(f)简记为fA。
例如,对于符号集S={+,⋅,<, 0,1},其中+,⋅是二元函数符号,<是二元关系符号,0,1是常数符号。取A=N,a(+)为自然数的加法运算,a(⋅)为自然数的乘法运算,a(<)为自然数的序关系;a(0),a(1)为自然数上的加法单位元和乘法单位元这两个常数。这样A=(N,a)就是一个自然数算数的structure,常记为N<,为了方便也可以展开写作(N,+N,⋅N,<N,0N,1N)。
Interpretations
在确定了structure以后,我们给变量赋值。我们给出一个vi→A的映射β,这个映射称为赋值(assignment)。有了A和β,我们就应当可以确定每个term和formula的语义。所以,我们把一个S-structure和一个S-assignment的二元组称为一个S下的解释(S-interpretation),记为I=(A,β)。
基于结构归纳,定义term的语义为:
- I(vi)=β(vi);
- I(ci)=ciA;
- I(ft1⋯tn)=fA(I(t1),⋯,I(tn));
formula的语义定义如下:(我们用I(φ)=true来表示φ的语义为真,I(φ)=false来表示φ的语义为假。)
- I(t1≡t2)=true当且仅当“I(t1)与I(t2)是论域当中的同一个元素”为真;
- I(Rt1⋯tn)=true当且仅当“n元关系RA(I(t1),⋯,I(tn))成立”为真;
- I(¬φ)=true当且仅当“I(φ)=false”;
- I(φ∧ψ)=true当且仅当“I(φ)并且I(ψ)=true”为真;
- I(φ∨ψ)=true当且仅当“I(φ)=true或者I(ψ)=true”为真;
- I(φ→ψ)=true当且仅当“I(φ)=false,或者I(ψ)=true且I(psi)=true”为真;
- I(φ↔ψ)=true当且仅当“I(φ)=true且I(ψ)=true,或者I(φ)=false且I(ψ)=false”为真;
当变量出现在量词中时,我们实际上并不关心该变量的赋值。I(∀xφ)=true想表达的是,用论域中的每个元素代入φ中出现的所有x,同时保持其它的变量的赋值不变,都有φ始终为真。为此,我们需要一个描述为formula中的某个特定变量赋特殊的值的方便的符号。对于变量x,y和a∈A,定义βxa(y):={β(y)a,y=x,y=x,表示在原赋值β中把变量x的赋值强制修改为a。相应地,Ixa:=(A,βxa)。这样,我们就可以给出带量词的formula的语义的定义:
- I(∀xφ)=true当且仅当“对于任意A中的元素a都有Ixa(φ)=true”为真;
- I(∃xφ)当且仅当“存在A中的元素a使得Ixa(φ)=true”为真;
Remark: 对于sentence,我们在讨论语义时给出structure就足够了。此时我们可以把I(φ)=true简写为A(φ)=true。
和命题逻辑中一样,我们可以定义语义性质和语义关系:
S-formula φ是永真式,如果在任何解释I下都有I(φ)=true,用符号“⊨φ”来表示;例如∀x(x≡x);
S-formula φ是可满足的,如果存在解释I使得I(φ)=true,用符号“Sat φ”来表示;
在选定符号集S以后,对于两个S-formula φ,ψ,如果对于任何一个解释I都成立“只要I(φ)=true,就有I(ψ)=true”,就称ψ为φ的语义后承,记为φ⊨ψ;
设Φ是一个S-formula集合,ψ是一个S-formula。如果对于任何一个解释I都成立“只要满足‘所有φ∈Φ都有I(φ)=true’,就有‘I(ψ)=true’”,就称命题ψ是命题集合Φ的语义后承,用同样的符号记为Φ⊨ψ;
对于两个S-formula φ,ψ,如果对于任何一个解释I都成立“I(φ)=true当且仅当I(ψ)=true”,就称φ,ψ是语义等价的。
根据元语言(命题逻辑),我们有:
- φ→ψ等价于¬φ∨ψ;
- φ↔ψ等价于(φ∧ψ)∨(¬φ∧¬ψ);
- ∀xφ等价于¬∃x¬φ;
由此可见,一阶逻辑中符号{¬,∨,∃}有功能完全性。在之后做formula的结构归纳时,我们只需对这三个符号做归纳。
The Coincidence Lemma
对于两个不同的interpretation I1,I2,什么时候它们对一个term t的解释是相同的?自然,如果I1和I2本身有相同的universe,对符号集的交集有相同的解释, 对t中的每个变量有相同的解释,那么就一定满足I1(t)=I2(t)。
什么时候两个不同的interpretation I1,I2对一个formula φ有相同的解释?是相同的?自然,如果I1和I2本身有相同的universe,对符号集的交集有相同的解释,对φ中的自由变量有相同解释,那么就一定满足I1(φ)=I2(φ)。
我们把以上两点总结成一条引理,称为The Coincidence Lemma:如果I1和I2有相同的universe A,在符号集的交集S1∩S2上对符号都有相同的解释,那么:
- 如果I1、I2在所有t的变量上有相同解释,就成立I1(t)=I2(t);
- 如果I1、I2在φ的所有自由变元上有相同解释,就成立I1(φ)=I2(φ)。
通过简单的结构归纳即可证明。
The Isomorphism Lemma
现在考虑φ是sentence,此时I1(φ)=I2(φ)只需要更弱的条件。首先,对于sentence我们只需退回到structure层面做讨论。其次,我们可以定义structure之间的同构关系(isomorphism),而不再要求universe和符号集的解释完全相同。两个同构的structure本质上是完全相同的,只是元素和符号的名称不同。定义如下:
对于两个S-structure A和B,如果它们对应的universe A,B存在一个A→B的双射π,并且对于S中的任何n元关系符号R成立(a1,⋯,an)∈RA ⟺(π(a1),⋯,π(an)) ∈RB,对于S中的任何n元函数符号f成立π(fA(a1,⋯,an)) =fB(π(a1),⋯,π(an)),对于S中的任何常数符号c成立π(cA)=cB,就称A,B是同构的,记为A≅B。容易证明isomorphism关系是一种等价关系,也即满足自反、对称、传递三条性质。
如果A≅B,那么对于任意S-sentence φ,成立A(φ)=true⟺B(φ)=true,这称为The Isomorphism Lemma。
这一引理可以通过对formula的结构归纳严格证明(注意,不能对sentence归纳,因为sentence是基于formula定义的对变量有特殊限制的formula,不存在对sentence的归纳定义)。
特别需要指出的一点是,The Isomorphism Lemma的逆命题是错误的。“A(φ)=true⟺B(φ)=true对任意S-sentence φ成立”不能推出A,B是同构的。然而这一点在符号集S是有限的时候是正确的,因为此时我们可以构造一个sentence,使得满足这个sentence的structure一定具有唯一的结构。然而当S是无限集的时候,就无法用同样的方法构造出这样的sentence了(因为sentence必须是有限长的)。严格的证明这里就不写出了。
The Substitution Lemma
在数学上,我们经常会用到代入(substitution)这一操作:代入操作是指对于某个term t或formula φ,将其中的某个变量x替换为某个term t′。
term的代入操作是简单的,应当就是在字符串意义上把所有x出现的地方简单地替换为t′。对于term t,把“同时把t中的x1代换为t1,⋯,xn代换为tn”这一操作记为[t]x1,⋯,xrt1,⋯,tr,定义:(这里的中括号和横线并不是一阶逻辑符号,只是一个“记号”,在不会引起歧义的场合可以省略)
-
xx1,⋯,xrt1,⋯,tr:={tix,x=xi,otherwise;
-
cx1,⋯,xrt1,⋯,tr:=c;
-
[ft1′⋯tn′]x1,⋯,xrt1,⋯,tr:=f[t1′]x1,⋯,xrt1,⋯,tr⋯[tn′]x1,⋯,xrt1,⋯,tr;
然而我们发现,formula中的代入操作并不应当只是在字符串意义上把所有x出现的地方替换为t。这是由量词引发的问题,考虑这样一个例子:∃z z+z≡x,在自然数运算的解释(N,β)下这个formula的语义是“β(x)是偶数”。所以我们期待如果我们把任何变量y“代入”x,它的语义都是“β(y)是偶数”。然而,如果我们把出现在量词中的z代入x,得到的是∃z z+z≡z,这个formula的语义显然不是“β(z)是偶数”而是“存在自然数与自己的和等于自身”,也即“0是自然数”。如果替换新的存在量词,∃u u+u≡z,语义就满足了。所以,我们在代入时应当对量词中的变量做一些特别的关照。对于formula φ,把“同时把φ中的x1代换为t1,⋯,xn代换为tn”这一操作记为[φ]x1,⋯,xrt1,⋯,tr,定义:(有了语义等价,我们可以减少一些归纳的情况了)
- [t1′≡t2′]x1,⋯,xrt1,⋯,tr:=[t1′]x1,⋯,xrt1,⋯,tr≡[t2′]x1,⋯,xrt1,⋯,tr;
- [Rt1′⋯tn′]x1,⋯,xrt1,⋯,tr:=R[t1′]x1,⋯,xrt1,⋯,tr⋯[tn′]x1,⋯,xrt1,⋯,tr;
- [¬φ]x1,⋯,xrt1,⋯,tr:=¬[φ]x1,⋯,xrt1,⋯,tr;
- [(φ∨ψ)]x1,⋯,xrt1,⋯,tr:=([φ]x1,⋯,xrt1,⋯,tr∨[ψ]x1,⋯,xrt1,⋯,tr);
- 对于[∃xφ]x1,⋯,xrt1,⋯,tr,取出x1,⋯,xr中那些属于free(∃xφ)且xi=ti的变量构成一个子列xi1,⋯,xis。如果x不在ti1,⋯,tis当中出现,那么[∃xφ]x1,⋯,xrt1,⋯,tr:=[∃xφ]xi1,⋯,xisti1,⋯,tis ;否则,[∃xφ]x1,⋯,xrt1,⋯,tr:=[∃uφ]xi1,⋯,xis,xti1,⋯,tis,u,其中u是不在ti1,⋯,tis,φ中出现的变量,且是v0,v1,⋯中下标最小的那个;
我们来理解我们对量词替换的修正。首先,对非自由变量的替换没有意义,把自己替换成自己也没有意义;其次,应当保证新的量词变量不在替换后的项中出现,如果不需要修改量词变量就不修改,否则就修改为从未出现过的一个变量,为了定义的确定性我们规定选择下标最小的那个。
以上替换规则是基于我们想让“替换后语义得以保持”的愿望定义的一系列字符串变换操作。简而言之它会把term中所有想要替换的变量替换成新的项,把formula中的想要替换的自由变量替换成新的项。我们需要验证,这样的变换确实“保持了语义”。而对语义的保持与否体现在用于解释这些term和formula的interpretation中赋值函数β是否发生了“合理的变化”。首先,我们推广赋值函数上“替换”的概念:定义βx1,⋯,xra1,⋯,ar(y):={β(y)ai,y=x1,⋯,y=xr,y=xi,Ix1,⋯,xra1,⋯,ar:=(A,βx1,⋯,xra1,⋯,ar)。对于任意interpretation I,我们想要验证以下两件事成立:
- 对于任意term t,始终成立I(tx1,⋯,xrt1,⋯,tr)= Ix1,⋯,xrI(t1),⋯,I(tr)(t);
- 对于任意formula φ,始终成立I(φx1,⋯,xrt1,⋯,tr)=Ix1,⋯,xrI(t1),⋯,I(tr)(φ);
再一次,我们可以用结构归纳说明以上两点确实成立。这称为The Substitution Lemma。这说明以上定义的“语法”上的替换方案确实达到了我们想在“语义”上达成的目的。
参考文献
[1] H.-D. Ebbinghaus, J.Flum, W. Thomas: Mathematical Logic