我正在阅读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是假的。
答案 0 :(得分:1)
在assert-soft
来电中,如果您选择不满足该目标,则权重是您愿意累积的“惩罚”值。因此,在此分配中,Z3选择a
和c
作为true
,因此满足第一个和第三个assert-soft
约束,因此不会对它们造成任何惩罚。这意味着A |-> 0
,因为该组中的所有软约束都得到满足。
当然,要解决问题sat
,选择a
和c
为true
需要b
为false
,并且因此,您对该失败的约束组产生2
的惩罚。
请注意,z3必须满足所有常规assert
约束。除此之外,它试图尽可能满足assert-soft
约束中的“许多”,从而最大限度地减少那些不满意的人所受的惩罚。
此paper对Z3的优化功能有很好的描述。