在Qt中集成PicoSAT
1. 背景
========
P=NP? 是计算机领域里的未解决的难题(unsolved problem)。早在 2000 年 5 月的时候,Clay Institute 将这个问题列为了数学里的七大千禧问题之一。如果从时间复杂度上对算法和问题分类,就可以提出“问题类”(problem class)的概念,而P和NP是通过两种不同的方式定义的两个“问题类”。P=NP? 的含义是,P类和NP类这两个问题类的关系:是否是同一个问题类。通常来说,P类问题的研究意味着在算法的意义上,这个问题得到了较好的解法,而NP类意味着这个问题“较难”。
NP完全问题是一个问题类。布尔可满足性问题(Boolean satisfiability problem)是判定是否存在使布尔公式为真的变量赋值的NP完全问题,由斯蒂芬·库克(1971年)和列昂尼德·莱文(1973年)分别独立证明其为NP完全问题,是第一个被证明的NP完全问题。其基本形式要求检查命题逻辑公式是否可通过变量赋值得到真值结果。
PicoSAT是一个SAT问题的求解器,以C语言函数的方式提供。我们尝试设计、实现、构建了一个图形用户界面,可以通过交互窗口的方式,输入CNF子句,然后调用PicoSAT得出SAT文件的解,并显示在交互窗口上。这可以作为一个简单的完整的调用PicoSAT且带有图形用户界面的例子。
2. 组件和实现
==============
SAT求解器通常使用CNF表述公式。PicoSAT提供的接口,通过整数表示公式的项。为了便于理解,图形用户界面程序定义了一个简单的包括变量名、逻辑非(!)、逻辑或(||)的语言,在图形用户界面中用户直接输入这个语言,即每个子句。他们会被转换为整数和PicoSAT接收的输入。
* 变量名:一个由大小写组成的字母串。
* 逻辑非: !
* 逻辑或: ||
调用PicoSAT求解器后得到的解也是通过整数表示的,图形用户界面程序会将解再转换为变量名,然后显示到结果框内。
主窗口包括Qt提供的一些基础组件,例如布局控件(QLayout)、单行输入(QLineEdit)、文本标签(QLabel)、文本区(QTextEdit)、按钮(QPushButton)等,并正确绑定了事件。通过图形用户界面程序,可以添加子句、管理子句、求解、查看结果等(调用相关的例程,传递具体的参数)。
例如,输入两个子句:
A || B
!A || C
容易看出来,总的公式等价于 (A || B) && (A -> C) 。那么,如果A为真,那么C必然为真,B可真可假,这就有两个解。如果A为假,那么B必为真,C可真可假,这又有两个解。一共四个解。
PicoSAT 求解器正确得出了四个解,而且图形用户界面程序正确地显示到了软件界面上。这四个解是:
① A 假,B,C为真
② A 假,B为真,C为假
③ A,B,C均为真
④ A为真,B为假,C为真
软件可以支持求出最多10个解,但这可以通过修改限制参数,得出更多的解。
源代码中的 `refineClause()` 函数解析和验证子句格式。
`parseClause()` 函数将子句转换为整数表示。
`solveMultipleSAT()` 函数枚举多个解。
软件完整地实现了变量名和整数之间的转换,并和PicoSAT交互。
PicoSAT是一个出色的SAT求解器,使用小型、简洁、高效的C语言实现,基于CDCL(冲突驱动子句学习),适用于教育和小规模嵌入式系统,虽然不再是尖端竞速型求解器,但非常稳健。如有需要,可以了解Kissat、CaDiCaL其他求解器。通过直接包含源代码的方式,将PicoSAT集成到这个图形用户界面程序中,最终编译成一个程序。
3. SAT求解器的应用
==================
现在的软件系统除了内置SAT求解器,还带有领域相关的描述语言。
这些是一些经典的实际应用:
- 集成电路正式验证:将芯片设计与其规格模型编码为布尔公式,若公式可满足则找到导致输出差异的输入(即设计缺陷),若不可满足则证明两者功能等价。这是EDA工具中等价性检查的核心技术,用于发现CPU、GPU等芯片中的逻辑错误。
- 软件与系统验证:把“系统在有限步内进入错误状态(如死锁、缓冲区溢出)”转化为布尔公式。可满足时给出具体的错误执行路径,帮助开发者复现漏洞;不可满足则证明系统在该步数内安全。常用于飞机飞控、银行交易系统、操作系统驱动的正确性证明。
- 自动规划与调度:设定时间步长上限,用布尔变量表示各时刻的状态和动作,编码初始条件、目标状态与操作约束。若公式可满足,求解出的赋值直接对应一个有效操作序列。应用包括物流车辆路径规划、火星车任务调度、游戏AI步骤求解。
- 自动测试向量生成(ATPG):判断是否存在输入信号能检测芯片内部的固定故障(如某节点恒为0或1)。SAT求解器若返回可满足,该输入即为有效测试向量,可被自动测试设备用于筛选制造缺陷的芯片。
- 逻辑综合与优化:判断两个逻辑表达式是否等价,或某逻辑门是否冗余。通过构造SAT公式,若不可满足则说明移除该门不影响电路功能,从而实现芯片面积和功耗的优化。
- 组合设计与谜题求解:将数独、N皇后、图着色、扫雷等谜题的规则编码为布尔子句,交给SAT求解器。例如,数独中每个格子填数字的条件可表示为逻辑变量,求解器能在毫秒级解出最难的题目。
- 密码分析:将加密算法(如简化版AES、流密码)转换为布尔公式。但对完整强密码(如标准AES)通常因规模过大而不可行。
4. 项目源代码和参考文献
======================
在 github/ltaoist/QtSAT 可看到完整的包括图形用户界面程序和PicoSAT的源代码。如果你感兴趣,欢迎研究和使用。(水木禁止链接)
一些文献也在项目的README.md说明。
※ 修改:·darkk 于 Jun 16 15:28:56 2026 修改本文·[FROM: 120.239.34.*]
※ 来源:·水木社区
http://www.mysmth.net·[FROM: 120.239.34.*]
修改:darkk FROM 120.239.34.*
FROM 120.239.34.*