2016-09-27 87 views
0

(SUBJ)Z3Py:两个向量的不平等

这是我尝试的约束:

#!/usr/bin/python 
from z3 import * 

s=Solver() 

veclen=3 

tmp_false=BoolVector ('tmp_false', veclen) 
for x in range(veclen): 
    s.add(tmp_false[x]==False) 

tmp=BoolVector ('tmp', veclen) 

s.add(tmp!=tmp_false) # not working 

# I want here tmp equals to anything except False,False,False 

print s.check() 
print s.model() 

我会用元组,但在运行时向量的长度设置。 我应该使用数组吗? 或Z3手册中描述的元组内的LISP-like cons-cells?

回答

2

BoolVector函数只是创建一个列表结构。 python列表上的!=运算符不会创建表达式。它只是评估为“真实”。所以你不是真的发表一个表达Z3。要创建元组表达式,您可以使用代数数据类型。记录类型是代数数据类型的特例,Z3可以理解如何推理这些类型。 因此,例如,您可以编写:

from z3 import * 

s=Solver() 

Bv = Datatype("record") 
Bv.declare('mk', ('1', BoolSort()), ('2', BoolSort()), ('3', BoolSort())) 
Bv = Bv.create() 

tmp_false = Bv.mk(False, False, False) 
tmp = Const('tmp', Bv) 

print tmp != tmp_false 
s.add(tmp!=tmp_false) 

# I want here tmp equals to anything except False,False,False 

print s.check() 
print s.model()