Boolean逻辑基础
设Boolean变量x1⋯xn⋯组成一个可数的无限字母集X={x1⋯xn⋯},这些变量取真值true或false,简记为1或0,同时这些变量可以通过析取∨,合取∧,否¬这些运算符号连接起来得到一个Boolean表达式。另外还有符号蕴含:⇒,x1⇒x2意味着¬x1∨x2,x1⇒x2并且x2⇒x1意味着x1⇔x2,即(¬x1∨x2)∧(¬x2∨x1)。对于Boolean变量x,x与¬x均称为文字。
一个赋值T是从Boolean变量的集合到真值集合{0,1}的一个映射,对于一个Boolean表达式ϕ,记X(ϕ)表示ϕ中Boolean变量的集合,如果X(ϕ)在T的定义域内,称赋值T适合ϕ。设赋值T适合ϕ,如果X(ϕ)中变量在T下的取值使得ϕ的真值为1,则称T满足ϕ,记为T|=ϕ,否则,称T不满足ϕ,记为T|≠ϕ。显然,根据Boolean变量真值的取值,Boolean表达式可以取0或1,如果存在适合ϕ的赋值T,有T|=ϕ,则称ϕ是可满足的,否则,称之为不可满足。
如果⋀ni=1ϕi,其中n≥1,且每个ϕi为一些文字的析取,则称ϕ为合取范式,称ϕi为分句,类似的,可以定义析取范式形式为⋁ni=1Di,其中n≥1,且每个Di为一些文字的合取,易证,每个Boolean表达式等价于一个合取范式,而且也等价于一个析取范式。
SAT问题与HORNSAT问题
SAT问题是一个NP完备问题,虽然我们目前没有找到SAT问题的确定的有效算法,但是有一类特殊的SAT问题是比较容易求解的,比如HORNSAT问题。如果一个分句至多有一个正的文字,如¬x1∨¬x2∨x3和x1∨¬x2,则称此分句为HORN分句,HORNSAT问题即设ϕ为HORN分句的合取,问ϕ是否为可满足的。
HORNSAT问题的算法非常简单,首先任意HORN分句都可以写成蕴含式,比如¬x1∨¬x2∨x3可以改写成(x1∧x2)⇒x3,x1∨¬x2可以改写为x2⇒x1。这种蕴含式只在左边为1,右边为0时取到false。HORNSAT问题的算法流程非常简单,令T为赋值为true的变量的集合,初始令T为空集,即所有的变量都取0,执行下列步骤直到所有蕴含式都被满足:
得到适合ϕ的赋值T之后,检查所有分句即可确定ϕ是否能被满足。
算法里有几个需要注意的点,首先对于蕴含式x⇒y,如果x与y都取0,这个蕴含式显然是取1的,但HORN分句不止这种类型,单个的x或¬x也是一种HORN分句,那此时让所有的变量都取0就不一定能让所有分句取1,所以算法中重复寻找不满足的蕴含式是有必要的。由于x⇒y只在x=1,y=0时取0,则对于(x1∧⋯∧xt)⇒y,若其为0,则必有x1=⋯=xt=1,y=0,接下来只需令y=1,即T←y即可把此蕴含式的值变为1,也就是在集合T中放入了一个新的元素。
由于变量的个数必为有限的,不妨设为n个,上面的算法至多会把n个元素放入T中,也就是算法最多重复执行n次,显然是多项式时间的。所以特殊的HORNSAT问题是有效可解的。
- 本文作者: sklois-gjx
- 本文链接: http://yoursite.com/2020/06/15/HORNSAT问题/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!