第2章 逻辑:真与假的二元世界
按权威原书目录重建第2章 逻辑:真与假的二元世界,覆盖命题、真值表、逻辑与或非、蕴含、德摩根定律。
先做预测
先不要计算。预测当输入规模、随机机制、基底或数值精度变化时,结论是否仍成立;再写出你依赖的假设。逻辑用于消除自然语言歧义。命题只有在给定语境中才能判断真或假;非、与、或、蕴含把复杂条件拆成可枚举的真值组合。程序中的分支、断言、查询条件和规格说明都依赖这种二元推理。 本章用、、、、建立可检查的语言。
原书章节定位
本页对应权威目录中的“第2章 逻辑:真与假的二元世界”,不是把多本数学书的相近主题拼成一章。原书在这里要解决的中心问题是:逻辑用于消除自然语言歧义。命题只有在给定语境中才能判断真或假;非、与、或、蕴含把复杂条件拆成可枚举的真值组合。程序中的分支、断言、查询条件和规格说明都依赖这种二元推理。 阅读时先辨认对象和关系,再看符号如何压缩这些关系,最后检查程序是否保持同一语义。
核心单元索引
- 命题:能够明确判定真假的陈述;开放问题和含糊形容词在补充条件前不是合格命题。
- 真值表:枚举原子命题的全部组合,以机械方式验证复合表达式是否等价。
- 逻辑与或非:与要求条件同时成立,或要求至少一个成立,非负责翻转真值。
- 蕴含:只有前件真而后件假时为假;它描述承诺,不等同于因果关系。
- 德摩根定律:整体否定会交换与、或并逐项取反,是改写守卫条件的重要工具。
这些单元构成一条依赖链。命题负责能够明确判定真假的陈述;开放问题和含糊形容词在补充条件前不是合格命题。 真值表负责枚举原子命题的全部组合,以机械方式验证复合表达式是否等价。 逻辑与或非负责与要求条件同时成立,或要求至少一个成立,非负责翻转真值。 蕴含负责只有前件真而后件假时为假;它描述承诺,不等同于因果关系。 德摩根定律负责整体否定会交换与、或并逐项取反,是改写守卫条件的重要工具。 如果跳过定义直接套公式,计算可能正确,却无法判断结论何时失效。
从问题开始
先把“会计算”改写成五个可反驳的问题:命题处理的对象是什么,真值表保留了哪些信息,逻辑与或非执行后哪些量应保持不变,蕴含依赖哪些前提,德摩根定律用什么观测验收?回答时必须给出对象集合、输入域、单位或概率机制。若这些信息缺失,同一个符号可能在相邻步骤中悄悄换义,后面的精确计算也无法挽救模型。
能够明确判定真假的陈述;开放问题和含糊形容词在补充条件前不是合格命题。 因而第一张检查表记录定义和非例;枚举原子命题的全部组合,以机械方式验证复合表达式是否等价。 第二张检查表记录表示变化;与要求条件同时成立,或要求至少一个成立,非负责翻转真值。 第三张检查表记录推导所保持的不变量。只有前件真而后件假时为假;它描述承诺,不等同于因果关系。 负责指出退化边界,整体否定会交换与、或并逐项取反,是改写守卫条件的重要工具。 则把数学结论翻译成可观察证据。五张表共同回答“为什么这一步可以做”,而不只回答“怎么算”。
这里的映射符号不是说所有章节都线性,而是要求明确输入集合X、输出集合Y和模型M。离散章节的M可以是逻辑规则或递归,概率章节可以是分布或条件化,线性代数章节则常由矩阵实现。模型改变时,旧结论必须重新验收。
反例推演
从正常样例开始:选择一个能同时出现命题和真值表的最小输入,手算中间状态;随后把规模减到零或一,检查定义是否仍有意义;再制造蕴含的退化情形,观察结果是不存在、不唯一、偏差增大还是数值不稳定。最后使用“把日常语言中的“或”自动理解成二选一;数学中的或通常是包容或,两个条件同时真仍为真。”作为反例方向,指出最先失效的定义或等式。
反例不是为了否定整章,而是标记结论的边界。一个合格说明要写成“在条件A、B、C下得到结论Q;删除B时,输入x产生现象R,因此Q不能外推”。只说“这个例子不工作”不足以区分模型错误、实现错误与资源耗尽。访问控制规则“已登录并且是管理员,或者持有一次性恢复令牌”必须显式加括号。先写决策表,再映射代码,可发现默认优先级、空身份和令牌过期等边界。安全条件的否定应使用德摩根定律逐项检查,避免漏掉一种放行路径。
距离的含义随章节变化:精确离散结果可用相等或不变量,概率模拟可用频率误差与区间,数值线性代数可用残差范数和相对误差。先定义误差,再运行实验;不能看到输出以后才挑一个对自己有利的指标。
验收证书
验收证书包含五栏。定义栏写命题与真值表的输入域和单位;推导栏逐步说明逻辑与或非使用的规则;边界栏记录蕴含在零值、极值和退化输入下的状态;实现栏保存算法版本、依赖和随机种子;结论栏用德摩根定律对应的误差或反例决定通过。任何一栏缺失,都只能称为演示,不能称为可复核结论。
阈值tau必须在看结果前定义,并与业务或数值预算关联。精确问题的阈值可以是零,浮点问题应按尺度使用相对容差,统计问题应报告区间与功效而不是硬凑单点。验收结论还要注明未覆盖范围,使下一位读者知道哪里需要重新建模。
可核查推导
验证蕴含等价式时枚举P、Q四种组合。当P为假时,承诺没有被违反,所以蕴含为真;当P为真时,结果完全取决于Q。逐行与非P或Q比较即可得到同一列,而不是依靠一句容易误解的口号。 推导中的每个等号都应能说明用了定义、代数恒等式还是额外假设。若某一步只在有限、独立、满秩或可导等条件下成立,就把条件写在该步旁边,而不是藏在结论之后。
from itertools import product
def implies(p: bool, q: bool) -> bool:
return (not p) or q
for p, q in product([False, True], repeat=2):
assert implies(p, q) == ((not p) or q)上面的程序是推导的一个有限投影。它能发现实现错误,却不能单独证明对所有输入成立。验收时至少用手算小例、随机样例和故意破坏假设的反例三路比较。
机制与数据流
命题:能够明确判定真假的陈述;开放问题和含糊形容词在补充条件前不是合格命题。
真值表:枚举原子命题的全部组合,以机械方式验证复合表达式是否等价。
逻辑与或非:与要求条件同时成立,或要求至少一个成立,非负责翻转真值。
把数据流写成“输入对象 → 表示 → 变换 → 结果 → 证据”。这样可以定位单位、概率质量、维度或状态在哪一步丢失,也能区分数学模型错误与代码实现错误。
边界与失败模式
蕴含:只有前件真而后件假时为假;它描述承诺,不等同于因果关系。
德摩根定律:整体否定会交换与、或并逐项取反,是改写守卫条件的重要工具。
边界测试不只包括零、空集合和单元素。离散问题要检查规模翻倍与溢出,概率问题要检查归一化、相关性和尾部,线性代数问题要检查维度、秩、条件数与浮点残差。只有失败状态也能被解释,模型才可用于工程决策。
experiment = {
"claim": "命题到德摩根定律的关系",
"normal_case": "满足本章全部假设",
"boundary_case": "零规模、退化分布或近奇异输入",
"counterexample": "把日常语言中的“或”自动理解成二选一;数学中的或通常是包容或,两个条件同时真仍为真。",
}
assert set(experiment) == {"claim", "normal_case", "boundary_case", "counterexample"}工程案例
访问控制规则“已登录并且是管理员,或者持有一次性恢复令牌”必须显式加括号。先写决策表,再映射代码,可发现默认优先级、空身份和令牌过期等边界。安全条件的否定应使用德摩根定律逐项检查,避免漏掉一种放行路径。 案例验收应同时保存输入快照、参数与单位、算法版本、随机种子、退出状态和摘要结果。若只保存最终图或最终数字,后来无法区分数据变化、模型变化和实现变化。
evidence = [
("命题", "definition"),
("逻辑与或非", "derivation"),
("德摩根定律", "boundary-and-counterexample"),
]
assert len({name for name, _ in evidence}) == 3- 手算一个最小非平凡样例,标注每个符号的语义和单位。
- 运行程序并与手算结果比较,再加入零、边界、非法和退化输入。
- 故意删除一个关键假设,记录哪个推导步骤首先失效。
- 固定环境与随机种子重跑,保存残差、频率或复杂度,而不只保存“通过”。
常见误区
本章回顾
本章一一覆盖命题、真值表、逻辑与或非、蕴含、德摩根定律。掌握标准不是背出名词,而是能从定义重建公式,用程序复查有限实例,说明复杂度、概率或数值误差,并给出结论失效时的反例。