| 选课类别:计划内与自由选修 | 教学类型:理论课 |
| 课程类别:本科计划内课程 | 开课单位:计算机科学与技术系 |
| 课程层次:专业基础 | 学分:2.0 |
数理逻辑是计算机科学技术的重要数学基础之一,本课程是计算机科学技术专业本科教学的数理逻辑基础课程,主要介绍数理逻辑的基本理论和形式化技术,为后继课程奠定必要基础。主要内容包括:命题逻辑的(标准)形式公理系统(命题语言和形式推导)、语义学和元理论(命题演算的可靠性和完全性);一阶逻辑的(标准)形式公理系统(一阶语言和形式推导)、语义学和元理论(一阶谓词演算的可靠性和完全性)。
侯嘉慧老师的《数理逻辑基础》考试被多位学生描述为“恶心”且“麻烦”。不只是概念题,还有繁琐的推理题和直接证明题,前者需要严密的逻辑推理,而后者由于其复杂性令学生感到为难。特别是直接证明题,是学生普遍认为最难的部分,而与之相关的题目往往需要更多时间。然而,有学生提出通过“运用演绎定理的思路再转写消除其痕迹”的方式来规范直接证明,提高解题效率。
课程主要涵盖命题逻辑与一阶逻辑的基本知识,其中涉及较深奥的概念,对于数学基础较弱的同学可能较为困难。不少学生表示自学效果好于课堂听讲,因为课程中的很多概念和证明非常抽象,使得不易理解且难以消化。此外,一些学生提到教材的习题有助于掌握课程内容,而老师的课上教学对于一些学生来说收效甚微。然而,作为科大独特的必修课程,其教学深度仍受到一些学生的赞赏。
学生对给分情况的意见分歧较大。部分学生认为给分合理,尤其是对没有积极参与课堂和作业的学生也能给出不错的成绩,显示出老师对整体分数的助益作用。另一方面,有同学指出给分不佳,认为与自己的付出不成正比。
由于《数理逻辑基础》考试较难且偏重理解和应用,考前不宜突击,建议学生在学期初就开始扎实学习。多位同学强调多刷题、熟悉题型和提高解题能力的重要性,尤其在考试条件下的思维和答题能力显得尤为关键。另建议打印老师的PPT及提前熟悉其中示例,以备不时之需。
总体来说,《数理逻辑基础》是科大一门复杂但值得挑战的必修课程。虽然学生反馈对课程教学的直接效果褒贬不一,最关键的知识点和技巧需要依靠自学和多做题目来掌握。考虑到只有两学分,学生们普遍认为通过合理的学习策略和复习安排,即便课程难度较大,仍可以获得一个合理的成绩。
放一个将 “使用演绎定理的证明” 转写为直接证明的算法:
假定我们现在已经有了 Γ∪{p} |- q 的证明序列 (q_1,q_2,…,q_n=q) , 想要写出一个 Γ |- {p→q} 的证明序列. 我们知道直接证明的定义虽然是链式的, 但它实际上有着如同二叉树的结构: 从最后的结论往前回溯, 每一个公式要么是由它之前的两个公式 MP 得到, 要么是一个公理/条件. 所以我们可以把证明序列 {q_n} 写成 (非完全) 二叉树的形式. 以下是一个示例:

显然, 在没有条件 p 时, q_i 不一定都为真, 但 p→q 是一定为真的, 所以我们把这个二叉树中的所有 q_i 改为 p→q_i . 现在只剩下两个问题: 1. 每一个叶子上的 p→q_i 如何得到; 2. 已知 q_i 与 q_j 通过 MP 得到 q_k , 如何用 p→q_i 和 p→q_j 得到 p→q_k.
我们首先回答第二个问题: 由于 q_{i,j,k} 是一个满足 MP 所需形式的三元组, q_j 一定形如 q_i→q_k (或者相反, 但这里 q_i 和 q_j 地位是相同的, 无需另外讨论) . 我们可以先用 q_i→q_k 结合公理模式 L1 通过 MP 得到 p→(q_i→q_k) , 再用公理模式 L2 写出 (p→(q_i→q_k))→((p→q_i)→(p→q_k)) , 连续 MP 两次得到 p→q_k (下文中将这整个过程称为 “衍生 MP” ) .
对问题一的回答是容易的: 对于每一个在原证明中处于叶子的 q_i , 如果 q_i 本身是公理或者属于 Γ, 依然可以直接写出; 如果 q_i 本身就是条件 p , 则可以背诵一套经典的内定理 p→p 的证明.
最后, 注意到对条件 p 的引入采用 “一滴血原则” , 即对于某个中间公式 q_i , 只有当它或者它的引理证明中用到 p 时才转写成 p→q_i ; 如果 q_i 在没有条件 p 时也成立, 那么直接照搬原证明中对它的证明序列即可. 但是, 如果发现它紧跟着的下家需要转写, 也需要再用 L1 把它变成 p→q_i 以便后文证明. (例如下图的 q_6 对 q_7 的作用.)
由此我们得到新证明的二叉树 (注意在这个二叉树中, 每一次推导使用的是衍生 MP 而非 MP, 所以写出来的公式数量会多很多) :

