【发布时间】:2013-02-25 05:36:22
【问题描述】:
我想知道是否可以使用命名表达式来实现软约束,而无需显式使用手动“跟踪”变量。
- 在消息 Soft/Hard constraints in Z3 中,Leonardo 解释了如何使用辅助布尔值以手动方式实现软约束。
- 在以下消息中: z3 behaviour changing on request for 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 如何更详细地使用命名表达式的文档。 (我浏览了手册,但没有在任何地方看到它们的详细解释。)
【问题讨论】:
标签: z3