想象你是一名电工,接了一个老宅的电路改造活儿。墙上的开关只有“开”和“关”两种状态,灯只有“亮”和“灭”两种结果。你把两个开关串联起来,发现必须两个都合上灯才亮;改成并联,任意合上一个灯就亮。后来你还发现,有一种双控开关,让楼上楼下都能控制同一盏灯——灯亮不亮,完全取决于开关状态的组合规则。 命题逻辑,就是把这套电灯电路抽象成符号与规则的科学:它研究“哪些陈述句能判定真假”(命题)、“如何用联结词组装复杂判断”、“怎样用真值表穷举所有情况”,以及“如何从已知判断可靠地推出新判断”。这门学问看起来像在玩开关游戏,却是计算机一切推理能力的电路图——程序验证、芯片设计、AI 推理,底层都在用这套“灯亮灯灭”的规则。本文会带你把整个电路图拆开看一遍,从此不再被“如果……那么……”之类的逻辑词绕晕。

岗位关联

对 AI 从业者而言,命题逻辑是形式化思维的第一块基石。掌握它,你才有资格踏入程序验证、知识推理、自动定理证明与 SAT 求解的大门,它是整个计算机科学大厦的钢筋骨架。

目录
  1. 可视化演示
  2. 命题与联结词——电路里的开关
  3. 真值表技术——电工的试灯手册
  4. 等值演算体系——电路等价改造法则
  5. 推理形式规则——从已知灯态推断未知
  6. 自然演绎方法——像装配电路那样写证明
  7. 归结原理应用——反证法引擎
  8. 应用验证实践——把电路图接进真实世界
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

命题逻辑研究命题间的逻辑关系,是数理逻辑的基础。本文详解命题与逻辑联结词、真值表构造、等值演算与基本等价式、推... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

递归的数学基:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

命题与联结词——电路里的开关

想象检修电路时的第一步:你得先搞清楚哪些是开关、哪些是导线。命题逻辑的第一步同样如此。所谓命题,就是“能判断真假”的陈述句——“这盏灯亮了”是命题,因为它非真即假;“把灯打开!”就不是命题,因为命令无所谓真假;“x 大于 5”也不是命题,除非先说明 x 是几。命题,就是电路图里的一只开关:只有“断开(假,记 0)”和“闭合(真,记 1)”两种状态。

把开关接在一起,就有了复合命题。逻辑联结词就是接线方式:否定 \(\lnot\) 像反装开关,把闭合变断开;合取 \(\land\) 像串联,两个都闭合才导通;析取 \(\lor\) 像并联,任意一个闭合就导通;蕴含 \(\to\) 像双控开关,约定“灯不亮就算整条线路工作正常”——这正是初学者最容易困惑的地方。到底什么时候 \(P \to Q\) 为假?规则很简单:只有当前件真、后件假时才为假,其余情况都为真。这个“蕴含”的怪脾气,正是形式逻辑与日常因果直觉的分歧点。

电灯电路中,你可以用反装开关和并联方式搭出“如果 P 那么 Q”的效果;命题逻辑里的蕴含等值式,就是这张电路改造图纸的符号化表达。

P→Q ≡ ¬P∨Q\displaystyle P \to Q \ \equiv\ \lnot P \lor Q
蕴含(→)完全等价于“非前件或后件”。这告诉你:判断“如果 P 那么 Q”是真,只需检查 P 为假(此时无条件为真)或 Q 为真两种情况。
  1. 变元 P代表一个命题,取值只能是真(1)或假(0),就像开关只能开或关。
    PP
  2. 符号 →蕴含联结词,读作“如果……那么……”,它描述“前件成立时后件必须成立”的承诺。
    P→QP \to Q
  3. 符号 ¬否定联结词,把真假翻转,就像把开关反装。
    ¬P\lnot P
  4. 符号 ∨析取联结词,只要两边有一个为真就为真,就像并联的两只开关。
    ¬P∨Q\lnot P \lor Q
  5. 符号 ≡逻辑等值,表示两个公式在任何开关组合下灯亮灭完全一致。
    ¬P∨Q ≡ P→Q\lnot P \lor Q \ \equiv\ P \to Q

