Z3py中的数组和数据类型

时间:2013-05-16 06:06:37

标签: z3 z3py

我实际上正在使用Z3py来安排解决问题,而我正在尝试代表一个2处理器系统,其中必须完成4个不同执行时间的过程。

我的实际数据是: 过程1:到达0,执行时间为4 过程2:到达1并执行时间为3 过程3:到达3,执行时间为5 过程4:到达1和执行时间2

我实际上试图在同等时间的子进程中分解每个进程时代表每个进程,所以我的数据类型是这样的:

Pn = Datatype('Pn')
Pn.declare('1')
Pn.declare('2')
Pn.declare('3')
Pn.declare('4')
Pt = Datatype('Pt')
Pt.declare('1')
Pt.declare('2')
Pt.declare('3')
Pt.declare('4')
Pt.declare('5')
Process = Datatype('Process')
Process.declare('cons' , ('name',Pn) , ('time', Pt))
Process.declare('idle')

其中pn和pt是流程名称和流程的一部分(流程1分为4部分,......)

但现在我不知道如何能够代表我的处理器添加我需要的3条规则:unicity(每个子进程必须完成1次,只有1次只需1次)检查到达(进程的第一部分)在到达之前无法处理)和订单(流程的每个部分必须在先例之后处理) 所以我想用数组代表我的2个处理器用这种声明:

P = Array('P', IntSort() , Process)

但是当我尝试执行它时,我收到一条错误消息:

Traceback (most recent call last):
  File "C:\Users\Alexis\Desktop\test.py", line 16, in <module>
    P = Array('P', IntSort() , Process)
  File "src/api/python\z3.py", line 3887, in Array
  File "src/api/python\z3.py", line 3873, in ArraySort
  File "src/api/python\z3.py", line 56, in _z3_assert
Z3Exception: 'Z3 sort expected'

知道我不知道如何处理它...我必须创建一个新的数据类型并想办法添加我的规则吗?或者有没有办法将数据类型添加到数组,这将让我创建这样的规则:

unicity = ForAll([x,y] , (Implies(x!=y,P[x]!=P[y])))

提前致谢

1 个答案:

答案 0 :(得分:2)

有一个关于使用Python API中的数据类型的教程。该教程的链接是:      http://rise4fun.com/Z3Py/tutorialcontent/advanced#h22 它显示了如何创建列表数据类型并使用“create()”方法从声明数据类型时使用的对象实例化Sort对象。对于您的示例,只需在要将声明的类型用作排序的位置添加对“create()”的调用即可。 请参阅:http://rise4fun.com/Z3Py/rQ7t

关于您正在研究的其他案例研究:当然可以使用量词和数组来表达您描述的常量。您还可以考虑更有效的编码:

  • 使用函数声明而不是使用数组。所以P将被声明为一元函数: P = Function('P',IntSort(),Process.create())。
  • 对小型有限域问题使用量词可能更多的是开销而不是收益。将约束直接写为有限连接可以节省可能重复实例化量词的开销。也就是说,一些量化的公理也可以进行优化。 Z3自动编译形式的公理:ForAll([x,y],Implies(x!= y,P(x)!= P(y)))成 Forall形式的公理([x],Pinv(P(x))== x),其中“Pinv”是一个新函数。新的公理仍然强制P是单射的,但只需要线性数量的实例化,对于某个术语't',P(t)的出现次数是线性的。

玩得开心!