下面我们展示一个具体的例子 ∅ |- ((p→q)→r)→(q→r). 在这个例子中我们使用了两次演绎定理, 那么往回转写两次即可.
连续演绎定理拉回两次, 我们改为证 {(p→q)→r,q} |- r . 这个题的直接证明是容易的:
① q 条件
② q→(p→q) 公理L1
③ p→q ①②MP
④ (p→q)→r 条件
⑤ r ③④MP

现在进行第一层转写, 即试图写出 {(p→q)→r} |- q→r 的直接证明.
我们回顾证明序列的每一个公式, 在前面添加上 “q→…” 试图重现整个证明. 注意到 ③ 做如此改写后形如 q→(p→q) , 本身就是一个公理, 没有必要再从改写后的 ①② 推出. 所以我们先写出 ③' : q→(p→q) 随时备用.

再看④, 由于 (p→q)→r 本身是条件, ④' q→((p→q)→r) 可以联合 L1 做一次 MP 轻松得到. 我们把这个过程列出来:
① (p→q)→r 条件
② ((p→q)→r)→(q→((p→q)→r)) 公理L1
③ q→((p→q)→r) ①②MP
再拿出我们准备好的 ③' :
④ q→(p→q) 公理L1
现在, 上述 ③ 和 ④ 已经具备 L2 所需的形式, 可以开始衍生 MP :
⑤ (q→((p→q)→r))→((q→(p→q))→(q→r)) 公理L2
⑥ (q→(p→q))→(q→r) ③⑤MP
⑦ q→r ④⑥MP
现在开始第二层转写, 即直接证明原给命题. 我们分析上述序列的二叉树结构: ①②MP③, ③⑤MP⑥, ④⑥MP⑦. 这里用到条件的本质上只有①, 并且注意到 ①→③ 实际上形如公理 (就是②) , 所以没必要再去转写 ①→① 和 ①→② , 直接先准备好 ①→③, 然后列出⑤⑦, 用一次 L1 做出 ①→⑤ 和 ①→⑦ , 连续 “衍生 MP" 两次即可.

总结一下: 这里我们给出了一个在直接证明题目中 “先使用演绎定理寻找思路, 再转写消除演绎定理痕迹” 的工具.
需要注意两点:
1. 我们偷渡出来的工具只有演绎定理一条, 不包括反证律, 二次否定等, 用这些二级结论找到的思路需要寻求别的方法合法化;
2. 尽管这种算法可以直接证明任何命题, 但我们没有必要机械地照搬算法的每一步, 而是可以随时注意转写出来的哪一步本身就形如公理, 从而不必再转写其上层; 也没有必要一上来就用算法库库抄, 可以先自己想想思路, 划归到一个形式简单, 但证不出来的引理后, 再用算法来处理这个引理, 或许会更节省时间.
最后建议考前看到这条的同学, 如果想要在考试时使用这种方法, 最好还是自己找几个公式来练一下手. 读过了算法及其证明并不代表理解乃至熟练了整个算法思想, 如果没有手操经验, 考场上可能会在某一步不知道自己此刻要干什么耽误时间.
没什么用的课,学完就忘完了,但是这个老师没点名,没小测(可能上课做一点不交的小测),期末给分还行,如果置课这个老师也没必要换,都是考前速通的,比图论还没有学的欲望,随便对付对付就行。