Z3 软约束是析取吗?
在Z3中,可以通过将实际约束Z3 软约束是析取吗?,z3,Z3,在Z3中,可以通过将实际约束p放置在其左侧为新布尔变量的蕴涵的右侧来实现,例如assert(=>b1p)。然后,可根据检查sat通过列出被视为正确的bs来“打开”约束,例如(检查sat b1) 问题:如果其保护变量b未包含在检查sat中,则此类约束p会发生什么情况?我假设Z3将b的值视为未知值,然后在implication/overb的值上分支-正确吗 背景:我问题的背景是我在增量模式下使用Z3(push/pop块),并且我通过(push)(assert(not p))(check sat)(p
p
放置在其左侧为新布尔变量的蕴涵的右侧来实现,例如assert(=>b1p)
。然后,可根据检查sat
通过列出被视为正确的b
s来“打开”约束,例如(检查sat b1)
问题:如果其保护变量b
未包含在检查sat中,则此类约束p
会发生什么情况?我假设Z3将b
的值视为未知值,然后在implication/overb
的值上分支-正确吗
背景:我问题的背景是我在增量模式下使用Z3(push
/pop
块),并且我通过(push)(assert(not p))(check sat)(pop)检查断言p
;如果检查sat
为unsat
,则P
保持不变。
我考虑改用软约束,即用(声明常量b_I Int)(断言(=>b_I P))(检查sat b_I)替换每个这样的push
/pop
块。每个b_i
只能使用一次。然而,如果Z3可能会在所有以前的b_j
上分支,那么听起来似乎可能会让Z3慢一点——因此我的问题是
(注:我知道,这意味着软约束也可能会降低性能,因为某些优化可能不适用。)是的,如果b1
的值不固定,它将与任何其他布尔值一样处理