真值表技术——电工的试灯手册

电工排障时最笨也最可靠的方法,是把所有开关组合逐一试一遍,看灯亮不亮。真值表就是这个思路的形式化:把所有可能赋值一行行列出来,逐层计算复合命题的真假。构造真值表只需三步:第一步列出所有命题变元;第二步枚举全部 \(2^n\) 种赋值组合;第三步依运算优先级从内到外逐层算出各子公式的值。

行数为什么是 \(2^n\)?因为每个变元有 2 种取值,n 个变元就构成 \(2^n\) 种排列组合——就像 n 只开关全部试一遍,共有 \(2^n\) 种开合状态。三个变元就是 8 行,四个变元就是 16 行。写表时还要遵守运算优先级:先算否定,再合取、析取,最后算蕴含和等值。你可以在纸上给每层子公式留一列,像电路里逐级测量电压一样,每列的值都依赖前一列的结果。

把真值表看作电工试灯手册:它不聪明,但绝对可靠。任何一个复合命题,无论多复杂,用真值表穷举总能算出它在每种情况下的灯态——这是逻辑世界里最朴素的“暴力验证法”。

2n\displaystyle 2^n
这是真值表行数的计算公式:n 代表命题变元个数。每多一个变元,表就翻一倍——这正是穷举法随规模爆炸的根源,也是后来要引入归结原理的动机之一。
  1. 底数 2每个命题变元恰好有 2 种取值——真(1)或假(0),没有第三种状态,就像开关没有“半开”。
    22
  2. 指数 n命题变元的总个数。一个命题里出现几个字母,指数就是几。
    nn
  3. 乘方 2^n全部取值组合数。开关 1 有 2 态,开关 2 再乘 2 态,n 只开关就相乘 n 次。
    2×2×⋯×2=2n2 \times 2 \times \cdots \times 2 = 2^n

等值演算体系——电路等价改造法则

电工常常要把线路改得更省材料,但不能改变灯的亮灭规律:输入端怎么拨开关,输出必须和原来一模一样。逻辑里的等值演算就是这个“换线不换灯”的工程。两个命题公式等值(记 ≡),意味着它们在任何赋值下真值都相同,也就是真值表完全一样。这时你可以放心地用一边替换另一边,就像用直连导线替换一组冗余开关。

基本等价式是一批“已验证的电路图纸”。双重否定律说 \(\lnot\lnot P\) 等于 P(反装两次等于没反装);德摩根律说否定一个“与”,等于把各项否定后再“或”——用电路的话讲:想证明“串联不导通”,等价于证明“至少有一只开关是断开的”。代换规则保证:只要整体等值,局部替换后整体仍等值,这使演算可以像代数化简一样逐步推进。验证等值有两种方法:列真值表对比,或用已知等价式做演算推导。

德摩根律就像电工工具箱里的万能剥线钳:遇到“整体取反”的复杂线路,先拆括号,再把 \(\land\) 与 \(\lor\) 互换、给每个部分都翻个面。记住这条规律,化简否定表达式时就不会手忙脚乱。

¬(P∧Q) ≡ ¬P∨¬Q\displaystyle \lnot(P \land Q) \ \equiv\ \lnot P \lor \lnot Q
这是德摩根律的一条:对合取式整体取否定,等价于分别否定各项再做析取。它是“拆括号、翻符号”的万能钥匙,在程序断言取反时天天用到。
  1. 括号内的合取 P ∧ QP 和 Q 同时为真才为真,像串联电路,两只开关都必须闭合。
    P∧QP \land Q
  2. 外层否定 ¬对整个串联电路取反,表示“灯灭”这件事。
    ¬(P∧Q)\lnot(P \land Q)
  3. 右边合取变析取取反后,串联变成并联——“灯灭”等于“至少一只开关断开”。
    ¬P∨¬Q\lnot P \lor \lnot Q
  4. 等值 ≡两边真值表逐行一致,四个输入组合的输出完全相同。
    ¬(P∧Q) ≡ ¬P∨¬Q\lnot(P \land Q) \ \equiv\ \lnot P \lor \lnot Q

