Z3 变量的初始值

Z3 变量的初始值,z3,z3py,Z3,Z3py,我想以一种有效的方式为z3py中的变量设置初始值 x,y=Ints(x,y) s=解算器() s、 添加(x>10) s、 检查() s、 模型() 我希望输出值是,例如,x=11,y=0,而不是结果x=11,y=7 一种方法是: x,y=Ints(x,y) s=优化() s、 添加_soft(x==0) s、 添加_soft(y==0) s、 添加(x>10) s、 检查() s、 模型() 但是,由于我的程序包含许多变量,因此需要花费大量的计算时间。有更好的方法吗?速度变慢是因为您正在强

我想以一种有效的方式为z3py中的变量设置初始值

x,y=Ints(x,y)
s=解算器()
s、 添加(x>10)
s、 检查()
s、 模型()
我希望输出值是,例如,x=11,y=0,而不是结果x=11,y=7

一种方法是:

x,y=Ints(x,y)
s=优化()
s、 添加_soft(x==0)
s、 添加_soft(y==0)
s、 添加(x>10)
s、 检查()
s、 模型()

但是,由于我的程序包含许多变量,因此需要花费大量的计算时间。有更好的方法吗?

速度变慢是因为您正在强制运行优化器,这是一种过分的做法。(优化解算器可以处理max sat问题,这在这里可以完成这项工作,但成本高昂,在这种情况下不需要。)

相反,只需浏览模型并查看是否有分配:

从z3导入*
def型号带零(s,vs):
m=s.模型()
结果=[]
对于vs中的v:
val=m.eval(v)
如果val.eq(v):
结果追加((v,0))
其他:
结果。追加((v,val))
返回结果
x、 y=整数('x y')
s=解算器()
s、 添加(x>10)
打印s.检查()
打印带有0的模型(s、[x,y])
这张照片是:

sat
[(x, 11), (y, 0)]
请注意,您必须显式地将解算器和感兴趣的变量传递给
model_with_zero
函数;因为这里的诀窍是精确地查看解算器未触及的变量

如果需要不同的初始值,则可以修改带有0的
model\u
,以分别说明每个变量的初始值