我有两个不同的集合,例如{e1,e2,e3}类型的E1和{g1,g2,g3}类型的E2,其定义如下:
E1 = DeclareSort('E1')
e1,e2,e3 = Consts('e1 e2 e3', E1)
E2 = DeclareSort('E2')
g1,g2,g3 = Consts('g1 g2 g3', E2)
我的问题是如何让Z3在两组之间给我一个笛卡尔积。我需要如下结果: {(e1,g1),(e1,g2),(e1,g3),(e2,g1),(e2,g2),(e2,g3),(e3,g1),(e3,g2),( e3,g3)}。
任何人都可以提供帮助? 谢谢
答案 0 :(得分:1)
注意,e1,e2,e3,g1,g2,g3是变量。根据定义,它们没有区别。因此,断言e1 == e2是可以满足的。 您可以通常的方式在Python中创建产品:
[(x,y) for x in [e1,e2,e3] for y in [g1,g2,g3]]
如果要创建两种产品,可以使用代数数据类型。 声明数据类型“Tuple”
>>> Tuple = Datatype('Tuple')
>>> Tuple.declare('mk_tuple', (('first', E1), ('second', E2)))
>>> Tuple = CreateDatatypes(Tuple)[0]
>>> Tuple.mk_tuple(e1, g1)
mk_tuple(e1, g1)
答案 1 :(得分:0)
也许您正在寻找itertools.product()
?
>>> import itertools
>>> for x in itertools.product(['e1', 'e2', 'e3'], ['g1', 'g2', 'g3']):
... print(x)
...
('e1', 'g1')
('e1', 'g2')
('e1', 'g3')
('e2', 'g1')
('e2', 'g2')
('e2', 'g3')
('e3', 'g1')
('e3', 'g2')
('e3', 'g3')
>>>