推理形式规则——从已知灯态推断未知

现在你不是在接线,而是在推理:已知某些灯亮(前提为真),能不能确定另一盏灯必亮?推理规则回答这个问题。一个推理是有效的(记 \(\Rightarrow\)),指只要所有前提为真,结论必然为真——它不是碰巧为真,而是“逻辑上逃不掉”地为真,就像串联电路里灯亮着,你立刻知道两只开关都闭合了。

最常用的规则是假言推理(Modus Ponens):已知“如果 P 那么 Q”为真,又已知 P 为真,那么 Q 为真。对照生活场景:前提为“按下按钮,电梯就会来”和“我按下了按钮”,结论必然是“电梯会来”。它的孪生规则是拒取式:已知“如果 P 那么 Q”且 Q 为假,则可推出 P 为假——电梯没来,说明按钮没有被按下。还有假言三段论、析取三段论等,它们像电工手里的标准接头:每种线接头都有固定接法,每种推理规则也有固定形式,照着接就保证通电。

这条规则相当于电工的“导通判断”:若整条串联线导通(P→Q 为真),且第一个开关闭合(P 为真),那么电流必然流过第二个开关(Q 为真)。推理规则不是发明,而是对“必然性”的观察总结。

(P→Q)∧P ⇒ Q\displaystyle (P \to Q) \land P \ \Rightarrow\ Q
假言推理的核心模式:有了“蕴含前提”和“前件”,就引爆出“后件”。这是所有逻辑推理中最常用的一条规则,程序里的 if 语句分支逻辑就是它的直接体现。
  1. 前提一 P → Q一条蕴含承诺,“若 P 成立则 Q 必然成立”,如“按下按钮则电梯来”。
    P→QP \to Q
  2. 前提二 P前件被确认为真,说明出发条件已经满足。
    PP
  3. 合取 ∧把两条前提并在一起,表示它们同时成立。
    (P→Q)∧P(P \to Q) \land P
  4. 推出符号 ⇒表示逻辑蕴含关系——前提为真时,结论 Q 不存在为假的可能。
    ⇒Q\Rightarrow Q

自然演绎方法——像装配电路那样写证明

有了规则,怎么组织一场完整证明?自然演绎法提供了一套装配流程:把前提摆在桌上,按规则一步步接出中间结论,最终拼出目标结论。直接证明法最直白——从前提出发,沿推理规则直推结论,每一步都像拧一颗螺丝。但有些目标绕路更省事,于是有了条件证明法:要证 \(P \to Q\),先假设 P 为真,在这个临时假设下推出 Q,然后“释放假设”,得到 \(P \to Q\)。这就像电工想验证某个支路的作用:先临时接上一段线,证明它能导通灯亮,再把它固化成正式线路。

反证法则更反向:想证 \(P\) 为真,就先假设 \(\lnot P\),若这个假设会推导出矛盾(某个公式与其否定同时为真),就说明假设不可能成立,于是 P 必真。矛盾在这里就像电路短路——一旦出现“又亮又灭”的状态,整个假设就宣告作废。证明策略的选择有经验法则:结论是蕴含式优先用条件证明;待证命题的否定能快速引出矛盾,就用反证法;否则按直接证明逐步推进。

自然演绎像一套接线规范:直接证明是主线铺设,条件证明是临时借线,反证法是短路检测。不同策略服务于同一个目标——让每一步都有规则依据,让整条电路最终点亮结论的灯。

