3 一阶逻辑:模型论
3.2 一阶语言
哥德尔编码
- Q: 如何用一个自然数,编码自然数的有序对?
A: 可以使用\(2^a 3^b\),也可以在二维平面上从原点开始以“蛇形”给每个自然数为坐标的点编号。
注:前者会导致许多自然数没有对应的有序对,不是一一对应。但叙述起来较简单。
如果既要一一对应又要叙述简单,可以考虑\(2^x(2y+1)-1\) - Q: 解释形式上的表达式\(\aleph_0+\aleph_0^2+\cdots=\aleph_0\).
A: 提示:把每一“项”和\(\aleph_0\)做一一对应,整体就相当于\(\aleph_0^2=\aleph_0\)了。 - Q: 尝试用0.和1.解释哥德尔编码。
A: 提示:
\(f^n_k\)相当于有序对。(形式上可以用\(\aleph_0^2=\aleph_0\)表达)
如何用一个自然数编码\(a_1,\cdots,a_n,\cdots\)和\(b_1,\cdots, b_n,\cdots\)共两组元素?可以简单地分成奇偶,奇数用于表示\(a_i\),偶数用于表示\(b_i\)。(这形式上可以用\(2\aleph_0=\aleph_0\)表达)
哥德尔编码可以形式上用\((2\aleph _0^2+2\aleph_0 +6)^1 + (2\aleph _0^2+2\aleph_0 +6)^2+\cdots=\aleph_0\)表达。
辖域和替换
- Q: 尝试解释\(\forall x (A(x)\wedge \forall x B(x)\wedge \forall y C(y) \wedge \forall y D(y))\)中的变元名。
A: 提示:对于上面的\(x\)可以类比程序设计中内层变量遮蔽(Shadow)外层同名变量。
当然,正如程序设计中一样,这种遮蔽有时会造成困扰。往往并不是最规范的写法。比如积分\(\int_0^1x\int_0^1xdx\cdot dx\)也造成了相同的困扰。
然而问题中的\(y\)相对来说,就比较合理,比如\(\int_0^1xdx+\int_0^2xdx\)或者
for i in range(10):
print(i)
for i in range(15):
print(i+1)
都和问题中的\(y\)类似,是比较合理的写法。
- Q: 约束出现就是不自由出现吗?
A: 详细地说,我们一般用“不自由出现”表示每次出现都不自由。“约束出现”表示至少一次出现约束(不自由)。
当然这只是人为约定。自己注意术语含义即可。 - Q: 项替换的归纳定义中,归纳起点是什么?
A: 命题变元。(具体地,对于\(s(x_i/t)\),其中\(s\)就是某个命题变元\(x_j\),此处的项替换把命题变元\(x_i\)变为\(t\),把\(x_j,j\neq i\)不变) - Q: 针对“项对公式中的变元是自由的”,我们是想用什么替换什么中的什么?
A: 想用项替换公式中的变元。更详细地,是替换自由变元。你不可能把\(\forall x\)里的\(x\)给替换掉。
我们马上得到:若\(\mathscr A\)不含\(x_i\)的自由出现,那么任何项对\(\mathscr A\)中\(x_i\)都是自由的。 - Q: 举一个(自然语言的)实际例子说明“项对公式中的变元不自由”时强行做公式的项替换引起混乱。
A: 例如:存在一个国家甲,乙国人和丙国人的混血是甲国国王。乙和丙都是自由出现的(自由变元)。这个句子不能判定真假。只有将乙和丙指定了才能判定真假。
如果强行变成存在一个国家甲,乙国人和甲国人的混血是甲国国王,那么语义发生了根本变化。此时再把乙指定了,就可以判定真假。
相比之下,一个正常的替换可以形如:存在一个国家甲,使得联合国排序中排行第丁的国家人和丙国人的混血是甲国国王。可以认为,这样的语义没有发生某种所谓的“根本变化”。注意此时仍然是指定丁和丙才能确定命题真假。
当然我们还可以举出更有趣的例子:比如存在乙,乙舔到过甲的眼睛。如果把甲直接换成乙…… - Q: \(x_i\)出现在\(\forall x_i\)的辖域中时是()的变元。联系项对公式中变元自由的定义(替换后项中的任意变元都不出现在对应量词\(\forall\)的辖域中),上述事实说明了项\(x_i\)(或项\(f(x_i),g(x_i,x_i)\)……等等)对任何公式\(\mathscr A\)中的变元()一定是自由的。
A: 约束,\(x_i\). - Q: 公式中项替换的归纳定义中,归纳起点是什么?这和项替换的归纳定义有什么区别和联系?
A: 原子\(A_j^n(s_1,\cdots, s_n)\). 定义公式中项替换的归纳起点需要先定义项替换,明确\(s_k(x_i/t)\)的含义。
变元是项的“起点”,原子是公式的“起点”。项是原子的组成部分,从这个角度讲项比公式基本。先有项替换再有公式中项替换。 - Q: 题3.和4.和公式中项替换归纳定义中关于\(\forall x_j\)的部分有何联系?
A: 如果要替换的变元就是\(x_j\),那么\(x_j\)没有自由出现过,无需做替换。
如果要替换的变元是\(x_i,i\ne j\),已知\(x_i\)在\(\mathscr A\)(就是\(\forall x_j \mathscr B\))中自由出现过,从而在\(\mathscr B\)中自由出现过,那么根据\(t\)在\(\mathscr A\)中关于\(x_i\)自由,则用\(t\)替换\(\mathscr A\)中\(x_i\)的处处自由出现(也是\(\mathscr B\)中\(x_i\)的处处自由出现)不产生混乱。这样一来定义\(\mathscr A(x_i/t)=\forall x_j \mathscr B(x_i/t)\)是合理的。
换名替换
- Q: 换名替换之后,被换的变元名一定不存在了吗?
A: 不一定。注意\(\mathscr A(x_i/x_j)\)中可能仍然有\(x_i\)(没有换掉那些约束变元\(x_i\))。 - Q: 变元换名是为了方便在什么情况下做公式中项替换?
A: 提示:项\(t\)对公式\(\mathscr A\)中变元\(x_i\)不自由(比如说\(t\)中出现了\(x_j\),而\(\mathscr A\)中存在\(\forall x_j A(x_i)\)结构)时,我们把\(\forall x_j \mathscr B\)中所有\(x_j\)换一个名字,比如变成\(\forall x_k\mathscr B(x_j/x_k)\). 通过一系列这种操作可以使得项\(t\)对公式\(\mathscr A\)中变元\(x_i\)的替换变得安全。 - Q: 对\(\forall x_i \mathscr A\)中变元\(x_i\)换名成\(x_j\)的条件:\(x_j\)不在\(\mathscr A\)中自由出现,且\(x_j\)在\(\mathscr A\)中对\(x_i\)自由。为什么缺一不可?
A: 如果\(x_j\)在\(\mathscr A\)中自由出现,则把\(\forall x_i\)替换成\(\forall x_j\)后,\(x_j\)是约束变元,这不是我们希望的语义变化。如果\(x_j\)在\(\mathscr A\)中对\(x_i\)不自由,那么\(\mathscr A(x_i/x_j)\)部分就出现了我们不期望的语义变化,就更不必说\(\forall x_i \mathscr A\)整体了。总之,一个是防止\(\forall \cdots\)处换名导致混乱,一个是防止\(\mathscr A\)处换名导致混乱!
注:原来的两个不同命题变元变成了相同(名称)的命题变元未必就会造成不良后果。例如\(\forall y(A(y)\to\forall wB(x,z))\),把\(y\)换成\(w\)是可以的。注意这时\(w\)没有在\(A(y)\to\forall wB(x,z)\)中自由出现,且\(w\)在\(A(y)\to\forall wB(x,z)\)中对\(y\)自由。
注:两个条件显然互不蕴涵。
注:\(x_j\)在\(\mathscr A\)中对\(x_i\)自由的一个充分条件是\(x_j\)不在\(\mathscr A\)中约束出现。因此这两条条件的一个充分条件是\(x_j\)不在\(\mathscr A\)中出现。也就是换名直接换一个全新的变元名。 - Q: 把2.中两条条件中\(\mathscr A\)改成\(\forall x_i \mathscr A\)这个整体,如何?
A: 提示:\(x_j\)对\(\forall x_i \mathscr A\)中的\(x_i\)自由,这是平凡的。你不能因为前述事实就认为\(\mathscr A(x_i/x_j)\)合理,只能认为\((\forall x_i\mathscr A)(x_i/x_j)\)合理(啥也没换) - Q: 如果\(\mathscr B\)就是\(\forall x_i \mathscr A\),那么\(\mathscr B(x_i/x_j)\)就是\(\forall x_j\mathscr A(x_i/x_j)\)嘛?
A: 回忆公式中项替换的定义,\(\mathscr B(x_i/x_j)\)中\(x_i\)并未自由出现,因此替换结果就是\(\mathscr B\).
\(\forall x_j\mathscr A(x_i/x_j)\)应当是换名替换的结果,而不是公式中项替换\(\mathscr B(x_i/x_j)\)结果。 - Q: 接0.,既然被换的变元名仍然可能存在,我们如何论证换名替换是可逆的?
A:
- 首先:把\(\forall x_i \mathscr A\)换名替换成\(\forall x_j\mathscr A(x_i/x_j)\),则留下的那些\(x_i\)一定是在\(\mathscr A\)中约束出现的。
- 其次:由于初始时,\(x_j\)不在\(\mathscr A\)中自由出现,因此\(\mathscr A(x_i/x_j)\)中的那些\(x_j\)要不然原本在\(\mathscr A\)中就约束出现,要不然就是\(\mathscr A\)中自由的\(x_i\)换成的(即:这些\(x_i\)在\(\mathscr A\)中,外层没有\(\forall x_i\). 当然\(\mathscr A\)之外确实原本有一个\(\forall x_i\))。
为了验证\(x_i\)在\(\mathscr A(x_i/x_j)\)中对\(x_j\)自由,我们关注到第一种\(x_j\)无需在\(\mathscr A(x_i/x_j)(x_j/x_i)\)中换成\(x_i\),而第二种\(x_j\)由于外层没有\(\forall x_i\)也就自然不会在换成\(x_i\)时造成麻烦。