逻辑是研究推理规则的学问, 对偶原理和蕴含定理 是 推理代数化 的两个关键定理。
数学主要建立在严密的谓词逻辑之上,它用符号表达对象与关系,再以形式推理导出结论。
是非不靠争吵,而靠推理。 当双方对前提的判断是一致的,谁对谁错,是可计算的——
只需把各自的观点代入同一套推理规则中,计算机就能像解方程一样判断结论的真假。
在逻辑面前,人人平等,情绪无效,态度无权,只有前提 + 规则 → 结论。
P1:善恶,美丑,对错,乃至“食物好不好吃”的判断,人类是趋同的,并非混乱无序。
P2:坏人,恶人 知道自己在做坏事
P3: 希望有个维持正义的超主,去约束那些不讲理,犯罪,滥用暴力的人。
使用逻辑的步骤:
| 步骤 | 名称 | 说明 |
|---|---|---|
| P1 | 抽象建模 | 从自然语言中提取个体元、谓词、关系,明确问题中涉及的对象和性质。 |
| P2 | 形式化表达 | 将自然语言句子转换为逻辑表达式:命题逻辑、谓词逻辑、模态逻辑等。 |
| P3 | 定义符号 | 明确所有逻辑符号的含义:谓词的意义、变量代表什么、模态词的解释等。 |
| P4 | 列出前提 | 写出所有已知条件、公理、假设前提等,为后续推理提供依据。 |
| P5 | 逻辑推理 | 运用逻辑规则(如蕴含、等价、量词变换、模态定律, 逻辑定律 等)推导出结论。 |
| P6 | 验证有效性 | 验证推理是否正确:用真值表、演绎规则、模型语义或反例法确认结论是否成立。 |
| P7 | 解释结论 | 将逻辑结论还原为自然语言,用于决策、说明或系统反馈。 |
命题逻辑
基本逻辑运算符的功能
- 非(¬p):取反
- 且(p ∧ q):都是 1
- 或(p ∨ q):有 1
- 含(p → q):不是真推假都行
- 异或(p ⊕ q):不一样
- 同或(p ↔ q):一样
结合语意
F是对张三说的话的符号表示
🚫 否定(Negation):F = ¬p
张三说:“p 不会发生”
| p | ¬p | 现实语义 | 张三说的话对吗 |
|---|---|---|---|
| 1 | 0 | 事情发生了 | ❌ 错的,被现实打脸 |
| 0 | 1 | 事情没发生 | ✅ 对的,现实支持他说法 |
🔗 合取(Conjunction):F = p ∧ q
张三说:“p 并且 q(两件事都要发生)”
| p | q | p ∧ q | 现实语义 | 张三说的话对吗 |
|---|---|---|---|---|
| 1 | 1 | 1 | 两件事实都发生了 | ✅ 对的,两个条件都满足 |
| 1 | 0 | 0 | p 成立但 q 没有 | ❌ 错的,q 没发生,承诺落空 |
| 0 | 1 | 0 | q 成立但 p 没有 | ❌ 错的,p 没发生 |
| 0 | 0 | 0 | 两件事都没发生 | ❌ 更错,什么都没发生 |
🔀 析取(Disjunction):F = p ∨ q
张三说:“p 或者 q(至少一件发生)”
| p | q | p ∨ q | 现实语义 | 张三说的话对吗 |
|---|---|---|---|---|
| 1 | 1 | 1 | 两件事都发生了 | ✅ 对的,有至少一件发生 |
| 1 | 0 | 1 | 只发生了 p | ✅ 对的 |
| 0 | 1 | 1 | 只发生了 q | ✅ 对的 |
| 0 | 0 | 0 | 两件事都没发生 | ❌ 错的,说有事发生,但现实打脸 |
➡️ 蕴含(Implication):F = p → q
张三说:“如果 p,则 q”
p是前提,q是结论
| p | q | p → q | 现实语义 | 张三说的话对吗 |
|---|---|---|---|---|
| 1 | 1 | 1 | 现实中 p 成立,q 也成立 | ✅ 对的,说得没错 |
| 1 | 0 | 0 | 现实中 p 成立,但 q 没有 | ❌ 错的,承诺落空,p 成立却没兑现 q |
| 0 | 1 | 1 | p 不成立,q 成立 | ✅ 对的,张三说的承诺无从验证,不算错 |
| 0 | 0 | 1 | p 不成立,q 也不成立 | ✅ 对的,p 不成立,所以张三的话不能被反驳 |
逻辑连接词的多项式表示
逻辑运算符可以用布尔代数中的 0-1 多项式(又称代数范式)表示。
0-1 多项式是 域上的多项式。
设命题变量 p, q {0,1} ,以下是常见逻辑连接词的多项式等价形式:
| 逻辑符号 | 逻辑表达式 | 多项式形式 | 等价关系 |
|---|---|---|---|
| 非 | 反转 | ||
| 与 | 乘积 | ||
| 或 | 并减交 | ||
| 异或 | 不同为1 | ||
| 蕴含 | |||
| 等价 | 同值为1 |
命题逻辑常用定律
| 定律名称 | 公式表达 | 说明示例 |
|---|---|---|
| 恒真律 | p ∨ ¬p≡1 | 任意命题,要么成立,要么不成立 |
| 恒假律 | p ∧ ¬p≡0 | 命题不可能同时为真和假 |
| 双重否定律 | ¬(¬p) ≡ p | 否定否定等于原命题 |
| 交换律 | p ∨ q ≡ q ∨ p ; p ∧ q ≡ q ∧ p | 与、或的顺序不影响结果 |
| 结合律 | (p ∨ q) ∨ r ≡ p ∨ (q ∨ r) | 分组不影响结果 |
| 分配律 | p ∨ (q ∧ r) ≡ (p ∨ q) ∧ (p ∨ r) | 与或之间的展开 |
| 吸收律 | p ∨ (p ∧ q) ≡ p | 包含关系下可以吸收 |
| 弱化律 | p → (p ∨ q) | 推出更弱的命题总是成立 |
| 德摩根律 | ¬(p ∧ q) ≡ ¬p ∨ ¬q ; ¬(p ∨ q) ≡ ¬p ∧ ¬q | 否定一个合取/析取变成相反的析取/合取 |
| 蕴含等价 | p → q ≡ ¬p ∨ q | 蕴含可转为析取表达形式 |
| 等价对称律 | p ↔ q ≡ (p → q) ∧ (q → p) | 等价就是互相蕴含 |
谓词逻辑
| 元素类别 | 符号/例子 | 含义与说明 |
|---|---|---|
| 个体变量 | x, y, z | 表示某个对象或元素 |
| 常量 | a, b, c | 表示特定的对象,例如:张三、北京、数字 1 |
| 谓词 | P(x), Likes(x, y) | 表示性质或关系:P 表示“是某种性质”,Likes 表示“喜欢” |
| 全称量词 | ∀x P(x) | 对所有 x,P(x) 都为真(全称命题) |
| 存在量词 | ∃x P(x) | 至少存在一个 x,使 P(x) 成立(存在命题) |
| 连接词 | ∧, ∨, →, ¬, ↔ | 逻辑连接词:与、或、蕴含、非、等价 |
| 等号 | x = y | x 和 y 是同一个对象 |
谓词逻辑常用定律
| 定律名称 | 公式表达 | 说明示例 |
|---|---|---|
| 全称否定 | ¬∀x. P(x) ≡ ∃x. ¬P(x) | 不是所有人都是P ≡ 有人不是P |
| 存在否定 | ¬∃x. P(x) ≡ ∀x. ¬P(x) | 不存在人是P ≡ 所有人都不是P |
| 全称分配律 | ∀x. (P(x) ∧ Q(x)) ≡ ∀x. P(x) ∧ ∀x. Q(x) | 每个人都A且B ≡ 每个人都A 且 每个人都B |
| 存在分配律 | ∃x. (P(x) ∨ Q(x)) ≡ ∃x. P(x) ∨ ∃x. Q(x) | 存在人A或B ≡ 有人是A 或 有人是B |
| 量词顺序交换 | ∀x ∀y. R(x, y) ≡ ∀y ∀x. R(x, y) | 全称量词顺序可交换 |
| ∃∃ 可交换 | ∃x ∃y. R(x, y) ≡ ∃y ∃x. R(x, y) | 存在量词顺序也可交换 |
| ∀∃ 不可交换 | ∀x ∃y. R(x, y) ≠ ∃y ∀x. R(x, y) | 存在的人依赖于所有的 x 与否不同 |
例子
| 表达式 | 自然语言解释 |
|---|---|
| ∀x Human(x) → Mortal(x) | 所有人类都必死 |
| ∃x (Dog(x) ∧ Black(x)) | 存在黑狗 |
| ∀x ∃y Likes(x, y) | 每个人都有喜欢的人 |
| ¬∃x Rich(x) | 没有人是富有的 |
| ∀x (P(x) ↔ Q(x)) | 对所有 x,P(x) 与 Q(x) 等价 |
模态逻辑
模态逻辑是对命题逻辑的扩展,用来表达 (可能,必然), (允许 , 禁止) 等等的逻辑系统。
| 符号表达 | 读作 | 自然语言解释 |
|---|---|---|
| ◇p | “可能 p” | 有可能下雨(某个可能世界中 p 成立) |
| □p | “必然 p” | 无论在哪种情况下,p 都为真(如:2+2=4) |
| ¬◇p | “不可能 p” | p 在所有可能世界中都不成立 |
| ¬□p | “非必然 p” | 至少有一个可能世界中 p 不成立 |
| □(p → q) | “必然地 p 蕴含 q” | 在所有可能情况下,如果 p 成立,则 q 也成立 |
| ◇(p ∧ q) | “可能同时满足 p 和 q” | 有可能同时下雨又打雷 |
| □p → p | “若必然 p,则实际 p” | 经典 T 公理(某些模态系统中的有效规律) |
| p → ◇p | “如果 p 成立,则可能 p” | 如果现在发生了,当然说明它是可能发生的 |
模态逻辑中的常用定律
| 定律名称 | 公式表达 | 说明 |
|---|---|---|
| 双重性 | ◇p ≡ ¬□¬p | “可能 p” 等价于“不是必然非 p” |
| T 公理 | □p → p | 如果 p 是必然的,则它实际也成立 |
| 4 公理 | □p → □□p | 若 p 是必然的,则必然 p 也必然 |
例子
| 情境类型 | 模态逻辑表达 | 自然语言解释 |
|---|---|---|
| 现实可能性 | ◇Crash | 有可能发生车祸 |
| 现实必然性 | □(2+2=4) | 2+2 必然等于 4(在所有世界中) |
| 伦理命令 | □(Do(Homework)) | 你必须做作业(“应当”的模态) |
| 科学规律 | □(LightSpeed < ∞) | 光速一定是有限的 |
| 不确定未来 | ◇(TomorrowRains) | 明天可能下雨 |
两个通用定理
| 名称 | 公式表达 | 说明 |
|---|---|---|
| 蕴含定理 | p1 ∧ p2→q1 ∨ q2 | 蕴含词两边可以取反移动到另一侧 |
| 对偶原理 | ¬(ABC)=¬A¬B¬C | 对一个表达式取否定就是对后面的每个符号都取否定 |
极限不存在应用对偶原理展开
¬ (∀ε∃N∀n(ε>0ΛN>0Λn>N)→|an-A|<ε)) = ∃ε∀N∃n(ε>0ΛN>0Λn>N)Λ|an-A|≥ε)
自然语言符号化的例子
| 自然语言句子 | 逻辑表达式 | 描述 |
|---|---|---|
| 如果今天下雨,那么有些人可能不来。 | Rain → ∃x. ◇¬Come(x) | 命题、谓词、模态 |
| 所有人必须遵守规则,就能让系统安全。 | (∀x. □Obey(x)) → SafeSystem | 谓词(Obey)、模态(□)、命题 |
| 有可能存在一个学生通过考试。 | ◇∃x. (Student(x) ∧ Pass(x)) | 模态(◇)、谓词(Pass)、量词(∃)、命题 |
| 如果张三作弊,那么他必然被惩罚。 | Cheat(zhang) → □Punish(zhang) | 命题、谓词、模态 |
| 并非所有人都一定说了真话。 | ¬∀x. □ToldTruth(x) | 谓词(ToldTruth)、模态(□)、命题 |
| 除非好好学习,否则会后悔 | ¬StudyHard → Regret | 否定前件的蕴含 |
| 要么上清华,要么上北大 | 异或 | |
| 只有付出努力,才能获得成功 | Success → Effort | 反向蕴含 |
逻辑代数化的例子
老实人和骗子
- 在一个岛上,住着两种人,一种是说真话的老实人,一种是说假话的骗子。一天,你碰到了甲、乙、丙三个人。 甲说:“乙和丙都是老实人。” 乙说:“我是老实人,丙是骗子。” 丙说:“甲是骗子。”
请问:甲、乙、丙三人中,谁是老实人,谁是骗子?
约定:
X:X 是老实人, 甲,乙,丙 对应A,B,C
列方程
E1:甲 = 乙 ∧ 丙
E2:乙 = 乙 ∧ ¬丙
E3:丙 = ¬甲
解方程
P1:甲 = 0(E2 代入 E1)
P2:丙 = 1(P1 代入 E3)
P3:乙 = 0(P2 代入 E2)
逻辑多项式组
groebner 基解上面的方程组
需要指定域为GF(2)
from sympy import symbols, groebner, GF
from itertools import product
# 定义变量
A, B, C = symbols('A B C')
# 定义多项式(GF(2))
eqs = [A - B*C, B - B*(1 - C), C - (1 - A)]
# 构造 Groebner basis(词典序便于消元)
G = groebner(eqs, A, B, C, order='lex', domain=GF(2))
# 打印 Groebner basis
print("Groebner Basis over GF(2):")
for g in G:
print(g)
# 手动枚举 F2^3(0/1)并检验属于零点集
print("\n解集:")
for a, b, c in product([0, 1], repeat=3):
if all([g.subs({A: a, B: b, C: c}) % 2 == 0 for g in G]):
print(f"A={a}, B={b}, C={c}")
#A=0, B=0, C=1
最终解
js遍历
//遍历所有可能的 A、B、C 的值,因为它们只能是 0 或 1
//变量总个数
const N=3;
//总的状态数
const MAX= 2**3
for (let i = 0; i < MAX; i++) {
const [A,B,C] = Array.from({ length: N }, (_, index) => (i >> index) & 1);
const E1 = A == (B && C);
const E2 = B == (B &&!C);
const E3 = C ==!A;
// 检查是否所有方程都满足
if (E1 && E2 && E3) {
console.log(`找到解:A = ${A}, B = ${B}, C = ${C}`);
}
}
//输出: 找到解:A = 0, B = 0, C = 1
python遍历
N = 3
MAX = 2 ** 3
for i in range(MAX):
A, B, C = [(i >> j) & 1 for j in range(N)]
E1 = A == (B and C)
E2 = B == (B and not C)
E3 = C == (not A)
if E1 and E2 and E3:
print(f"找到解:A = {A}, B = {B}, C = {C}")
# 输出: 找到解:A = 0, B = 0, C = 1
队员选拔
- 有六位选手甲、乙、丙、丁、戊、庚参加足球队队员选拔。已知:
(1)如果选拔甲,那么必须同时选拔乙和丙 (2)如果选拔戊,则必须同时淘汰丙和丁 (3)除非选拔戊,否则淘汰庚 (4)甲是主力,必须选拔。
根据以上信息,下列一定为真的是( )。
选项:
A. 选拔戊并且淘汰丙 B. 同时选拔丙和丁 C. 同时淘汰戊和庚 D. 选拔戊并且淘汰丁
约定:
- X:选拔 X
- 除非p,否则q = ¬p →q
列方程
E1: 甲 → 乙 ∧ 丙 E2: 戊 → ¬丙 ∧ ¬丁 E3: ¬戊 → ¬庚 ≡ 戊 ∨ ¬庚 E4: 甲 = 1(甲是主力,必须选拔)
解方程
P1: 甲 = 1,乙 = 1,丙 = 1 (E1, E4) P2: 戊 = 0 (E2) P3: 戊 = 0,庚 = 0 (E3) P4: 选 C