(P∧R)→S ⊢ P→(R→S)\displaystyle (P \land R) \to S \ \vdash\ P \to (R \to S)
这是条件证明(演绎定理)的一个实例:把合取前提拆成两个嵌套的蕴含前提。它说明了“假设—释放”机制如何重组逻辑结构,对应程序里层层嵌套的函数参数。
  1. 条件中的合取 P ∧ R两个子条件同时成立,像两只必须都闭合的开关。
    P∧RP \land R
  2. 整体蕴含 (P ∧ R) → S合取成立时 S 必成立。
    (P∧R)→S(P \land R) \to S
  3. 换位后的蕴含 P → (R → S)把合取拆成嵌套蕴含,等价于“先假设 P,再假设 R,最后得 S”。
    P→(R→S)P \to (R \to S)
  4. 判定符号 ⊢表示可以从左边前提通过自然演绎推出右边结论,是“可证明性”的记号。
    (P∧R)→S ⊢ P→(R→S)(P \land R) \to S \ \vdash\ P \to (R \to S)

归结原理应用——反证法引擎

当推理规模变大,人肉装配证明会力不从心。归结原理把证明变成机械步骤,为自动推理而生。它的原料是合取范式:把公式化成一系列“子句”的合取,每个子句是若干文字的析取。转换手法很机械:先用蕴含等值式消去 \(\to\) 和 \(\leftrightarrow\),再用德摩根律把否定内移,最后用分配律把公式展开成合取范式。就像电工把五颜六色的线全部整理成统一规格的线束。

归结规则只有一条:两个子句若能找到互补文字 \(P\) 与 \(\lnot P\),就消去它们,归并剩余文字成新子句。这像两条导线在接头处相遇,\(P\) 和 \(\lnot P\) 两股线相消,剩下的线继续延伸。而归结反驳更巧妙:要证结论 \(Q\),先把 \(\lnot Q\) 加入前提,分子句化,然后不断归结,直到推出空子句。空子句代表矛盾,相当于电路中出现短路——电流既通又不通,证明原来的 \(\lnot Q\) 假设不成立,所以 Q 成立。这个机制直接通向命题可满足性:一个公式集不可满足,当且仅当通过反复归结能推出空子句。

归结原理就是一台反证法引擎:把一切推理问题转化为“找矛盾”的机械操作。它放弃了人脑的聪明策略,换取机器的暴力可靠——这正是今天 SAT 求解器能自动验证芯片和程序的理论根基。

(P∨Q)∧(¬P∨R) ⇒ Q∨R\displaystyle (P \lor Q) \land (\lnot P \lor R) \ \Rightarrow\ Q \lor R
这是归结规则的基本形式:两个子句共享一对互补文字 P 与 ¬P,二者相消后合并剩余部分。它是 SAT 求解器和自动定理证明器的核心步进动作。
  1. 子句一 P ∨ Q第一个子句,P 与 Q 的析取,像并联的两根支路。
    P∨QP \lor Q
  2. 子句二 ¬P ∨ R第二个子句,含有前一个子句中 P 的否定形式,形成互补对。
    ¬P∨R\lnot P \lor R
  3. 互补文字 P 与 ¬P一个断言为真、一个断言为假,二者不可能同时成立——这正是可消去的依据。
    P, ¬PP,\ \lnot P
  4. 归结结果 Q ∨ R消去互补对后,剩余文字并成一个新子句。
    Q∨RQ \lor R

应用验证实践——把电路图接进真实世界

至此你可以把整套工具搬出电灯实验室,接到真实工程里。第一站是数字电路设计:芯片里的加法器、选择器本质上就是命题逻辑表达式,等值演算用来化简门电路、节省晶体管。第二站是程序验证:程序员写下断言“x 非负”,验证工具把断言转成命题公式,再用可满足性检查找反例——若找到一组赋值令断言取假,就说明程序有 bug;找不到,才算通过。第三站是知识库推理:专家系统把“温度过高会报警”这类事实存成命题和规则,推理引擎用假言推理、归结规则从事实推出新事实,这就是早期 AI 的“思考”方式。

这些应用共同依赖一个核心概念——命题可满足性(SAT):问是否存在一组赋值使公式为真。对于电路,它问“有没有让灯亮的开关组合”;对于程序,它问“有没有让断言失败的执行状态”;对于知识库,它问“有没有让所有事实同时成立的解释”。今天的 SAT 求解器每年能处理百万变量级的实例,而它们的最底层,仍是归结原理在自动寻找空子句。

