在Z3中,soft constraints可以通过将实际约束P
放在暗示的右侧来实现,该暗示的左侧是新的布尔变量,例如, assert (=> b1 P)
。然后,可以通过列出被认为是真的check-sat
来b
“开启”约束,例如, (check-sat b1)
。
问题:如果这些约束P
的保护变量b
包含在check-sat
中,会发生什么?我假设Z3将b
的值视为未知,然后在隐含/超过b
的值上分支 - 这是正确的吗?
后台:我的问题的背景是我在增量模式下使用Z3(push
/ pop
块),并检查断言P
(push)(assert (not P))(check-sat)(pop)
;如果check-sat
为unsat
,则P
成立。
我考虑过使用软约束,即用push
替换每个pop
/ (declare-const b_i Int)(assert (=> b_i P))(check-sat b_i)
块。每个b_i
只能使用一次。但是,如果Z3可以覆盖所有先前的b_j
,那么听起来好像这可能会使Z3相当缓慢 - 因此我的问题。
(P.S。:我知道this answer by Leo,它说软约束也可能会降低性能,因为某些优化可能不适用。)
答案 0 :(得分:0)
是的,如果b1
的值不固定,它将被视为与任何其他布尔值一样。