命题逻辑是介绍逻辑基本性质的一个很好的工具。它不提供确定原子语句的有效性(真或假)的方法。相反,它允许你在给定其原子成分的有效性的情况下评估复合语句的有效性。
例如,考虑以下情况
- 我喜欢帕特或者我喜欢乔。
- 如果我喜欢帕特,那么我喜欢乔。
- 我喜欢乔吗?
接受前两个陈述作为事实,注意这里“或”的使用不是排他的,因此实际上可以认为是在说“我喜欢帕特,或者我喜欢乔,或者我两者都喜欢”。这些陈述是否意味着“我喜欢乔”为真?试着说服自己“我喜欢乔”为真,并考虑另一条推理途径
- 猪会飞或者鱼会唱歌。
- 如果猪会飞,那么鱼会唱歌。
- 鱼会唱歌吗?
我们可以看到,在这两种情况下答案都是是。以上两组陈述都可以抽象如下
- ?
在这里,我们关注的是逻辑推理本身,而不是陈述。因此,我们不使用猪或帕特,而是简单地写s或s。我们首先从命题逻辑的语法开始我们的研究:也就是说,我们描述逻辑语言中的元素以及它们是如何书写的。然后我们描述这些符号的语义:即符号的含义。
命题逻辑的语法由命题符号、逻辑连接词和括号组成。规则规定了这些元素如何组合在一起。首先,我们将命题符号仅仅视为一些符号的集合,出于我们的目的,我们将使用罗马和希腊字母,并将所有符号的集合称为
- 命题符号:一些符号的集合。例如
其次,我们有逻辑连接词
- 逻辑连接词:
请注意,这些不是最小的必需集合;它们可以使用单个连接词NOR(非或)或NAND(非与)等效地表示,这些连接词在计算机硬件的最低级别使用。最后,我们使用括号来表示表达式(稍后我们将使括号可选)
- 括号:
表达式是命题符号、括号和逻辑连接词的字符串。
我们考虑的表达式称为公式。公式集是最小的表达式集,满足
- 如果,则
- ,
- ,
- 若 ,并且
- .
另一种定义公式的方法是将其视为由以下上下文无关文法定义的语言(起始符号为 )
- ,其中 代表任何命题符号
事实 1(唯一可读性):上述上下文无关文法是无歧义的。
公式的功能是在给定原子语句的含义的情况下创建语句的含义。公式 的语义,其中命题符号为 ,是一个映射,它将每个真值赋值 到 关联到 的一个真值(0 或 1)。(真值“真”和“假”可以分别用 1 或 0 代替,以及缩写“T”和“F”。)
由于事实 1(如上所示),语义是明确定义的。
指定逻辑连接词语义的一种方法是通过真值表
|
|
(p 且 q) |
0 |
0 |
0
|
0 |
1 |
0
|
1 |
0 |
0
|
1 |
1 |
1
|
是否总能找到一个实现任何给定语义的公式?是的,任何真值表都可以由一个公式实现。该公式可以如下找到。“表示”其中 的行,使用真命题符号的合取和假命题符号的否定。最后写出结果的析取。
例如,
|
|
|
合取(仅真值) |
0 |
0 |
1 |
|
0 |
1 |
0 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
|
推论:每个公式都等价于命题符号或命题符号的否定构成的合取式的析取(析取范式,DNF)。
DNF 的对偶是合取范式,CNF。
要得到CNF 中的
- 描述 为假的场景。
- 注意,当 为假时, 为真。因此,使用德摩根定律对 取反。
在某些情况下,DNF(或 CNF)的大小会比原始公式指数级增长。例如,对于,其等价的 DNF 的大小是指数级的。
每个真值表是否都存在一个多项式大小的公式来实现它?更准确地说,是否存在 使得每个具有 个命题符号的真值表都存在一个大小为 的形式?答案:否。
证明:假设存在这样的 。对于 个命题符号,真值表的数量是 。大小为 的公式数量是( 个命题符号,4 个连接词和括号)。显然,,对于足够大的。
[待补充:解释这些定义是什么以及提供它们的上下文]
- 满足性:公式 被真值指派 满足。记号:( 对 为真)。
- 蕴涵:公式集 蕴涵。记号:。 蕴涵 当且仅当每个满足 的真值指派也满足。
- – 公式集,其总是为真(也称为**重言式**)。例如, p ) , ( [ ( p ∨ q ) ∧ ( p → q ) ] → q ) {\displaystyle (p\lor \neg p),(p\to p),([(p\lor q)\land (p\to q)]\to q)} 是有效的公式。
- – 公式集,其永远为假(不可满足)。
- 介于两者之间: - 公式集,其存在满足赋值(不可满足)。
注意。 。
断言:
断言: 是NP完全的。
证明:
- : 猜测一个满足赋值,然后验证公式是否为真(满足赋值是一个证书)。
- 硬度。图3着色 (也存在一个直接证明)。我们将3着色规约到 。令 为一个图,其中有 个节点 。我们使用命题变量 来表示节点 被染成绿色、红色或蓝色。构造 如下
断言: 。
也可以直接证明 。
断言: 。
SAT在多项式时间内解决的特殊情况。示例
**霍恩子句**(Horn clause)是指最多只有一个肯定文字(positive literal)的文字析取式(disjunction of literals)。霍恩子句主要有两种类型。
- 子句包含1个肯定文字
- ,或者
- 不包含肯定文字
**断言**:对于任意一组霍恩公式集,检查 是否可满足(satisfiable)属于**P**类问题。
证明思路:令 为 的子集,其中仅包含类型 1 的子句,而 为 的子集,其中包含类型 2 的子句。首先要注意的是, 是可满足的。为了得到一个最小满足赋值 ,从单文字子句中的文字开始,并应用规则。现在需要检查 与 中的子句的一致性。为此,只需检查对于 中的每个子句 , 对于所有的 都不为真。
示例:考虑霍恩子句集
类型 1 的子句集 由前 5 个子句组成,而 由最后一个子句组成。请注意, 也可以写成
对于 ,其最小满足赋值如下获得
- 从 开始
- 利用第一个蕴含式推导出
- 利用第二个蕴含式推导出
因此,最小满足赋值使得 为真。这与 矛盾,后者指出 必须为假。因此, 不可满足。
**演绎**系统是一种从给定陈述中证明新陈述的机制。
令 为一组已知的有效陈述(命题公式)。在演绎系统中,有两个组成部分:推理规则和证明。
- 推理规则
- 推理规则表明,如果某些陈述(公式)集 为真,则给定陈述 也必须为真。推理规则 表示为 。
- 示例(肯定前件):
- 证明
从中证明的证明是一个公式序列,其中,并且对于所有
- 每个公式,或者
- 存在公式的子集,使得是一个推理规则。
如果使用推理规则从 有一个证明,我们写成。
性质:
- 可靠性(Soundness):如果,则(即,所有可证明的句子都是真的)。此属性对于演绎系统正确性的基础。
- 完备性(Completeness):如果,则(即,所有真句子都是可证明的)。这是演绎系统中一个理想的性质。
自然演绎是一组推理规则。令表示矛盾,假。以下是自然演绎的推理规则
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
规则 (13) 允许我们证明形如“如果 则 ” 的有效陈述,即使我们不知道 陈述的真值(即, 不在已知有效陈述的集合 中)。实际上,对于此规则,我们首先假设 是有效的。如果我们可以在 有效的世界中得出结论 是有效的,那么我们得出结论关系 为真,并且我们“释放”假设 是有效的。
现在我们展示如何应用上述推理规则。
示例:否定的或表达式的德摩根定律指出
证明:根据规则 ,如果我们能证明 和 ,我们就可以推导出期望的结果。
为了证明第一个方向,我们使用规则 13 并假设前提 。然后
- (假设)
- (假设)
- (根据规则11)
- (根据规则5)
- (根据规则14)
- (假设)
- (根据规则11)
- (根据规则5)
- (根据规则14)
- (根据规则1)
- (根据规则13)
我们现在证明第二个方向。
- (假设)
- (根据规则2)
- (根据规则3)
- (假设)
- (假设)
- (根据规则5)
- (根据规则16)
- (根据规则14)
- (根据规则13)
皮尔斯定律的证明
- (假设)(1*)
- (假设)
- (假设)
- (根据规则5)
- (根据规则7)
- (根据规则13)
- (根据假设(1*)和规则4)
- (根据规则5)
- (根据规则14)
- (根据规则13)
事实2:自然演绎是可靠的。
为了证明自然演绎也是完备的,我们需要引入命题归结。
归结是另一种用于检查语句有效性的过程。它涉及子句、公式和单个归结规则。
一些术语
- 子句
- 子句是由文字析取组成的命题公式。例如 。它通常表示为文字的集合,例如 。
- 空子句,表示为一个空框“”,是没有文字的析取。它总是假的。
- 公式
- 一组子句,每个子句都是可满足的。例如,表示CNF公式 。
- 空公式,表示为 ,是不包含任何子句的集合。它总是真的。
- 归结规则
- 规则规定,给定两个子句(包含某个文字)和(包含某个文字),可以推导出一个新的子句,称为和的结果子句(相对于)。
归结证明系统包含单个归结规则,其中结果子句定义如下。假设和是子句,使得且,则
包含且在归结下封闭的最小子句集记为。
示例:如果且,则。
可以证明,如定义的那样,归结规则计算出的子句可以通过自然演绎推导出来。
断言:设 和 是任意两个子句,使得 且 。则 。
为了证明一个陈述 的有效性,我们将证明其否定陈述 是不可满足的。为了证明公式 的不可满足性,我们需要定义公式 的归结反驳。
公式 的归结反驳树是一棵根节点为空子句的树,其中每个叶子节点都是 中的一个子句,每个内部节点都计算为其两个对应子节点的归结式。
注意, 的子句可以重复作为叶子节点出现。根据上述断言,我们可以得出结论:
断言:如果存在公式 的归结反驳树,则 ,也就是说, 是不可满足的。
示例:公式
具有以下归结反驳树
在计算归结反驳树时,选择子句计算归结式的顺序很重要,如下例所示:考虑公式
即使对于可能存在归结反驳树,但在尝试构建树时,顺序也很重要。下面是两个不同的归结反驳树,但只有一个是成功的。
可靠性:命题归结是可靠的,也就是说,如果对于给定的公式存在归结反驳树,则必须是不可满足的。
定理:对于任何公式,如果,则。
完备性:命题归结是完备的,也就是说,如果给定的公式是不可满足的,则具有归结反驳树。
定理:对于任何公式,如果,则。
证明:通过对中变量个数进行归纳。
基础情况:我们有一个变量,比如。的所有可能的子句是和。如果是不可满足的,则这两个子句都会出现,因此。
归纳步骤:假设对于少于个变量的公式,该假设成立。令为一个具有个变量的公式。假设;我们将证明是可满足的。令为的一个变量。那么要么,要么(如果两者都成立,则立即成立)。
假设。我们定义公式,它包含所有不包含的子句,并且其中文字已从每个子句中删除(换句话说,等价于将设置为真的结果得到的公式)。
形式上,
- .
首先,注意
因此,
- .
此外,由于 ,我们有 。根据归纳假设, 是可满足的。然后 通过 的满足赋值的扩展来满足,其中 等于真。情况 类似。
定理:令 为自然演绎的推理规则集。如果 ,则 。
自然演绎完备性证明的思想如下。假设 是有效的(那么 是不可满足的)。然后我们证明存在一个针对 的归结反驳,然后通过应用矛盾规则(规则 15)
我们得出结论 可以被推断出来。
证明:(草图)给定一个在 下有效的公式 ,我们执行以下步骤
- 证明 等价于某个 ,其中 为合取范式。
- 证明对于所有 ,都有 成立。
- 根据归结原理的完备性,如果 是不可满足的,则 。因此,对于某个文字 ,有 和 。这意味着 。
- 得出结论 ,因此 是有效的。
步骤 (1) 可以通过重复应用德摩根定律轻松完成。步骤 (2) 可以使用自然演绎法证明。最后,步骤 (3) 可以通过对获得 的步骤数进行归纳证明。显然,每个步骤都可以使用自然演绎法模拟。
任何命题归结算法在最坏情况下都可能需要很长时间(回想一下,检查公式 的有效性是 co-NP 完全的)。
线性归结是一种特殊的归结策略,它总是将最新的归结式与一个子句进行归结。因此,由此获得的归结反驳树是线性的。可以证明,如果子句集是 Horn 子句,则对于任何公式都存在一种线性归结策略。也就是说,线性归结对于 Horn 子句集是完备的。
PROLOG 语言使用霍恩子句集上的归结原理。每个子句称为程序子句。此外,由单个文字组成的子句称为事实。只有一个否定文字的子句称为查询。下表显示了不同表示法的比较。在 PROLOG 中,要查询语句,其思路是将语句取反(),并使用已知真语句集执行归结。如果找到一个归结反驳树,则语句 由程序蕴含。
示例:线性归结用于公式的示例
如下所示