从电路设计到程序验证,从知识库到 AI 推理,命题逻辑的七个分支像七类电工工具,在各自的工位上协同工作。而你,已经读懂了这套符号电路图——下一步,就是把它接进你自己的项目里。

∃ σ: vσ(φ)=1\displaystyle \exists\, \sigma: \ v_\sigma(\varphi) = 1
可满足性的形式定义:存在一个赋值 σ,使公式 φ 在该赋值下取值为真。它是 SAT 问题的核心,也是程序验证、规划求解所依赖的判定标准。
  1. 存在量词 ∃表示“至少有一个”,即存在某种开关组合能让灯亮。
    ∃\exists
  2. 赋值 σ给每个命题变元分派真或假的具体方案,像一组确定的开关状态。
    σ\sigma
  3. 求值 v_σ(φ)在赋值 σ 下计算公式 φ 的真值,像按这组开关状态看灯亮不亮。
    vσ(φ)v_\sigma(\varphi)
  4. 等号 = 1结果为真(1 表示灯亮),整个表达式宣告“这组开关组合可行”。
    vσ(φ)=1v_\sigma(\varphi) = 1

AI 应用场景

场景一:软件断言验证(SAVerify 工具链)

阶段:形式化验证与模型检查

解决的问题:传统测试用固定样例找 bug,永远无法穷尽所有输入路径。AI 驱动的验证工具把程序断言转换成命题逻辑公式,用 SAT 求解器搜索反例,能在毫秒级指出“哪条路径会让断言失败”,相当于用归结原理自动扫描整个电路板上的每一段线路。

具体案例:某支付团队提交了一段余额扣减代码,断言“扣减后余额 ≥ 0”。验证工具建出命题公式并调用 SAT 求解,发现当“扣减金额类型疑似负数”且“边界校验被短路跳过”时,断言可被违反——立刻定位出逻辑漏洞,补上缺失的校验分支。

场景二:数字电路逻辑化简(EDA 工具)

阶段:逻辑综合与优化

解决的问题:芯片设计中,原始布尔表达式往往冗余。EDA 工具用等值演算与布尔化简规则,把 \( \lnot A \land B \lor A \land B \) 等价化简为 \(B\),减少门电路数量。每一处化简都保证功能不变,像用更省的线路替换旧线路。

具体案例:某 FPGA 项目有 8 个输入的逻辑表达式,综合工具先建真值表确认功能,再用等价式反复化简,最终减少 37% 的逻辑单元,芯片面积和功耗同步下降,而真值表逐行比对确认输出完全一致。

场景三:知识库自动推理(专家系统)

阶段:知识表示与推理引擎

解决的问题:传统 if-else 规则库难以理清成千上万条规则之间的依赖。把每条规则写成蕴含式 \(P \to Q\),推理引擎用假言推理与归结规则自动连锁推导,还能检测规则库是否自相矛盾,让知识库像电路一样可检查、可证明。

具体案例:某医疗诊断知识库录入 3000 条规则后,运维人员用归结反驳检查一致性,发现两条规则“头晕 ⇒ 建议休息”与“头晕 ∧ 高热 ⇒ 禁止停诊”在特定组合下产生矛盾,及时修正了规则冲突。

Python 演示

