我想知道是否可以使用命名表达式来实现软约束,而无需显式使用手动“跟踪”变量。
- 在Z3 中的软/硬约束消息中,Leonardo 解释了如何使用辅助布尔值以手动方式实现软约束。
- 在以下消息中: z3 行为根据 unsat core 的请求而改变,Leonardo 说命名表达式本质上被视为模型查找目的的含义。
使用上面第一条消息中描述的手动跟踪是相当麻烦的,因为它需要多次调用求解器(事实上2^n
,在最坏的情况下可能需要调用才能在我们有n
软约束时满足最大可能的软约束集)。是否有可能将这两个想法结合起来让 Z3 以更简单的方式实现软约束?基于这两条消息的想法,我天真地尝试了以下方法:
(set-option :produce-models true)
(set-option :produce-unsat-cores true)
(assert (! false :named absurd))
(check-sat)
我希望 z3 会告诉我sat
,因为参加模特absurd
会false
满足这个人为的例子;但它unsat
反而产生了;这是合理的,但没有那么有用..
我将不胜感激您可能提供的任何见解;或者向我指出一些关于 z3 如何更详细地使用命名表达式的文档。(我浏览了手册,但没有在任何地方看到它们的详细解释。)