Z3python机型比较
Z3 python model compareson
拥有一组公式并使用 z3py 创建两个模型 old_model = solver.model()
和 new_model
。如何获得在两个模型中具有不同分配的变量名称列表?
需要一个考虑公式集中所有自由变量的通用解决方案。如果可能,在某些情况下,变量由 var = Int('varname')
m 定义并且仅在公式 ForAll(var, ...)
中使用,在开始比较模型时不需要考虑该变量 var
。
想法是在调试期间使用比较,看看是否存在定义模型之间差异的意外变量,或者变量不应出现在模型中。
不清楚你在问什么;但是当 z3 给你一个模型时,它只是一个将变量映射到它们的值的字典。您可以在 Python:
中轻松保留它们
from z3 import *
s = Solver()
x, y, z = Ints('x y z')
s.add(x + y > 5)
s.add(ForAll([z], z > z-1))
s.check()
m = s.model()
print m
# get the variables:
for v in m:
print v
这会打印:
[y = 0, x = 6]
y
x
如您所见,y
和 x
存在,而 z
不存在;如你所愿,我想。如果您有多个模型,您可以简单地分别查询它们并寻找差异并进行您希望的任何编程。这是您要找的吗?
拥有一组公式并使用 z3py 创建两个模型 old_model = solver.model()
和 new_model
。如何获得在两个模型中具有不同分配的变量名称列表?
需要一个考虑公式集中所有自由变量的通用解决方案。如果可能,在某些情况下,变量由 var = Int('varname')
m 定义并且仅在公式 ForAll(var, ...)
中使用,在开始比较模型时不需要考虑该变量 var
。
想法是在调试期间使用比较,看看是否存在定义模型之间差异的意外变量,或者变量不应出现在模型中。
不清楚你在问什么;但是当 z3 给你一个模型时,它只是一个将变量映射到它们的值的字典。您可以在 Python:
中轻松保留它们from z3 import *
s = Solver()
x, y, z = Ints('x y z')
s.add(x + y > 5)
s.add(ForAll([z], z > z-1))
s.check()
m = s.model()
print m
# get the variables:
for v in m:
print v
这会打印:
[y = 0, x = 6]
y
x
如您所见,y
和 x
存在,而 z
不存在;如你所愿,我想。如果您有多个模型,您可以简单地分别查询它们并寻找差异并进行您希望的任何编程。这是您要找的吗?