python53 行
# 命题逻辑真值表生成器与等值验证器import itertools def eval_formula(expr, env):    # 表达式为递归结构,如 ('IMP', 'p', 'q')    if isinstance(expr, tuple):        op = expr[0]        if op == 'NOT':            return not eval_formula(expr[1], env)        if op == 'AND':            return eval_formula(expr[1], env) and eval_formula(expr[2], env)        if op == 'OR':            return eval_formula(expr[1], env) or eval_formula(expr[2], env)        if op == 'IMP':            return (not eval_formula(expr[1], env)) or eval_formula(expr[2], env)    else:        return env[expr] def truth_table(vars_, expr):    table = []    for values in itertools.product([False, True], repeat=len(vars_)):        env = dict(zip(vars_, values))        table.append((values, eval_formula(expr, env)))    return table def are_equivalent(expr1, expr2, vars_):    for values in itertools.product([False, True], repeat=len(vars_)):        env = dict(zip(vars_, values))        if eval_formula(expr1, env) != eval_formula(expr2, env):            return False    return True def print_table(vars_, expr):    print(" ".join(vars_) + " => 结果")    for values, res in truth_table(vars_, expr):        row = " ".join("1" if v else "0" for v in values)        print(row + " => " + ("1" if res else "0")) def main():    vars_ = ["p", "q"]    expr1 = ('IMP', 'p', 'q')                      # p -> q    expr2 = ('OR', ('NOT', 'p'), 'q')              # ¬p ∨ q    print("真值表 for p -> q:")    print_table(vars_, expr1)    print("\n等值检查 p -> q 与 ¬p ∨ q:")    print("两者等值:", are_equivalent(expr1, expr2, vars_))    expr3 = ('AND', 'p', ('NOT', 'p'))    print("\n矛盾式检查 p ∧ ¬p:")    rows = truth_table(vars_, expr3)    print("是否恒为假(不可满足):", all(not r for _, r in rows)) if __name__ == "__main__":    main()
目的:用 Python 枚举真值表、验证蕴含等值式 \(P \to Q \equiv \lnot P \lor Q\),并检测矛盾式“不可满足”。
  1. eval_formula(expr, env)递归求值:把公式当树遍历,'AND' 即串联“与”运算;'IMP' 实现蕴含语义,正好验证第一节的等值式。
  2. itertools.product([False, True], repeat=len(vars_))穷举所有 \(2^n\) 种赋值组合,这正是真值表行数公式的代码化身。
  3. are_equivalent(expr1, expr2, vars_)逐行对比两个公式的输出,全等即等值,等价于“两个电路在任何开关组合下灯亮灭一致”。
  4. all(not r for _, r in rows)检查是否每一行结果都为假,即公式不可满足,对应归结原理要推导出空子句的情形。

常见误区

误区我以为 \(P \to Q\) 的意思是“P 导致了 Q”,所以 P 为假时整个式子就没意义了,应该是“未定义”或者“假”。

正解形式逻辑的蕴含只看真假,不看因果。除“前件真、后件假”外,其余情况蕴含均为真。用电路比喻:一个双控开关承诺“按下 P 则灯 Q 亮”,如果 P 从来没人按下(P 为假),这个承诺并没有被违背,线路依然算正常。它不是因果关系,而是一条“排除例外”的约定。

为何常见:日常语言里“如果……那么……”通常暗示时间先后与因果联系,初学者把生活语义带进形式系统,尤其被“假前提蕴含一切”的推论(P 假时 \(P \to Q\) 恒真)震惊。

误区\(\lnot(P \land Q)\) 我总觉得应该等于 \(\lnot P \land \lnot Q\),把括号拆开、每个字母加个“非”就完事了。

正解这是德摩根律用反了。正确的拆法是 \(\lnot(P \land Q) \equiv \lnot P \lor \lnot Q\)——不仅要给每个字母取反,还要把中间的 \(\land\) 翻成 \(\lor\)。用电工话说:说“串联电路不导通”,等价于“至少有一只开关断开”,而不是“两只开关都断开”。后者太强了,不是原话的意思。

为何常见:代数直觉里“把负号分配进去”很自然,但逻辑联结词不是普通乘法,\(\land\) 与 \(\lor\) 是“对偶”的,取反时必须互换。

误区我背真值表时把顺序记成 00、01、10、11,觉得这是唯一正确的写法,换一种顺序就判错。

正解真值表的行序没有任何规定。只要穷尽所有 \(2^n\) 种赋值组合,逐行计算结果,几行先后无所谓——就像电工试开关,先试哪个组合都行,只要别漏试。考试中出现的真值表行序可以各不相同,关键看“输入组合是否齐全、计算结果是否准确”。

