2
当使用MiniSat作为C++库时,每个新变量都可以创建为决策变量或非决策变量。MiniSat中的非决策变量的语义是什么?
我对此的粗略理解是,当解算器决定在分支期间使用下一个变量时,不考虑非决策变量。然而,在我的项目中,当非决策变量位于蕴含的左侧时,我遇到了麻烦,而不是等价关系,因为求解器返回了SAT,即使公式实际上是UNSAT。
进一步的实验表明,只有当非决策变量在一个长于2个变量的公式中时才会出现这种情况(我认为2变量公式路径是解算器中的一种特殊情况,因此它的行为有所不同) 。
这对于CNF的可满足性意味着什么?即将所有变量标记为决策变量,我可以说CNF是SAT,如果每个子句至少有一个文字评估为真。我的简短实验表明,对于具有非决策变量的CNF,CNF被报告为SAT,如果每个决策变量被设置为true或false,并且每个子句都具有评估为true的文字,或者undef。真的吗? – Xarn
如果所有决策变量都已成功赋值,Minisat会报告SAT。它不关心其他事情。如果Minisat无法为所有决策变量分配值,则报告UNSAT,因为单位规则的应用在变量耗尽之前总是产生冲突。通过冲突我的意思是说,一个变量需要既是真实的又是假的,以满足由于当前任务而失去单位的条款。 –