Python z3py:尝试使用集合成员身份时出现Segfault

Python z3py:尝试使用集合成员身份时出现Segfault,python,z3,z3py,Python,Z3,Z3py,在Z3Py中,我想表示一个(整数)变量的值必须在一组有效值中。在这种情况下,通常用于电子元件中的元件值 我可以用一堆Z3或子句(value==12 | | | value==15 | |…)来实现这一点,但这看起来非常丑陋和低效。每个组件都是我的系统得到大约80个约束来表达这一点。这无疑会使读取unsat错误消息变得困难 相反,当我尝试在Z3Py中使用Set类型时,它会因segfault而崩溃。下面的代码复制了这一点 这是使用集合的正确方法吗?还有其他干净的方法做同样的事情吗 进口z3 导入p

在Z3Py中,我想表示一个(整数)变量的值必须在一组有效值中。在这种情况下,通常用于电子元件中的元件值

我可以用一堆Z3或子句(
value==12 | | | value==15 | |…
)来实现这一点,但这看起来非常丑陋和低效。每个组件都是我的系统得到大约80个约束来表达这一点。这无疑会使读取unsat错误消息变得困难

相反,当我尝试在Z3Py中使用
Set
类型时,它会因segfault而崩溃。下面的代码复制了这一点

这是使用集合的正确方法吗?还有其他干净的方法做同样的事情吗


进口z3
导入pytest
e12_系列=(1.0,1.2,1.5,1.8,2.2,2.7,3.3,3.9,4.7,5.6,6.8,8.2,10.0)
def e_值(开始_十年=1,结束_十年=6,系列=e12_系列):
值=[]
对于范围内的十年(开始十年、结束十年):
值+=[int(v*10)*10**(十年-1)表示串联v]
返回值
def值_in(值,有效):
选项=[值==v表示v为有效]
返回z3.Or(选项)
#要测试的值
E12_有效=[
12018e3,
]
E12_无效=[
11919E3,
]
示例=[]
示例+=[(真,v)表示E12中的v\u有效]
示例+=[(错误,v)表示E12中的v\u无效]
@pytest.mark.parametrize('example',EXAMPLES)
def test_bruteforce(示例):
expect\u valid,value=示例
有效_值=e_值()
s=z3.Solver()
var=z3.IntVal(值)
s、 添加(值(var,有效值))
满意=str(s.check())=“sat”
断言已满足==预期有效,s
@pytest.mark.parametrize('example',EXAMPLES)
def测试套件(示例):
expect\u valid,value=示例
#创建一个集合
有效_值=e_值()
e12=z3.SetSort(z3.IntSort())
对于有效_值中的val:
z3.设置添加(e12,val)
s=z3.Solver()
var=z3.IntVal(值)
s、 添加(z3.IsMember(var,e12))
满意=str(s.check())=“sat”
断言已满足==预期有效,s
使用
pytest-v setmembers.py运行时,输出为:

platform linux -- Python 3.7.3, pytest-4.4.1, py-1.8.0, pluggy-0.9.0 -- /usr/bin/python
plugins: cov-2.6.1, hypothesis-4.17.0
collected 8 items                                                                                                                                                                                                                            

setmembers.py::test_bruteforce[example0] PASSED                                                                                                                                                                                        [ 12%]
setmembers.py::test_bruteforce[example1] PASSED                                                                                                                                                                                        [ 25%]
setmembers.py::test_bruteforce[example2] PASSED                                                                                                                                                                                        [ 37%]
setmembers.py::test_bruteforce[example3] PASSED                                                                                                                                                                                        [ 50%]
setmembers.py::test_set[example0] Segmentation fault (core dumped)

在Arch Linux上使用
python-z3 4.8.4-2
e12=z3.SetSort(z3.IntSort())
替换为
e12=z3.Const('e12',z3.SetSort(z3.IntSort())
;和
z3.SetAdd(e12,val)
以及
e12=z3.SetAdd(e12,val)
。这将消除分段错误。您的测试仍然失败,但至少可以让您进行进一步调试。将
e12=z3.SetSort(z3.IntSort())
替换为
e12=z3.Const('e12',z3.SetSort(z3.IntSort())
;和
z3.SetAdd(e12,val)
以及
e12=z3.SetAdd(e12,val)
。这将消除分段错误。您的测试仍然失败,但至少可以让您进一步调试。