为何常见:教材通常按二进制递增排列“00,01,10,11“,看起来像某种标准,学生当作规则背诵,忽略了真值表的本质是”穷举 + 求值”,而非某种固定格式。

误区命题逻辑里的 \(\lor\) 就是日常说的“或者”,就是“要么 A 要么 B,不能两个都选”。

正解\(\lor\) 是“兼或”(可兼析取),只要两边至少一个为真就为真,两个都为真也照样为真;日常的“二选一”是“异或”(排他析取 \(\oplus\))。用电工话说:并联的两只开关,两个都闭合时灯当然亮,这就是 \(\lor\)。只有当你特意规定“两个都闭合反而灯灭”,才是异或。

为何常见:自然语言“或者”常隐含二选一(“你要咖啡还是茶?”),逻辑的析取词却取最宽松的解释,这种日常语义与形式语义的落差最易让人栽跟头。

误区我觉得一个公式“可满足”就是永远为真,所以 SAT 求解器找到一组解就说明公式永远成立。

正解可满足只要求“存在至少一组赋值使公式为真”,等于说电路里有一种开关组合能让灯亮;永真(重言式)则要求所有赋值都为真,即任何组合灯都亮。SAT 求解器找到一个模型只说明“有可能亮”,要证明“必然亮”还得检查全部行或做推理证明。

为何常见:日常“能满足要求”听起来像“任何时候都满足”,但逻辑术语的“可满足”是存在性概念,与全称性的“永真”是强弱不同的两回事。

面试题

Q1. 下列哪句话是命题?

单选题 · easy

  • A.请把门关上!
  • B.明天会下雨← 正确答案
  • C.x + 3 是多少?
  • D.这句话好长啊

答案:B。命题是能判断真假的陈述句。“明天会下雨”在明天到来前虽不确定,但它具备真假二值性,是命题。祈使句、疑问句都没有真假,选项 A、C 排除;评价性感叹句“这句话好长啊”的真假取决于比较标准,不是严格命题。

Q2. 命题逻辑中联结词 ∧ 表示什么?

单选题 · easy

  • A.或——至少一个为真即可
  • B.非——真假翻转
  • C.且——两个都为真才为真← 正确答案
  • D.蕴含——前件真则后件真

答案:C。∧ 是合取联结词,读作“且”,要求左右两个命题同时为真才为真,就像两个开关串联。选项 A 描述的是 ∨(析取),选项 B 是 ¬(否定),选项 D 是 →(蕴含)。真值表里 \(P \land Q\) 只在 11 组合下输出 1。

Q3. 三个命题变元的真值表共有多少行?

单选题 · easy

  • A.3 行
  • B.6 行
  • C.8 行← 正确答案
  • D.9 行

答案:C。每个变元有真/假 2 种取值,n 个变元的组合数为 \(2^n\)。n=3 时,\(2^3 = 8\) 行,对应 000 到 111 共 8 种开关组合。选项 A、B、D 都没正确计算指数式增长——每多一个变元,行数翻倍。

Q4. 蕴含式 \(P \to Q\) 在什么情况下为假?

单选题 · mid

  • A.P 为真且 Q 为真
  • B.P 为真且 Q 为假← 正确答案
  • C.P 为假且 Q 为真
  • D.P 为假且 Q 为假

答案:B。蕴含的唯一“违约”情形是前件真而后件假——承诺“如果 P 那么 Q”,结果 P 成立了 Q 却没成立,承诺被打破。其余三种情况(前件假、后件真)承诺都没有被违背,蕴含都为真。这正像双控开关:只要没出现“按下按钮灯却不亮”,线路都算正常。

Q5. 下列哪个公式与 \(\lnot(P \lor Q)\) 等值?

单选题 · mid

  • A.\(\lnot P \lor \lnot Q\)
  • B.\(\lnot P \land \lnot Q\)← 正确答案
  • C.\(P \land Q\)
  • D.\(\lnot P \to Q\)

