软约束是析取吗?

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-satunsat 那么 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 的值不固定,它将被视为任何其他布尔值。