加权MaxSMT Z3

时间:2017-06-26 17:18:12

标签: z3

我正在阅读Z3(目标函数)教程并遇到以下示例:

(declare-const a Bool)
(declare-const b Bool)
(declare-const c Bool)
(assert-soft a :weight 1 :id A)
(assert-soft b :weight 2 :id B)
(assert-soft c :weight 3 :id A)
(assert (= a c))
(assert (not (and a b)))
(check-sat)
(get-model)

我不理解Z3的输出:

A |-> 0 
   B |-> 2 
   sat 
   (model (define-fun c () Bool true) 
   (define-fun b () Bool false) 
   (define-fun a () Bool true) )

我的理解是Weighted MaxSMT试图最大化布尔表达式的加权和。因此,我们应该得到A | - > 4和B | - > 0因为a和c都是真而b是假的。

1 个答案:

答案 0 :(得分:1)

assert-soft来电中,如果您选择不满足该目标,则权重是您愿意累积的“惩罚”值。因此,在此分配中,Z3选择ac作为true,因此满足第一个和第三个assert-soft约束,因此不会对它们造成任何惩罚。这意味着A |-> 0,因为该组中的所有软约束都得到满足。

当然,要解决问题sat,选择actrue需要bfalse,并且因此,您对该失败的约束组产生2的惩罚。

请注意,z3必须满足所有常规assert约束。除此之外,它试图尽可能满足assert-soft约束中的“许多”,从而最大限度地减少那些不满意的人所受的惩罚。

paper对Z3的优化功能有很好的描述。