合取范式的可满足性判定算法和谓词逻辑不可判定性

简介: 作为本系列的最后一篇文章,我们来看被广为研究的SAT问题。 SAT问题是第一个被证明为NP问题的判定问题。更多信息可以去百度或者维基一下。   前面我们看到了Horn公式可满足性的判定算法,现在把它推广到任意公式Φ。

作为本系列的最后一篇文章,我们来看被广为研究的SAT问题。

SAT问题是第一个被证明为NP问题的判定问题。更多信息可以去百度或者维基一下。

 

前面我们看到了Horn公式可满足性的判定算法,现在把它推广到任意公式Φ。首先将公式变换成具有下面语法的等值公式:φ ::= p | (¬φ) | (φ ∧ φ)。变换方法如下(已被证明变换后是等价的):

 在结果T(φ)的语法树中要公共子公式共享,这样将语法树变成一个有向无回路(环)图(DAG)。

例如,φ = p∧ ¬(q ∨¬p),变换后T(φ)=p ∧¬¬(¬q ∧¬¬p)。它们语法树分别是:

 看明白怎么就是“分享子公式”了吧。

对于变换后的语法树进行从上到下的标记,根部标记T,如果没有冲突标记的结果就是一次合格的赋值。标记中需要用到的逼迫规则有下:

那么这个算法能判断所有的公式吗?答案是否定的!对于形如¬(φ1 ∧ φ2)这样的公式无法判断(自己试一下)。

 

上述算法是一个线性时间算法。我们还有一个三次多项式时间算法。算法的主要思想:

1.任选一个未标记结点试探标记T,运行线性时间求解算法.若报告可满足,则输出可满足指派并停机;若算法报告失败或报告不可满足(矛盾),而不再有待试探的结点,算法报告”标记失败”并停机;否则转2.

2.对该结点标记F,运行线性时间求解算法.若报告可满足,则输出可满足指派并停机;若算法报告不可满足且在前面标记该结点时也报告不可满足,则报告不可满足并停机;否则将两次试探标记都相同的结点标记作为永久标记.转1.

这个算法也不是万能的,比如它对于下图语法树对应的CNF不能判定:

 SAT问题目前依然是逻辑界和计算理论界的研究热点。有兴趣的可以关注一下。

 

命题逻辑公式是否定理最起码可以通过真值表查看是否可满足,那么对于谓词逻辑公式呢?我们是不是有其他什么方法可以判断谓词逻辑公司是否有效呢?

答案是否定的:给定一个谓词逻辑公式φ,|=φ是否有效是不可判定的。这有点震惊了,到底是啥意思呢?

我们采用问题归约技术:将一个已知不可判定问题归约到所考虑的判定问题,使得要考虑的判定问题可判定必导致已知的不可判定问题成为可判定问题,这就导致了矛盾。这证明我们要考虑的判定问题是不可判定的。(如果没有学过算法的,可以先花点时间了解下什么是规约)

那么哪个判定问题是不可判定问题呢?我们选择著名的波斯特对应问题(Post Correspondence Problem, PCP,你可以先百度一下):PCP的一个问题实例由某个字母表Σ上串的两个表组成,这两个表的长度相等,一般称为A表和B表。对于某个正整数k,A=(s1,s2,...,sk),B=(t1,t2,...,tk)。(si, ti)表示一个对应对。如果存在整数序列i1,i2,...,in,当把这个序列解释成A表和B表中串的下标时,能够产生相同的串,则说这个PCP问题实例有解。i1,i2,...,in称为这个问题的一个解。PCP问题就是对于一个PCP实例,它是否有解

波斯特对应问题是不可判定的。可以参考《自动机理论、语言和计算导论》John E. Hopcroft  Rejeev Motwani Jeffrey D.Ullman著, 刘田、姜晖、王捍贫译,机械工业出版社,2004年6月第1版。

看一个波斯特对应问题实例:字母表Σ={0,1}。

例1.  A={1,10,011}, B={101,00,11},其解为:(1,3,2,3),串是1011  10  011。

例2.  A={1,10111,10},B={111,10,0},其解为(2,1,1,3)或(2,1,1,3,2,1,1,3)

例3.  A={10,011,101},B={101,11,011} 这个PCP问题实例无解

(你说什么?你感觉这个问题很简单,能够设计出算法?那你可以试试。)

 

定理 谓词逻辑公式的有效性判定问题是不可判定的:不存在判定算法,使得对于任给谓词逻辑公式Ф,判定是否|=Ф是有效的。

证明: 采用归约技术对于给定的波斯特对应问题实例C,构造一个谓词逻辑公式Ф,且构造在有限的空间和时间内完成,使得|=Ф有效当且仅当波斯特对应问题实例C有解

设波斯特对应问题实例C:

 构造公式Ф:函数符号F={e,f0 ,f1},e是常量,e,f0 ,f1是一元函数。谓词符号P。



 


 



 

 

 

目录
相关文章
|
25天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
33 0
|
1月前
|
人工智能 算法
【算法】深入理解 Prolog:逻辑编程的奇妙世界
【算法】深入理解 Prolog:逻辑编程的奇妙世界
24 0
|
8月前
|
机器学习/深度学习 传感器 算法
【航迹】基于MN逻辑算法实现航迹关联和卡尔曼滤波外推附matlab代码
【航迹】基于MN逻辑算法实现航迹关联和卡尔曼滤波外推附matlab代码
|
6月前
|
存储 算法 C语言
《信任的进化》游戏简易版逻辑算法的实现(C语言)
《信任的进化》游戏简易版逻辑算法的实现(C语言)
|
6月前
|
算法
增强能力:提升专业知识、熟练职业技能、持续总结面试题、英语词汇、学习数据结构和算法(提升逻辑思维)
增强能力:提升专业知识、熟练职业技能、持续总结面试题、英语词汇、学习数据结构和算法(提升逻辑思维)
|
9月前
|
算法
借助模糊逻辑将文化算法与和谐搜索相结合进行学习——文化和谐学习算法(Matlab代码实现)
借助模糊逻辑将文化算法与和谐搜索相结合进行学习——文化和谐学习算法(Matlab代码实现)
|
9月前
|
算法 Java 关系型数据库
引用计数 vs 根可达算法:深入比较对象存活判定
引用计数 vs 根可达算法:深入比较对象存活判定
138 0
|
存储 机器学习/深度学习 算法
数据结构开篇:逻辑结构和物理结构、算法复杂度
数据结构开篇:逻辑结构和物理结构、算法复杂度
|
算法 Python
python与算法:单链表剖分函数(对链表的元素可以按照是否满足特定功能切分为两个新的链表)
python与算法:单链表剖分函数(对链表的元素可以按照是否满足特定功能切分为两个新的链表)
72 0