调整Z3中的“简化”策略

时间:2013-04-08 10:22:33

标签: z3

我有几个关于Z3战术的问题,其中大多数都关注simplify

  1. 我注意到应用simplify后的线性不等式经常被否定。 例如,(> x y)simplify转换为(not (<= x y))。理想情况下,我希望整数[in]等式不被否定,以便(not (<= x y))转换为(<= y x)。我可以确保这样的行为吗?

  2. 此外,在&lt;,&lt; =,&gt;,&gt; =中,希望在简化公式中的所有整数谓词中只使用一种类型的不等式,例如&lt; = 。可以这样做吗?

  3. :som的{​​{1}}参数有什么作用?我可以看到描述它用于将多项式用于单项式单调形式的描述,但也许我说得不对。您能否举一个简化行为的示例,simplify设置为true和false?

  4. 我是否正确,在应用:som算术表达式后,始终会以simplify形式表示,其中a1*t1+...+an*tn是常量,ai是不同的术语(变量,未解释的常量或函数符号)?特别是总是在结果中没有出现减法运算的情况?

  5. 是否有ti战术的可用描述?从表面上看,我知道这是一个昂贵的算法,因为它使用了求解器,但是了解更多有关底层算法的信息会很有趣,这样我就可以了解有多少求解器调用,等等。也许你可以给一个参考论文或给出算法的简要草图?

  6. 最后,here提到了如何在Z3代码库中编写策略的教程可能会出现。还有吗?

  7. 谢谢。

1 个答案:

答案 0 :(得分:4)

以下是试图回答问题1-4的示例(带注释)。它也可以在线here获得。

(declare-const x Int)
(declare-const y Int)

;; 1. and 2.
;; The simplifier will map strict inequalities (<, >) into non-strict ones (>=, <=)
;; Example:   x < y  ===>  not x >= y
;; As suggested by you, for integer inequalities, we can also use
;;            x < y ==>   x <= y - 1
;; This choice was made because it is convenient for solvers implemented in Z3
;; Other normal forms can be used.
;; It is possible to map everything to a single inequality. This is a straightforward modificiation
;; in the Z3 simplifier. The relevant files are src/ast/rewriter/arith_rewriter.* and src/ast/rewriter/poly_rewriter.*
(simplify (<= x y))
(simplify (< x y))
(simplify (>= x y))
(simplify (> x y))

;; 3.
;; :som stands for sum-of-monomials. It is a normal form for polynomials. 
;; It is essentially a big sum of products.
;; The simplifier applies distributivity to put a polynomial into this form.
(simplify (<= (* (+ y 2) (+ x 2)) (+ (* y y) 2)))
(simplify (<= (* (+ y 2) (+ x 2)) (+ (* y y) 2)) :som true)

;; Another relevant option is :arith-lhs. It will move all non-constant monomials to the left-hand-side.
(simplify (<= (* (+ y 2) (+ x 2)) (+ (* y y) 2)) :som true :arith-lhs true)

;; 4. Yes, you are correct.
;; The polynomials are encoded using just * and +.
(simplify (- x y))

5)ctx-solver-simplified在src / smt / tactic / ctx-solver-simplified文件中实现。* 代码非常易读。我们可以添加跟踪消息,以查看它在特定示例中的工作原理。

6)还没有关于如何编写战术的教程。但是,代码库有很多例子。 目录src/tactic/core具有基本目录。