以下是非线性整数实数片段中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在这些问题上做得更好?