【发布时间】:2014-03-09 05:26:58
【问题描述】:
我在 Windows 7 和 Java 7 64 位上使用 Z3 版本 4.3.2 64 位的 Java-API,但我认为 Java 不是回答这个问题的必要条件。
现在我正在使用以下 Java 代码来简化我在 Z3 中的断言子集:
Tactic simplifyTactic = ctx.mkTactic("ctx-solver-simplify");
Goal goal = ctx.mkGoal(true, false, false);
goal.add(bel.toArray(new BoolExpr[0])); // bel is List<BoolExpr>
ApplyResult applyResult = simplifyTactic.apply(goal);
到目前为止,我已经过滤了要简化的断言,然后使用上面的代码对其进行简化,这符合预期。
经过一些测试,我得出的结论是,我还需要插入模型的过滤断言(其中包含一些元信息,如基数)。
是否可以简化一些断言集 A,而另一组断言 B 仍然被考虑但不改变?
下面的例子可以稍微澄清一下这个问题:
(declare-const a Bool)
(declare-const b Bool)
(declare-const c Bool)
(declare-const d Bool)
(assert (=> a c)); member of set A
(assert (=> b d)); member of set A
(assert a); member of set A
; member of set B
(assert
(<=
(+ (ite (= c true) 1 0) (ite (= d true) 1 0))
1
)
)
; member of set B
(assert
(>=
(+ (ite (= c true) 1 0) (ite (= d true) 1 0))
1
)
)
(apply ctx-solver-simplify)
如果这个 SMT-LIB V2 代码被 Z3 执行,结果是:
(goals
(goal
c
(not b)
a
(<= (+ (ite (= c true) 1 0) (ite (= d true) 1 0)) 1)
:precision precise :depth 1
)
)
对于这个简单的例子,结果还不错。约束(前三个断言(我的集合 A))已按预期进行了简化。以下两个断言(带有我的基数信息(集 B))也已被简化。现在,我希望 Z3 做的是进行简化,但不混合集合 A 和 B 的结果。鉴于更复杂的断言,这将会发生(并且在我的情况下发生了)。
这是怎么做到的?
【问题讨论】:
-
您能否添加一个断言 A 和 B 集的最小示例?我用其他策略(例如,量词消除)做了类似的事情,拥有 A 和 B 将帮助我看看我所做的是否可行。
-
我添加了一个简单的例子。希望这会有所帮助。