Minisat的基本使用方法
minisat安装和基本知识
SAT问题即布尔可满足性问题,是确定给定逻辑电路是否具有其输入的赋值使输出正确的决策问题。换句话说,它询问给定布尔电路的输入是否可以设置为1或0,以使该电路输出1。在这种情况下,该电路称为“可满足的”。否则,电路称为“不满足”。
MiniSat是一种简约的开源SAT解算器,旨在帮助研究人员和开发人员开始使用SAT,目前在许多项目中使用。在此页面上minisat,您将找到与MiniSat相关的二进制文件,源代码,文档和项目,包括伪布尔求解器MiniSat +和CNF最小化器/预处理器SatELite。
Linux下安装方法sudo apt install minisat
,命令行键入minisat
,出现以下界面即为安装成功
命令行键入minisat --help
查看minisat的基本使用方法:
使用:minisat [指令选项] 输入文件名 输出文件名
指令选项:minisat --help 下面给出的一大串都是,目前我也没用过
输入文件:输入文件必须是特殊的CNF格式
文件,最好是以.cnf
结尾,当然不以.cnf
结尾也没关系(亲测有效),但是文件内容必须是特定的CNF格式编码
。
输出文件:任意文本文件。
minisat使用示例
例子:
- 布尔变量:tie,shirt
- 符号:非“~”,与“▲”,或“▼”
- 子句(clause):
clause1:讲员演讲时不能不穿衬衫,只打一个领带;~tie ▼ shirt
clause2:讲员既不穿衬衫,也不打领带是不礼貌的;tie ▼ shirt
clause3:讲员既穿衬衫,又打领带自己不舒服。~tie ▼ ~shirt - 问题:能找到一种满足上述的约束吗?
(~tie ▼ shirt)▲(tie ▼ shirt)▲(~tie ▼ ~shirt)
和之积形式,直观上可以看成一个数字电路
解答:
此时我们可以将该问题编写成CNF格式编码:
line1:p指的是project(我猜的),cnf指的是cnf编码,2指的是有两个变量,3指的是有三个约束子句。
line2:
line3、line4、line5:负号代表该变量取反,无符号代表该变量取原变量,以0结尾
3、4、5行是这么理解:(-1 或 2)与(1 或 2)与(-1 或 -2),寻找满足该约束条件的一组解,接下来使用minisat求解:
结果是可满足的,则查看输出文件result.log,
也就是说该问题的解是,不打领带,穿衬衫。
接下来,我们可以为该问题进一步添加约束,将刚生成的解编程约束添加进子句:
再次得到的结果是不满足的,因此该问题只有一个解