哪些技术用于处理z3中的非线性整数实数问题?

时间:2014-01-21 01:21:10

标签: z3 smt

以下是非线性整数实数片段中problem的z3统计信息(我的许多问题与此类似):

 (:add-rows            11062574
  :added-eqs           34
  :arith-conflicts     37293
  :assert-lower        837747
  :assert-upper        1909779
  :binary-propagations 13807730
  :bound-prop          32666
  :conflicts           47631
  :decisions           157457
  :del-clause          32828
  :final-checks        39307
  :gcd-tests           329820
  :gomory-cuts         927
  :ineq-splits         19490
  :memory              39.52
  :minimized-lits      93912
  :mk-clause           73468
  :pivots              768193
  :propagations        15992318
  :pseudo-nonlinear    254856
  :restarts            41
  :time                151.65
  :total-time          151.68)

由于问题是非线性的,我认为Simplex技术并没有直接用于解决这个问题(虽然我在输出中看到了一些类似Simplex的统计信息)。基于earlier响应,我理解存在整数时的非线性Real技术基于Grobner基,并且相关函数在theory_arith*中。是否有一篇论文/一些文档,我可以找到有关z3中为此片段实现的技术的具体信息?

此外,尽管问题是非线性的,但非线性的唯一发生涉及两个变量的乘法(并且有一些这样的表达式),并且其中一个变量只能采用作为幂的值两个并由一些简单约束绑定/定义:

(const1 <=  |a| < const2) => (var-a = const1)

其中const1和const2是2的连续正幂。因此,var-a代表两个小于或等于| a |的最大幂。这些变量被声明为Real类型。 特别好奇,因为我在统计数据输出中看到一个术语pseudo-nonlinear。约束是否在内部以某种方式线性化?另外,有没有更好的方法来编码这些约束,以便z3在这些问题上做得更好?