z3py对可存在的数字的强制约束

时间:2015-05-28 19:28:33

标签: z3 exists smt z3py

我是z3 / z3py的新手。

我的目标:

假设我有一个大小为5的IntVector。我有5个存在(...)表达式,并希望在相应位置的IntVector中存储express expressiosn是真还是假为1和0。最后,我想将Sum(IntVector)的约束设置为一个数字,表示必须有多个Exists表达式为true,其余为false。我不关心Exists表达式是否可以满足,我唯一期望的是是否存在一定数量的Exists表达式。

我的问题:

我只是使用一个求解器并将所有上述假设添加到其中以检查可满足性。上述实现需要很长时间才能返回" unknown"。但是如果我只检查其中一个存在表达式而不添加真实存在表达式数量的约束,我会在短时间内得到满足或不满足。如果我一起检查所有存在表达式而不添加真实存在表达式数量的约束,我将得到不满(因为一些存在表达式本质上不饱和)。 我觉得战术和子目标可以解决我的问题。但我还没有足够的知识。

我希望我的上述问题有道理。谁能在这里给我一些指示?

1 个答案:

答案 0 :(得分:2)

也许您可以将其视为最大问题。 我最近为Z3添加了优化功能,允许您设置软约束。 此外,求解存在的满足性(x1,Fml(x1))等于求解 Fml(x1)的可满足性,其中x1是自由常数。所以听起来像存在主义的封闭是一种矫枉过正。

示例:

 (define-fun f1 ((x Int)) Bool < definition of formula f1 >)
 (define-fun f2 ((x Int)) Bool < definition of formula f2 >)
 (define-fun f3 ((x Int)) Bool < definition of formula f3 >)
 (declare-const x1 Int)
 (declare-const x2 Int)
 (declare-const x3 Int)

 (assert-soft (f1 x1))
 (assert-soft (f2 x2))
 (assert-soft (f3 x3))

 (check-sat)

结果将最大化满足的软约束的数量。 部分输出是违反软约束的数量。