我有几个关于Z3战术的问题,其中大多数都关注simplify
。
我注意到应用simplify
后的线性不等式经常被否定。
例如,(> x y)
由simplify
转换为(not (<= x y))
。理想情况下,我希望整数[in]等式不被否定,以便(not (<= x y))
转换为(<= y x)
。我可以确保这样的行为吗?
此外,在&lt;,&lt; =,&gt;,&gt; =中,希望在简化公式中的所有整数谓词中只使用一种类型的不等式,例如&lt; = 。可以这样做吗?
:som
的{{1}}参数有什么作用?我可以看到描述它用于将多项式用于单项式单调形式的描述,但也许我说得不对。您能否举一个简化行为的示例,simplify
设置为true和false?
我是否正确,在应用:som
算术表达式后,始终会以simplify
形式表示,其中a1*t1+...+an*tn
是常量,ai
是不同的术语(变量,未解释的常量或函数符号)?特别是总是在结果中没有出现减法运算的情况?
是否有ti
战术的可用描述?从表面上看,我知道这是一个昂贵的算法,因为它使用了求解器,但是了解更多有关底层算法的信息会很有趣,这样我就可以了解有多少求解器调用,等等。也许你可以给一个参考论文或给出算法的简要草图?
最后,here提到了如何在Z3代码库中编写策略的教程可能会出现。还有吗?
谢谢。
答案 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
具有基本目录。