命题逻辑趣味拾遗
数理逻辑(mathematical logic)(又称符号逻辑),是用数学方法研究逻辑或形式逻辑的学科,属形式逻辑形式上符号化、数学化的逻辑,本质上仍属于知性逻辑的范畴。其研究对象是对证明和计算这两个直观概念进行符号化以后的形式系统。数理逻辑是基础数学的一个不可缺少的组成部分。虽然名称中有逻辑两字,但并不属于单纯逻辑学范畴。
在实际学习的时候,其中大部分知识很枯燥,让人感觉是废话,但是也有很多有点意思,甚至颠覆认知的知识。这里随手记录一些。
什么是命题?
《数理逻辑和集合论》紫皮教科书这么些:“命题(proposition)是一个非真即假的陈述句。首先是一个陈述句,不是疑问或感叹句;其次必须‘非真即假’,不能是无法判断的值。”
这句话已经说的很清楚了,不过再看看百度百科写的:“命题(判断)是指一个判断句的语义(实际表达的概念),这个概念是可以被定义并观察的现象。命题不是指判断句本身,而是指所表达的语义。”
如果只看第一个解释,可能会感觉奇怪:为什么必须是陈述句?“1+1真的等于2啊!”不算命题吗?而第二个句子给了我们答案。一个东西是否是命题只在于它有没有语义。那语义是什么?在通常逻辑里,语义只有真(true,简称T)和假(false,简称F)两种,称作真值(truth value)。不管什么句,可以取真或假的就是命题,不能取的就不是。
如果把命题和编程语言联系起来,一个命题就是一个bool类型的变量,其值只有真和假两种。假设\(P = 雪是白的\),\(Q = 北京是中国的首都\),那么P和Q都为真,他们是相等的,具体的推理内容我们不关心。
另外一个有趣的问题是,“这句话是假的”可以做命题吗?因为我们的命题要非真即假,也就是说P = P为假
必须能导出P的确定值(真或假),这显然是不可能的,所以在我们非真即假的二元逻辑里,这句话不是命题。在在数理逻辑中,我们就把命题当成一个bool变量,一个逻辑值,它的值只有真或假。
推理箭头的意义
“与或非”是没有人不知道的逻辑运算,推理符号也是随处可见,不过如果把推理符号→
单独做一个运算符的话,他的规则可能与你印象有一点不一样。
→
作为符号时被称为蕴含词(implication)(implication也许可翻译成推出),对真和真,假和假,假和真的运算结果为真,对真和假的运算结果为假,\(P→Q\)在值上等于\(¬P\vee Q\)(仅真→假为假)。
蕴含词的意义是如果P则Q
,结果的值即“如果P则Q
这句推理能否成立”。假设有一个数字\(x\),令\(P: x>3\),而\(Q:x^2>9\)。若\(P\)为真,则\(Q\)只能为真,不能为假;但是\(P\)为假时,无论\(x^2>9\)是否还成立,都不违背“如果P那么Q”的语义(因为已经没有如果了),所以我们规定真只能推真,假既可以推真也可以推假,“如果\(2>3\),那么雪是黑的”这样的命题被认为是正确的。
这时我们可以称“P是Q成立的充分条件”,相对的“Q是P成立的必要条件”。
我们还可以用↔表示双条件词(equivalence)(equivalence也许可翻译成等价)。这是一个二元联结词,对真和真,假和假的运算结果为真,对真和假,假和真的运算结果为假,等价于\((P\to Q)\wedge (Q\to P)\),即P可推Q且Q也可以推P。可以称“P和Q互为充要条件”。若双条件词为真,则P和Q必同真假,也相当于\(P=Q\)。
逻辑运算的结合律
交换律不必多说,显然与\(\wedge\)、或\(\vee\)、异或、双箭头满足,而\(\to\)不满足。
再来说一说分配律,与对或有分配律,或对与有分配律,这个很显然;→
对与和或也都有分配律。
那么结合律呢?显然与、或、异或是满足的,无论如何结合,\(\wedge\)总是要求每个命题为真(\(P\wedge Q\wedge R\wedge...\)每一项都为真)、\(\vee\)要求至少一项为真,异或要求奇数项为真。
而\((P\leftrightarrow Q)\leftrightarrow R\)和\(P\leftrightarrow (Q\leftrightarrow R)\)也是相等的。(注意这个式子不是说\(P,Q,R\)全相等!不然应该是\((P\leftrightarrow Q)\wedge(Q\leftrightarrow R)\))若\(Q\)为真,则两个式子括号内就等于另一项,所以变成了\(P\leftrightarrow R=P\leftrightarrow R\);若\(Q\)为假,则两个式子括号内就等于另一项取反,所以变成了\(\neg P\leftrightarrow R=P\leftrightarrow \neg R\),两个式子均正确,等式恒成立。
但是\((P\to Q)\to R\)和\(P\to(Q\to R)\)是不相等的(这个式子并不是指P能推Q再推R,不然应该是\((P\to Q)\wedge(Q\to R)\))!由于“假可以推一切”的特性,我们可以轻而易举的举出反例:令\(P,R\)为假,\(Q\)为真,两式的值是不相等的。
联结词的完备集
联结词的完备集告诉了我们联结词的本质。先把联结词视为“重载运算符”,把他当成取值\(\{0,1\}\)的函数。
那么一元函数只有四种:
\(x\) | \(f_0\) | \(f_1\) | \(f_2\) | \(f_3\) |
---|---|---|---|---|
0 | 0 | 0 | 1 | 1 |
1 | 0 | 1 | 0 | 1 |
其中\(f_0\)和\(f_3\)是常数,\(f_1\)是本身,唯一有意义的是\(f_2\)(即取反)。
二元函数有\(2^{2^2}=16\)种,太长了,放一张网图:
去掉常数变换,只有以下几种:
- \(F_3=P, F_5=Q, F_{10}=\neg Q, F_{12}=\neg P\)
- \(F_6(异或)、F_7(或)、F_1(与),F_{13}(蕴含),F_{11}(Q蕴含P),F_9(等价)\)
- \(F_2=\neg P\wedge Q,F_4=P\wedge \neg Q,F_8=\neg P\wedge \neg Q(与非,记作P\downarrow Q),F_{14}=\neg P\vee \neg Q(或非,记作P\uparrow Q)\)
我们发现,可用的联结词很多,但是16种关系全部可以被\(\{\neg,\vee,\wedge\}\)表示(更准确的说,只需要非加上与和或中的一种),我们把这样一组运算称作完备集。完备集显然不止一种,我们可以枚举证明\(\{\to,\neg\}、\{\uparrow\}、\{\downarrow\}\)都是完备集,但是“与或非”最易理解,也符合我们的直觉,因此我们通常使用这三个符号,有时也用\(\to\)和\(\leftrightarrow\)简化式子。
摩根律和广义摩根律
摩根律(DeMorgan's law)是广为人知的:
- \(\neg (P\vee Q)=\neg P \wedge \neg Q\)
- \(\neg (P\wedge Q)=\neg P \vee \neg Q\)
为了把它再推广,我们设任意一个只含与或非的公式为\(A\),首先将\(A\)中所有值取反(将\(P_1,P_2..\)变为\(\neg P_1,\neg P_2..\),常量true和false分别变为false和true),再将所有\(\wedge\)替换为\(\vee\),\(\vee\)替换为\(\wedge\),其取值就为\(\neg A\)。
容易发现这就提供了将任意长的式子取反的方法,而摩根律就是其简化的特殊情况。证明不难,任意式子总可以分为\(\neg (A)、(A)\vee (B)、(A)\wedge (B)\)三类,对其应用摩根律,然后递归证明\(A,B\)也满足即可。可以称之为广义摩根律。
函数和谓词
函数和谓词是谓词逻辑的基本原理。谓词(predicator)类似语言中的谓词,表示“是”或“否”。如果用\(P(x)\)代表“x是学生”,就可以用\(P(A)\wedge \neg P(B)\)表示“A是学生且B不是学生”。也可以是多元或者零元的,比如\(lt(x,y)\)表示“x是否小于y”,那么\(lt(3,5)\)为真。
函数与数学分析中的函数是类似的,表示对应关系的映射,用\(son(x)\)表示“x的儿子”,那么\(P(son(张三))\)表示“张三的儿子是学生”。
从形式上来看,谓词相当于“返回布尔值的函数”。在谓词逻辑里,\(x,y,z..\)本身不是命题,而是“3,李四,张三的儿子...”这样任何形式的对象;\(P(x)\)也不算命题,他们的是函数或者谓词,要给定输入才有输出;给定了对象输入的谓词可以产生一个真值,成为具体的命题(如\(P(张三)\));同时\((\forall x)P(x)\)和\((\exists x)P(x)\)也属于命题,他们表示“所有(或存在)x均满足P(x)为真”,这个式子存在一个确定的真值。
“有的实数是有理数”
这是一个谓词逻辑表达的应用。假设\(P(x)\)表示“x为有理数”,\(Q(x)\)表示“x为实数”。
有理数都是实数:\((\forall x)(P(x)\to Q(x))\),即任何对象x,如果它是有理数,那他同时也是实数。因为有理数是包含在实数里的,这个结论显而易见。
有的实数是有理数:\((\exists x)(P(x)\wedge Q(x))\),这里不再是推理号了,表示“存在对象x,x既是实数又是有理数”,与上面不一样。如果改成→,我们带入集合\(\{2+3i,\pi,张三\}\),此时上式当然为真,但是我们连“有的实数”都不能满足,这样是不符合我们的理解的,因此不用推理号。
量词的变换
量词遇到非就反过来,不必多说:\(\neg((\forall x)P(x))=(\exists x)\neg P(x),\ \neg((\exists x)P(x))=(\forall x)\neg P(x)\)
量词分配律1
这个也很显然,\((\forall x)(P(x)\vee C)=(\forall x)P(x)\vee C\),因为“任意”只针对P,与常量的命题C无关。把或换成与,任意换成存在都是成立的。
对于推理号则稍微不一样,把推理用非,或表示可以证明:
- \((\forall x)(P(x)\to C)=(\exists x)P(x)\to C\)
- \((\exists x)(P(x)\to C)=(\forall x)P(x)\to C\)
- \((\forall x)(C\to P(x))=C\to (\forall x)P(x)\)
- \((\forall x)(C\to P(x))=C\to (\exists x)P(x)\)
后两个很符合预期,但前两个有一点反直觉。
量词分配律2
-
\((\forall x)(P(x)\wedge Q(x))=(\forall x)P(x)\wedge (\forall x)Q(x)\)
-
\((\exists x)(P(x)\vee Q(x))=(\exists x)P(x)\vee (\exists x)Q(x)\)
第一个式子两边都表示“P和Q的所有取值全部是真”第二个式子两边都表示“P和Q的所有取值加起来有一个真就行”(注意右边的两个x是独立的!)。
再看下面两个式子:
-
\((\forall x)(P(x)\vee Q(x))\neq (\forall x)P(x)\vee (\forall x)Q(x)\)
-
\((\exists x)(P(x)\wedge Q(x))\neq(\exists x)P(x)\wedge (\exists x)Q(x)\)
假设x取值\(\{1,2,3\}\),我们画一张表:
x | P | Q |
---|---|---|
1 | \(b_{01}\) | \(b_{11}\) |
2 | \(b_{02}\) | \(b_{12}\) |
3 | \(b_{03}\) | \(b_{13}\) |
- 第三个式子左边的意思是“每一行至少一个数为真”,右边是“存在一列是全真的”,他们不等。
- 第四个式子左边是“存在一行是全真的”,右边表示“每一列至少一个数为真”,他们不等。
- 第一个式子两边都表示“6个数全真”,第二个式子表示“6个数至少真1个”,他们是成立的。
另一个现象是,量词不同顺序排列的意义是不同的,比如\((\forall x)(\exists y)(P(x,y))\)和\((\exists y)(\forall x)(P(x,y))\))显然不同(同样用上面画表的方式可轻而易举看出来)。