答案:B。这是德摩根律的另一条:对析取取否定,等价于各部分否定后的合取,即 \(\lnot(P \lor Q) \equiv \lnot P \land \lnot Q\)。电路直觉:说“并联线路不导通”等于说“两只开关都断开”。选项 A 是德摩根律的错误误用,把 \(\lor\) 没翻成 \(\land\)。

Q6. 假言推理(Modus Ponens)的正确形式是?

单选题 · mid

  • A.由 \(P \to Q\) 和 \(Q\) 推出 \(P\)
  • B.由 \(P \to Q\) 和 \(P\) 推出 \(Q\)← 正确答案
  • C.由 \(P \to Q\) 和 \(\lnot P\) 推出 \(\lnot Q\)
  • D.由 \(P \land Q\) 推出 \(P \to Q\)

答案:B。假言推理是“肯定前件”:已知蕴含 \(P \to Q\) 和前件 \(P\) 为真,就能推出后件 \(Q\)。选项 A 是“肯定后件”,是无效推理;选项 C 是“否定前件”,同样无效;选项 D 不是推理规则。这就像已知“按下按钮电梯就来”且确实按下了按钮,必然推出电梯会来。

Q7. 归结原理主要用于证明什么?

单选题 · mid

  • A.公式是重言式
  • B.公式集可满足
  • C.公式集不可满足(推出空子句)← 正确答案
  • D.公式的行数最少

答案:C。归结反驳的核心是反证法:把结论的否定加入前提,将所有公式转成子句,反复归结,若推出空子句则说明公式集不可满足,原结论成立。空子句就是电路里的“短路矛盾”。可满足性本身需要找模型,不靠归结孤立判定,选项 B 不准确。

Q8. 下列关于等值演算的说法,正确的有?

多选题 · mid

  • A.\(P \to Q \equiv \lnot P \lor Q\)← 正确答案
  • B.\(\lnot\lnot P \equiv P\)← 正确答案
  • C.\(P \land Q \equiv Q \land P\)← 正确答案
  • D.\(P \lor (Q \land R) \equiv (P \lor Q) \land R\)

答案:ABC。A 是蕴含等值式,正确;B 是双重否定律,正确;C 是合取的交换律,正确;D 是分配律的错误版本,正确分配应是 \(P \lor (Q \land R) \equiv (P \lor Q) \land (P \lor R)\),故 D 错误。这就像电路改造:有些改法省线省料且灯态不变,有些则会改变整个亮灭规律。

Q9. 关于真值表技术,下列说法正确的是?

多选题 · hard

  • A.n 个命题变元的真值表有 \(2^n\) 行← 正确答案
  • B.计算复合命题时应先处理最内层括号← 正确答案
  • C.真值表的行顺序可以任意排列← 正确答案
  • D.真值表只能用于单个命题变元

答案:ABC。A 是行数公式,正确;B 符合逐层计算的构造规则,正确;C 正确,穷举完整即可,顺序自由;D 错误,真值表适用于任意多个变元的复合命题。真值表如同电工试灯手册——只要把所有开关组合试全,记录灯态,顺序不重要,覆盖必须完整。

Q10. 关于命题可满足性(SAT)与归结原理的关系,正确的是?

多选题 · extreme

  • A.公式集不可满足当且仅当归结可推出空子句← 正确答案
  • B.SAT 求解器常用于程序验证中的反例查找← 正确答案
  • C.归结原理可以直接找到一个模型
  • D.归结反驳把待证结论的否定加入前提← 正确答案

答案:ABD。A 是归结完备性定理的核心结论,正确;B 正确,验证工具用 SAT 搜索让断言为假的赋值;D 正确,归结反驳正是引入结论否定并推空子句。C 错误——归结原理擅长证明“不可满足”,找到模型通常由 SAT 求解器的搜索算法完成,归结本身不直接输出模型。所谓“推出空子句”,就像电路中同时出现亮与灭的矛盾,宣告假设失败。