Z3中的笛卡尔积

Z3中的笛卡尔积,z3,z3py,Z3,Z3py,我有两个不同的集合,例如{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),(

我有两个不同的集合,例如{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)}

有人能帮忙吗?
谢谢

请注意,e1、e2、e3、g1、g2、g3都是变量。它们在定义上没有区别。因此,断言e1==e2是可满足的。 您可以按照通常的方式在Python中创建产品:

 [(x,y) for x in [e1,e2,e3] for y in [g1,g2,g3]]
如果要创建两种类型的乘积,可以使用代数数据类型。 声明一个数据类型“Tuple”

也许你在找什么


对不起,是我的错。e1、e2、e3、g1、g2、g3是不同的。e1的{e1,e2,e3}类型和e2的{g1,g2,g3}类型。谢谢Nikolaj,但在这种情况下,我需要手动分配所有元组。如第二个答案所示,z3能否与itertools.product()剂量相同?
>>> Tuple = Datatype('Tuple')
>>> Tuple.declare('mk_tuple', (('first', E1), ('second', E2)))
>>> Tuple = CreateDatatypes(Tuple)[0]
>>> Tuple.mk_tuple(e1, g1)
mk_tuple(e1, g1)
>>> 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')
>>>