合取范式 (CNF)
自动证明搜索
我们已经讨论过逻辑可以在机器上执行
有几种方法
交互式定理证明
自动证明搜索
决策程序
我们专注于最后两个
命题逻辑的决策程序
谓词逻辑的自动证明搜索
SAT求解器有什么用?
SAT-solver 旨在表明可以满足公式。 为什么这很有用?
指定和构建产品
要指定产品所需的行为,您需要给出一组
约束:
在这种情况下,这件事应该发生。 . . ,
在那种情况下,那件事应该发生。 . . ,
要构建系统,您需要找到某种方法来满足所有约束
同时地。 SAT 求解器会告诉您这是否可能。
约束是什么样的?
在人行横道处:(红色 → 停止)∧(绿色 → 走)。 自从(α → β) ≡ (¬α ∨ β),这与
示例(人行横道)
(¬红色∨停止)∧(¬绿色∨走)
术语
文字(变量或其否定):¬red,stop,¬green,go
子句(文字的析取):(¬red ∨ stop),(¬green ∨ go)
CNF:将公式写成从句的连词
((this ∧ · · · ∧ this) → case1) ∧ ((that ∧ · · · ∧ that) → case2) ∧ . . .
is the same as
(¬(this ∧ · · · ∧ this) ∨ case1) ∧ (¬(that ∧ · · · ∧ that) ∨ case2) ∧ . . .
which is the same as
(¬this ∨ · · · ∨ ¬this ∨ case1) ∧ (¬that ∨ · · · ∨ ¬that ∨ case2) ∧ . . .
which is in CNF.
合取范式 (CNF)
提醒:术语
字面量:一个命题变量或一个的否定
条款:
文字的析取; 或者
公式⊥(表示“空析取”)
CNF-公式:
从句的连词; 或者
公式⊤(表示“空连词”)
解释为什么⊥和⊤代表“空”的析取和合取。
空析取是一个不包含文字的子句。
我们为空子句写□。
空连词是不包含从句的公式。
空子句集∅不包含子句。
特别案例
⊥ 既是子句又是公式。
当被视为从句时,⊥ 由空子句 □ 表示。
当被视为一个公式时,⊥ 由子句集 {□} 表示,因为它的 CNF 版本是唯一从句为空子句的连词。
不包含文字的子句集有两个公式不包含文字:
公式⊤由空子句集表示,∅
公式⊥由子句集{□}表示,其唯一的子句是空一个。
CNF算法
以命题公式为输入,返回 CNF 中的等效公式
我们提供声明性版本,它使用命题等价作为从左到右的重写规则
第 1 步:从输入公式中消除 ↔ 和 →:
φ ↔ ψ ≡ (φ → ψ) ∧ (ψ → φ)
φ → ψ ≡ ¬φ ∨ ψ
第 2 步:将否定推向文字:
¬¬φ ≡ φ
¬(φ ∧ ψ) ≡ ¬φ ∨ ¬ψ
¬(φ ∨ ψ) ≡ ¬φ ∧ ¬ψ
¬⊥ ≡ ⊤
¬⊤ ≡ ⊥
第 3 步:将析取分配到连词中
φ ∨ (ψ ∧ χ) ≡ (φ ∨ ψ) ∧ (φ ∨ χ)
(φ ∧ ψ) ∨ χ ≡ (φ ∨ χ) ∧ (ψ ∨ χ)
第 4 步:简化生成的 CNF 公式(可选)
将具有互补文字(例如 p 和 ¬p)的子句重写为 ⊤
重写 φ ∧ ⊤ ≡ φ, φ ∧ ⊥ ≡ ⊥, φ ∨ ⊤ ≡ ⊤, φ ∨ ⊥ ≡ φ
如果它的所有文字都已经出现在另一个子句 C 中,则删除子句 C’(包含)