我是Z3和SMT求解器的新手。 我有以下问题,我不知道如何在Z3py中编码。
在上图中,N是节点集,因此N = {Node1,Node2,Node3,Node4,Node5,Node6,Node7}
我是输入集,I = {I 1 ,I 2 ,I 3 ,I 4 }
O是输出集合,O = {O 1 ,O 2 ,O 3 }
G是一个组,其中对于任何连续的2个输出(O i ,O j ),如果首先输出O i 并且O j 是生成的第二个输出,G k 是在生成O i 之后和生成O之前调度的节点集。 j ,但如果在O i 之前生成O j ,则G k 包含生成O j 之前调度的所有块。 节点的调度由另一个程序给出。 例如,在上面的框图中,节点的调度以及输出的生成如下:
因此从上面我们可以说G 1 (O 1 ,O 2 )= {Node3,Node6}
但是(O 2 ,O 1 )的G 2 = {Node1,Node2,Node5}
要执行每个节点,我们需要一个任务,一个任务可以一次实现1个节点或一组节点。
节点 r,i 表示组G r 中的i th 节点。 任务 r,m 表示组G r 中的m th 任务。
布尔变量(可以是0或1):
基于以上信息,我必须在SMT中制定以下等式。
我不明白如何用SMT格式表示变量和这些公式。
答案 0 :(得分:1)
我不确定如何最好地回答,因为该问题包含许多未完全指定的细节的引用。 例如,我和O是什么? 您可能正在询问如何添加线性不等式系统。或者如何使用0或1的整数变量来指定问题。
一种方法是引入如下功能:
a = Function('a', IntSort(), IntSort(), IntSort())
然后' a'是一个将整数对映射到整数的函数。 您可以声明功能' n'以类似的方式(但我猜你的例子实际上有一些拼写错误,你使用n作为函数和索引变量)。 您也可以用类似的方式声明函数f,h,q。
然后在python中你可以写:
N = 5
s = Solver() # create a solver context
for r in range(N):
for i in range(N):
for m in range(N):
if m != i:
s.add(f(n(r,i),a(r,m)) == 0)
这会在您指定的f上添加等式约束。 可以以类似的方式添加其他相等和不平等约束。 最后你要问的结果状态是否令人满意。
print s.check()
print s.model() # print model for satisfiable outcome.
其他方法是为不同的方法声明不同的常量 f的版本。毕竟你提出的问题表明你是公正的 在不同的变量上写下一个大的不等式系统 方式。
例如,您可以创建和常量v:
v = Const('f(a[%d][%d],a[%d][%d])' % (r,m,r,i), IntSort())
而不是功能应用程序。