将 Unrestricted SAT (USAT) 减少为 3-SAT
Reducing Unrestricted SAT (USAT) into 3-SAT
我通过将每个子句 l1 ∨ ⋯ ∨ ln 转换为 n − 2 个子句的合取来简单地知道过程。
我尝试用 Z3 显示满足原始公式和最终公式的值,以表明它们与 SMT 文件一样可满足。
为了澄清,你能举出关于这个过程的任何例子吗?谢谢。
通过询问求解器是否存在可以区分 两个公式的赋值来完成等价性检查。如果没有这样的赋值,那么您可以得出结论,公式是等价的,或者在 SAT 上下文中,等价可满足。
这是一个简单的例子:
from z3 import *
a, b, c = Bools('a b c')
fml1 = Or(And(a, b), And(a, c))
fml2 = And(a, Or(b, c))
s = Solver()
s.add(Distinct(fml1, fml2))
print(s.check())
现在如果 fml1
是一个任意的 SAT 公式,而 fml2
是一个 3-SAT 转换版本(我不是说上面是 SAT 和 3-SAT 转换,而是替换你的算法的结果在这里),那么我们预计 SAT 求解器无法区分它们,即公式 Distinct(fml1, fml2)
将无法满足。事实上,我们得到:
unsat
确定它们是相同的。
如果您只使用 SMTLib,则要使用的模板是:
(declare-fun a () Bool)
(declare-fun b () Bool)
(declare-fun c () Bool)
(assert (distinct (or (and a b) (and a c))
(and a (or b c))))
(check-sat)
我通过将每个子句 l1 ∨ ⋯ ∨ ln 转换为 n − 2 个子句的合取来简单地知道过程。
我尝试用 Z3 显示满足原始公式和最终公式的值,以表明它们与 SMT 文件一样可满足。
为了澄清,你能举出关于这个过程的任何例子吗?谢谢。
通过询问求解器是否存在可以区分 两个公式的赋值来完成等价性检查。如果没有这样的赋值,那么您可以得出结论,公式是等价的,或者在 SAT 上下文中,等价可满足。
这是一个简单的例子:
from z3 import *
a, b, c = Bools('a b c')
fml1 = Or(And(a, b), And(a, c))
fml2 = And(a, Or(b, c))
s = Solver()
s.add(Distinct(fml1, fml2))
print(s.check())
现在如果 fml1
是一个任意的 SAT 公式,而 fml2
是一个 3-SAT 转换版本(我不是说上面是 SAT 和 3-SAT 转换,而是替换你的算法的结果在这里),那么我们预计 SAT 求解器无法区分它们,即公式 Distinct(fml1, fml2)
将无法满足。事实上,我们得到:
unsat
确定它们是相同的。
如果您只使用 SMTLib,则要使用的模板是:
(declare-fun a () Bool)
(declare-fun b () Bool)
(declare-fun c () Bool)
(assert (distinct (or (and a b) (and a c))
(and a (or b c))))
(check-sat)