我在Windows 7以及Java 7 64位上使用Z3版本4.3.2的Java-API 64位。Z3:使用Java API簡化斷言
我試圖使用簡化來獲得有關我的斷言集合中冗餘信息的知識。
我的第一次嘗試是簡化布爾表達式和評估這樣
Expr e = ctx.mkImplies(ctx.mkBoolConst("A"),ctx.mkBoolConst("B")).simplify();
結果在我的例子
(=> A B)
(=> (not B) C)
(=> A B)
(=> B A)
(=> D E)
(=> B F)
(=> G D)
(=> H I)
(=> I (not D))
(=> (not D) I)
(=> C (not B))
C)
這導致簡化的公式
(and
(or (not A) B)
or B C)
or (not B) A)
(or (not D) E)
(or (not B) F)
(or (not G) D)
(or (not H) I)
(or (not I) (not D))
(or D I)
(or (not C) (not B))
C
)
我在爲了將它們簡化爲一個表達式,之前將這些含義包含在AND表達式中。
這個結果還不是我想要的。原始代碼第三行中的重複規則被取出(這很好)。 但是,如果C爲真(示例的最後一行),則B必須爲假((=> C (not B))
)。 如果B爲假,則A必須爲假((=> A B)
)。 等等...
我expexted什麼更像以下(我這樣做手工,因此轉換可能有誤差)
(and
(or (not A) B) ; transformed to (not A)
or B C) ; transformed to C
or (not B) A) ; deleted
(or (not D) E) ; left unchanged
(or (not B) F) ; deleted
(or (not G) D) ; left unchanged
(or (not H) I) ; left unchanged
(or (not I) (not D)) ; left unchanged
(or D I) ; left unchanged
(or (not C) (not B)) ; transformed to (not B)
C ; C
)
接下來,我嘗試使用的戰術像下面
Tactic simplifyTactic = ctx.mkTactic("ctx-solver-simplify");
Tactic smtTactic = ctx.mkTactic("smt");
Tactic then = ctx.then(simplifyTactic, smtTactic, new Tactic[] {});
Solver solver = ctx.mkSolver(then);
solver.add(bel2.toArray(new BoolExpr[0])); // bel2 is List<BoolExpr>
Status status = solver.check();
這樣做會導致模型而不是簡化。 此外,對於我來說,簡化策略是可行的,對我來說有點困難。 通常結果是未知的,原因「不完整」。
我上面描述的預期結果是否可以用Z3進行計算?如何做呢?
我環顧四周在這個論壇了,但我的觀點是不是真的回答...
只是要小心,似乎有當前是一個問題,CTX-求解器簡化,請參閱http: //z3.codeplex.com/workitem/95 –