Z3中带乘法的Horn子句

Z3中带乘法的Horn子句,z3,z3py,fixed-point-iteration,z3-fixedpoint,Z3,Z3py,Fixed Point Iteration,Z3 Fixedpoint,我刚刚开始深入研究Z3的定点解算器,并编写了一个示例,在使用乘法时挂起,但在将乘法定义为一系列加法时完成。由于我对Horn条款还不熟悉,这里可能有我不懂的东西。“本机”乘法如此缓慢,而定义为一系列加法的乘法在合理的时间范围内产生令人满意的结果,这有什么原因吗?谢谢 def test_mseq_hangs(): mul=函数('mul',IntSort(),IntSort(),IntSort(),BoolSort()) mc=函数('mc',IntSort(),IntSort(),BoolSort

我刚刚开始深入研究Z3的定点解算器,并编写了一个示例,在使用乘法时挂起,但在将乘法定义为一系列加法时完成。由于我对Horn条款还不熟悉,这里可能有我不懂的东西。“本机”乘法如此缓慢,而定义为一系列加法的乘法在合理的时间范围内产生令人满意的结果,这有什么原因吗?谢谢

def test_mseq_hangs():
mul=函数('mul',IntSort(),IntSort(),IntSort(),BoolSort())
mc=函数('mc',IntSort(),IntSort(),BoolSort())
n、 m,p=Ints('mnp')
fp=固定点()
fp.声明变量(n,m,p)
fp.寄存器关系(mc、mul)
fp.事实(mul(m,n,m*n))
fp.规则(mc(m,1),m1,mc(m-1,p),mul(m,p,n)])
断言fp.query(And(mc(m,n),n<1))==unsat
断言fp.query(And(mc(m,n),n<2))==sat
断言fp.query(和(mc(m,n),n>100))==sat
断言fp.query(mc(5120))==sat
断言fp.query(mc(5,24))==unsat
def测试_mseq():
mul=函数('mul',IntSort(),IntSort(),IntSort(),BoolSort())
add=函数('add',IntSort(),IntSort(),IntSort(),BoolSort())
neg=函数('neg',IntSort(),IntSort(),BoolSort())
mc=函数('mc',IntSort(),IntSort(),BoolSort())
n、 m,p,o=Ints('mnpo')
fp=固定点()
fp.声明变量(n,m,p,o)
fp.寄存器关系(mc、add、mul、neg)
fp.事实(添加(m,n,m+n))
fp.事实(负(m,-m))
fp.rule(mul(m,n,0),n==0)
fp.rule(mul(m,n,m),n==1)
fp.规则(mul(m,n,o),[n<0,mul(m,n,p),neg(p,o)])
fp.规则(mul(m,n,o),[n>1,mul(m,n-1,p),添加(m,p,o)])
fp.规则(mc(m,1),m1,mc(m-1,p),mul(m,p,n)])
断言fp.query(And(mc(m,n),n<1))==unsat
断言fp.query(And(mc(m,n),n<2))==sat
断言fp.query(和(mc(m,n),n>100))==sat
断言fp.query(mc(5120))==sat
断言fp.query(mc(5,24))==unsat

这并不奇怪,因为变量相乘会导致非线性运算,而重复加法会将其保留在线性片段中。非线性算法是不可判定的,而对于线性片段有有效的决策程序(如Presburger)

我不完全确定固定点引擎是如何在这里发挥作用的,但上述情况适用于一般查询;我猜同样的道理也适用

话虽如此,Z3确实有一个非线性算术解算器,称为
nlsat
。你可能想试试,尽管我不会屏住呼吸。请参见有关如何触发它的问题:


NB.我不确定是否可以通过Python从FixedPoint引擎使用
nlsat
引擎,因此您可能需要进行一些挖掘,以了解正确的咒语是什么,如果可以从开始使用。

如何使用(使用参数qflra:random_seed 2)指定检查sat在python中使用z3py时?我到处找都找不到。。。我只能找到与check-sat等价的,它只是solver.check()。