想象你是一名电工,接了一个老宅的电路改造活儿。墙上的开关只有“开”和“关”两种状态,灯只有“亮”和“灭”两种结果。你把两个开关串联起来,发现必须两个都合上灯才亮;改成并联,任意合上一个灯就亮。后来你还发现,有一种双控开关,让楼上楼下都能控制同一盏灯——灯亮不亮,完全取决于开关状态的组合规则。 命题逻辑,就是把这套电灯电路抽象成符号与规则的科学:它研究“哪些陈述句能判定真假”(命题)、“如何用联结词组装复杂判断”、“怎样用真值表穷举所有情况”,以及“如何从已知判断可靠地推出新判断”。这门学问看起来像在玩开关游戏,却是计算机一切推理能力的电路图——程序验证、芯片设计、AI 推理,底层都在用这套“灯亮灯灭”的规则。本文会带你把整个电路图拆开看一遍,从此不再被“如果……那么……”之类的逻辑词绕晕。
对 AI 从业者而言,命题逻辑是形式化思维的第一块基石。掌握它,你才有资格踏入程序验证、知识推理、自动定理证明与 SAT 求解的大门,它是整个计算机科学大厦的钢筋骨架。
目录
可视化演示
命题逻辑研究命题间的逻辑关系,是数理逻辑的基础。本文详解命题与逻辑联结词、真值表构造、等值演算与基本等价式、推... 切换模式查看不同维度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
递归的数学基:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现
命题与联结词——电路里的开关
想象检修电路时的第一步:你得先搞清楚哪些是开关、哪些是导线。命题逻辑的第一步同样如此。所谓命题,就是“能判断真假”的陈述句——“这盏灯亮了”是命题,因为它非真即假;“把灯打开!”就不是命题,因为命令无所谓真假;“x 大于 5”也不是命题,除非先说明 x 是几。命题,就是电路图里的一只开关:只有“断开(假,记 0)”和“闭合(真,记 1)”两种状态。
把开关接在一起,就有了复合命题。逻辑联结词就是接线方式:否定 \(\lnot\) 像反装开关,把闭合变断开;合取 \(\land\) 像串联,两个都闭合才导通;析取 \(\lor\) 像并联,任意一个闭合就导通;蕴含 \(\to\) 像双控开关,约定“灯不亮就算整条线路工作正常”——这正是初学者最容易困惑的地方。到底什么时候 \(P \to Q\) 为假?规则很简单:只有当前件真、后件假时才为假,其余情况都为真。这个“蕴含”的怪脾气,正是形式逻辑与日常因果直觉的分歧点。
电灯电路中,你可以用反装开关和并联方式搭出“如果 P 那么 Q”的效果;命题逻辑里的蕴含等值式,就是这张电路改造图纸的符号化表达。
- 变元 P代表一个命题,取值只能是真(1)或假(0),就像开关只能开或关。
- 符号 →蕴含联结词,读作“如果……那么……”,它描述“前件成立时后件必须成立”的承诺。
- 符号 ¬否定联结词,把真假翻转,就像把开关反装。
- 符号 ∨析取联结词,只要两边有一个为真就为真,就像并联的两只开关。
- 符号 ≡逻辑等值,表示两个公式在任何开关组合下灯亮灭完全一致。
真值表技术——电工的试灯手册
电工排障时最笨也最可靠的方法,是把所有开关组合逐一试一遍,看灯亮不亮。真值表就是这个思路的形式化:把所有可能赋值一行行列出来,逐层计算复合命题的真假。构造真值表只需三步:第一步列出所有命题变元;第二步枚举全部 \(2^n\) 种赋值组合;第三步依运算优先级从内到外逐层算出各子公式的值。
行数为什么是 \(2^n\)?因为每个变元有 2 种取值,n 个变元就构成 \(2^n\) 种排列组合——就像 n 只开关全部试一遍,共有 \(2^n\) 种开合状态。三个变元就是 8 行,四个变元就是 16 行。写表时还要遵守运算优先级:先算否定,再合取、析取,最后算蕴含和等值。你可以在纸上给每层子公式留一列,像电路里逐级测量电压一样,每列的值都依赖前一列的结果。
把真值表看作电工试灯手册:它不聪明,但绝对可靠。任何一个复合命题,无论多复杂,用真值表穷举总能算出它在每种情况下的灯态——这是逻辑世界里最朴素的“暴力验证法”。
- 底数 2每个命题变元恰好有 2 种取值——真(1)或假(0),没有第三种状态,就像开关没有“半开”。
- 指数 n命题变元的总个数。一个命题里出现几个字母,指数就是几。
- 乘方 2^n全部取值组合数。开关 1 有 2 态,开关 2 再乘 2 态,n 只开关就相乘 n 次。
等值演算体系——电路等价改造法则
电工常常要把线路改得更省材料,但不能改变灯的亮灭规律:输入端怎么拨开关,输出必须和原来一模一样。逻辑里的等值演算就是这个“换线不换灯”的工程。两个命题公式等值(记 ≡),意味着它们在任何赋值下真值都相同,也就是真值表完全一样。这时你可以放心地用一边替换另一边,就像用直连导线替换一组冗余开关。
基本等价式是一批“已验证的电路图纸”。双重否定律说 \(\lnot\lnot P\) 等于 P(反装两次等于没反装);德摩根律说否定一个“与”,等于把各项否定后再“或”——用电路的话讲:想证明“串联不导通”,等价于证明“至少有一只开关是断开的”。代换规则保证:只要整体等值,局部替换后整体仍等值,这使演算可以像代数化简一样逐步推进。验证等值有两种方法:列真值表对比,或用已知等价式做演算推导。
德摩根律就像电工工具箱里的万能剥线钳:遇到“整体取反”的复杂线路,先拆括号,再把 \(\land\) 与 \(\lor\) 互换、给每个部分都翻个面。记住这条规律,化简否定表达式时就不会手忙脚乱。
- 括号内的合取 P ∧ QP 和 Q 同时为真才为真,像串联电路,两只开关都必须闭合。
- 外层否定 ¬对整个串联电路取反,表示“灯灭”这件事。
- 右边合取变析取取反后,串联变成并联——“灯灭”等于“至少一只开关断开”。
- 等值 ≡两边真值表逐行一致,四个输入组合的输出完全相同。
推理形式规则——从已知灯态推断未知
现在你不是在接线,而是在推理:已知某些灯亮(前提为真),能不能确定另一盏灯必亮?推理规则回答这个问题。一个推理是有效的(记 \(\Rightarrow\)),指只要所有前提为真,结论必然为真——它不是碰巧为真,而是“逻辑上逃不掉”地为真,就像串联电路里灯亮着,你立刻知道两只开关都闭合了。
最常用的规则是假言推理(Modus Ponens):已知“如果 P 那么 Q”为真,又已知 P 为真,那么 Q 为真。对照生活场景:前提为“按下按钮,电梯就会来”和“我按下了按钮”,结论必然是“电梯会来”。它的孪生规则是拒取式:已知“如果 P 那么 Q”且 Q 为假,则可推出 P 为假——电梯没来,说明按钮没有被按下。还有假言三段论、析取三段论等,它们像电工手里的标准接头:每种线接头都有固定接法,每种推理规则也有固定形式,照着接就保证通电。
这条规则相当于电工的“导通判断”:若整条串联线导通(P→Q 为真),且第一个开关闭合(P 为真),那么电流必然流过第二个开关(Q 为真)。推理规则不是发明,而是对“必然性”的观察总结。
- 前提一 P → Q一条蕴含承诺,“若 P 成立则 Q 必然成立”,如“按下按钮则电梯来”。
- 前提二 P前件被确认为真,说明出发条件已经满足。
- 合取 ∧把两条前提并在一起,表示它们同时成立。
- 推出符号 ⇒表示逻辑蕴含关系——前提为真时,结论 Q 不存在为假的可能。
自然演绎方法——像装配电路那样写证明
有了规则,怎么组织一场完整证明?自然演绎法提供了一套装配流程:把前提摆在桌上,按规则一步步接出中间结论,最终拼出目标结论。直接证明法最直白——从前提出发,沿推理规则直推结论,每一步都像拧一颗螺丝。但有些目标绕路更省事,于是有了条件证明法:要证 \(P \to Q\),先假设 P 为真,在这个临时假设下推出 Q,然后“释放假设”,得到 \(P \to Q\)。这就像电工想验证某个支路的作用:先临时接上一段线,证明它能导通灯亮,再把它固化成正式线路。
反证法则更反向:想证 \(P\) 为真,就先假设 \(\lnot P\),若这个假设会推导出矛盾(某个公式与其否定同时为真),就说明假设不可能成立,于是 P 必真。矛盾在这里就像电路短路——一旦出现“又亮又灭”的状态,整个假设就宣告作废。证明策略的选择有经验法则:结论是蕴含式优先用条件证明;待证命题的否定能快速引出矛盾,就用反证法;否则按直接证明逐步推进。
自然演绎像一套接线规范:直接证明是主线铺设,条件证明是临时借线,反证法是短路检测。不同策略服务于同一个目标——让每一步都有规则依据,让整条电路最终点亮结论的灯。
- 条件中的合取 P ∧ R两个子条件同时成立,像两只必须都闭合的开关。
- 整体蕴含 (P ∧ R) → S合取成立时 S 必成立。
- 换位后的蕴含 P → (R → S)把合取拆成嵌套蕴含,等价于“先假设 P,再假设 R,最后得 S”。
- 判定符号 ⊢表示可以从左边前提通过自然演绎推出右边结论,是“可证明性”的记号。
归结原理应用——反证法引擎
当推理规模变大,人肉装配证明会力不从心。归结原理把证明变成机械步骤,为自动推理而生。它的原料是合取范式:把公式化成一系列“子句”的合取,每个子句是若干文字的析取。转换手法很机械:先用蕴含等值式消去 \(\to\) 和 \(\leftrightarrow\),再用德摩根律把否定内移,最后用分配律把公式展开成合取范式。就像电工把五颜六色的线全部整理成统一规格的线束。
归结规则只有一条:两个子句若能找到互补文字 \(P\) 与 \(\lnot P\),就消去它们,归并剩余文字成新子句。这像两条导线在接头处相遇,\(P\) 和 \(\lnot P\) 两股线相消,剩下的线继续延伸。而归结反驳更巧妙:要证结论 \(Q\),先把 \(\lnot Q\) 加入前提,分子句化,然后不断归结,直到推出空子句。空子句代表矛盾,相当于电路中出现短路——电流既通又不通,证明原来的 \(\lnot Q\) 假设不成立,所以 Q 成立。这个机制直接通向命题可满足性:一个公式集不可满足,当且仅当通过反复归结能推出空子句。
归结原理就是一台反证法引擎:把一切推理问题转化为“找矛盾”的机械操作。它放弃了人脑的聪明策略,换取机器的暴力可靠——这正是今天 SAT 求解器能自动验证芯片和程序的理论根基。
- 子句一 P ∨ Q第一个子句,P 与 Q 的析取,像并联的两根支路。
- 子句二 ¬P ∨ R第二个子句,含有前一个子句中 P 的否定形式,形成互补对。
- 互补文字 P 与 ¬P一个断言为真、一个断言为假,二者不可能同时成立——这正是可消去的依据。
- 归结结果 Q ∨ R消去互补对后,剩余文字并成一个新子句。
应用验证实践——把电路图接进真实世界
至此你可以把整套工具搬出电灯实验室,接到真实工程里。第一站是数字电路设计:芯片里的加法器、选择器本质上就是命题逻辑表达式,等值演算用来化简门电路、节省晶体管。第二站是程序验证:程序员写下断言“x 非负”,验证工具把断言转成命题公式,再用可满足性检查找反例——若找到一组赋值令断言取假,就说明程序有 bug;找不到,才算通过。第三站是知识库推理:专家系统把“温度过高会报警”这类事实存成命题和规则,推理引擎用假言推理、归结规则从事实推出新事实,这就是早期 AI 的“思考”方式。
这些应用共同依赖一个核心概念——命题可满足性(SAT):问是否存在一组赋值使公式为真。对于电路,它问“有没有让灯亮的开关组合”;对于程序,它问“有没有让断言失败的执行状态”;对于知识库,它问“有没有让所有事实同时成立的解释”。今天的 SAT 求解器每年能处理百万变量级的实例,而它们的最底层,仍是归结原理在自动寻找空子句。
从电路设计到程序验证,从知识库到 AI 推理,命题逻辑的七个分支像七类电工工具,在各自的工位上协同工作。而你,已经读懂了这套符号电路图——下一步,就是把它接进你自己的项目里。
- 存在量词 ∃表示“至少有一个”,即存在某种开关组合能让灯亮。
- 赋值 σ给每个命题变元分派真或假的具体方案,像一组确定的开关状态。
- 求值 v_σ(φ)在赋值 σ 下计算公式 φ 的真值,像按这组开关状态看灯亮不亮。
- 等号 = 1结果为真(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 演示
# 命题逻辑真值表生成器与等值验证器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()
eval_formula(expr, env)递归求值:把公式当树遍历,'AND' 即串联“与”运算;'IMP' 实现蕴含语义,正好验证第一节的等值式。itertools.product([False, True], repeat=len(vars_))穷举所有 \(2^n\) 种赋值组合,这正是真值表行数公式的代码化身。are_equivalent(expr1, expr2, vars_)逐行对比两个公式的输出,全等即等值,等价于“两个电路在任何开关组合下灯亮灭一致”。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. 下列哪句话是命题?
- A.请把门关上!
- B.明天会下雨← 正确答案
- C.x + 3 是多少?
- D.这句话好长啊
答案:B。命题是能判断真假的陈述句。“明天会下雨”在明天到来前虽不确定,但它具备真假二值性,是命题。祈使句、疑问句都没有真假,选项 A、C 排除;评价性感叹句“这句话好长啊”的真假取决于比较标准,不是严格命题。
Q2. 命题逻辑中联结词 ∧ 表示什么?
- A.或——至少一个为真即可
- B.非——真假翻转
- C.且——两个都为真才为真← 正确答案
- D.蕴含——前件真则后件真
答案:C。∧ 是合取联结词,读作“且”,要求左右两个命题同时为真才为真,就像两个开关串联。选项 A 描述的是 ∨(析取),选项 B 是 ¬(否定),选项 D 是 →(蕴含)。真值表里 \(P \land Q\) 只在 11 组合下输出 1。
Q3. 三个命题变元的真值表共有多少行?
- 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\) 在什么情况下为假?
- A.P 为真且 Q 为真
- B.P 为真且 Q 为假← 正确答案
- C.P 为假且 Q 为真
- D.P 为假且 Q 为假
答案:B。蕴含的唯一“违约”情形是前件真而后件假——承诺“如果 P 那么 Q”,结果 P 成立了 Q 却没成立,承诺被打破。其余三种情况(前件假、后件真)承诺都没有被违背,蕴含都为真。这正像双控开关:只要没出现“按下按钮灯却不亮”,线路都算正常。
Q5. 下列哪个公式与 \(\lnot(P \lor Q)\) 等值?
- 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)的正确形式是?
- 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. 归结原理主要用于证明什么?
- A.公式是重言式
- B.公式集可满足
- C.公式集不可满足(推出空子句)← 正确答案
- D.公式的行数最少
答案:C。归结反驳的核心是反证法:把结论的否定加入前提,将所有公式转成子句,反复归结,若推出空子句则说明公式集不可满足,原结论成立。空子句就是电路里的“短路矛盾”。可满足性本身需要找模型,不靠归结孤立判定,选项 B 不准确。
Q8. 下列关于等值演算的说法,正确的有?
- 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. 关于真值表技术,下列说法正确的是?
- A.n 个命题变元的真值表有 \(2^n\) 行← 正确答案
- B.计算复合命题时应先处理最内层括号← 正确答案
- C.真值表的行顺序可以任意排列← 正确答案
- D.真值表只能用于单个命题变元
答案:ABC。A 是行数公式,正确;B 符合逐层计算的构造规则,正确;C 正确,穷举完整即可,顺序自由;D 错误,真值表适用于任意多个变元的复合命题。真值表如同电工试灯手册——只要把所有开关组合试全,记录灯态,顺序不重要,覆盖必须完整。
Q10. 关于命题可满足性(SAT)与归结原理的关系,正确的是?
- A.公式集不可满足当且仅当归结可推出空子句← 正确答案
- B.SAT 求解器常用于程序验证中的反例查找← 正确答案
- C.归结原理可以直接找到一个模型
- D.归结反驳把待证结论的否定加入前提← 正确答案
答案:ABD。A 是归结完备性定理的核心结论,正确;B 正确,验证工具用 SAT 搜索让断言为假的赋值;D 正确,归结反驳正是引入结论否定并推空子句。C 错误——归结原理擅长证明“不可满足”,找到模型通常由 SAT 求解器的搜索算法完成,归结本身不直接输出模型。所谓“推出空子句”,就像电路中同时出现亮与灭的矛盾,宣告假设失败。