软约束是析取吗?
Are soft constraints disjunctions?
在 Z3 中,soft constraints 可以通过将实际约束 P
放在一个蕴涵的右侧来实现,该蕴涵的左侧是一个新的布尔变量,例如assert (=> b1 P)
。然后可以通过列出 b
来将约束 "switched on" per check-sat
视为真实的,例如(check-sat b1)
.
问题: 如果它们的保护变量 b
不 包含在这些约束 P
中会发生什么一个check-sat
?我假设 Z3 将 b
的值视为未知,然后分支到 implication/over b
的值 - 正确吗?
背景: 我问题的背景是我在增量模式下使用 Z3(push
/pop
块),并且我检查断言P
来自 (push)(assert (not P))(check-sat)(pop)
;如果 check-sat
是 unsat
那么 P
成立。
我考虑过使用软约束,即用 (declare-const b_i Int)(assert (=> b_i P))(check-sat b_i)
替换每个这样的 push
/pop
块。每个 b_i
只能使用一次。但是,如果 Z3 可能分支到所有以前的 b_j
,那么听起来好像这可能会大大减慢 Z3 - 因此我的问题。
(P.S.: 我知道 this answer by Leo,它说软约束也可能会降低性能,因为某些优化可能不适用。)
是的,如果 b1
的值不固定,它将被视为任何其他布尔值。
在 Z3 中,soft constraints 可以通过将实际约束 P
放在一个蕴涵的右侧来实现,该蕴涵的左侧是一个新的布尔变量,例如assert (=> b1 P)
。然后可以通过列出 b
来将约束 "switched on" per check-sat
视为真实的,例如(check-sat b1)
.
问题: 如果它们的保护变量 b
不 包含在这些约束 P
中会发生什么一个check-sat
?我假设 Z3 将 b
的值视为未知,然后分支到 implication/over b
的值 - 正确吗?
背景: 我问题的背景是我在增量模式下使用 Z3(push
/pop
块),并且我检查断言P
来自 (push)(assert (not P))(check-sat)(pop)
;如果 check-sat
是 unsat
那么 P
成立。
我考虑过使用软约束,即用 (declare-const b_i Int)(assert (=> b_i P))(check-sat b_i)
替换每个这样的 push
/pop
块。每个 b_i
只能使用一次。但是,如果 Z3 可能分支到所有以前的 b_j
,那么听起来好像这可能会大大减慢 Z3 - 因此我的问题。
(P.S.: 我知道 this answer by Leo,它说软约束也可能会降低性能,因为某些优化可能不适用。)
是的,如果 b1
的值不固定,它将被视为任何其他布尔值。