我在 .dimacs/.cnf 文件中有一个公式,如下所示:
p cnf 6 9
1 0
-2 1 0
-1 2 0
-5 1 0
-6 1 0
-3 2 0
-4 2 0
-3 -4 0
3 4 -2 0
是否可以在 SAT4j 中仅提取那些包含变量 2、3 和 4 的子句?然后,我只需要检查这组新子句的一致性,即:
p cnf 4 6
-2 1 0
-1 2 0
-3 2 0
-4 2 0
-3 -4 0
3 4 -2 0
我尝试使用 Assumptions,我尝试使用 Constraints,但我仍然找不到这样做的方法。
谢谢你的任何建议。
编辑
我认为有一种类似的方法solver.addClause(clause)
,但反过来solver.getClause(clause)
......虽然,我正在为求解器提供 .cnf 文件中的子句。
编辑 2
首先,假设与子句具有相同的语法,
val assumption: IVecInt = new VecInt(Array(1, 2))
val clause: IVecInt = new VecInt(Array(1, 2))
但变量conjunctions
在假设和disjunctions
子句中。这是一个区别。正确的?我的测试示例是这样说的。(我只需要获得额外的批准)。
其次,我使用选择器变量的问题是:
一个简单的公式a V b
有三个模型:
(a, b),
(a, -b),
(-a, b)
当我添加一个选择器变量时,例如 ,s
并且它的假设是-s
,那么我有相同数量的模型,即 3 个模型:
(a, b, -s),
(a, -b, -s),
(-a, b, -s)
当假设为true
时,即 ,s
那么我有 4 个模型,而不是我想要的 0:
(a, b, s),
(a, -b, s),
(-a, b, s),
(-a, -b, s)
当然是什么时候s = T
,那么(s V a V b) = (T V a V b) = T
,但这是对子句的一种删除方式(a V b)
吗?我需要的是模型的数量,真实的模型!有没有办法在以某种方式“删除”我们希望通过假设排除的这些变量(即a
和)时找到确切的模型?b
对于这种情况,这是我当前在 Scala 中的代码:
object Example_01 {
val solver: ISolver = new ModelIterator(SolverFactory.newDefault())
val reader: DimacsReader = new DimacsReader(solver)
val problem: IProblem = reader.parseInstance("example_01.cnf")
def main(args: Array[String]): Unit = {
var nrModels: Int = 0
val assumptions: IVecInt = new VecInt(Array(10))
try {
while(solver.isSatisfiable(assumptions)) {
println(reader.decode(problem.model()))
nrModels += 1
}
} catch {
case e: ContradictionException => println("UnSAT: ", e)
}
println("The number of models is: " + nrModels)
}
感谢您的任何帮助。