Z3py SMT编码跟随变量和公式

时间:2015-05-19 20:23:51

标签: z3 smt z3py

我是Z3和SMT求解器的新手。 我有以下问题,我不知道如何在Z3py中编码。

In the above block diagram, N contains set of nodes.

在上图中,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 之前调度的所有块。 节点的调度由另一个程序给出。 例如,在上面的框图中,节点的调度以及输出的生成如下:

  • 预定的第一个节点= Node1
  • 第二个节点已调度= Node2
  • 计划的第三个节点= Node5
  • 生成的输出= O 1
  • 第四个节点预定= Node3
  • 第五个节点预定= Node6
  • 生成的输出= O 2
  • 计划的第六个节点= Node4
  • 第五个节点预定= Node7
  • 生成的输出= O 3

因此从上面我们可以说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):

  • f 节点 r,i 任务 r,m 表示是否 节点 r,i 映射到Task r,m
  • DN 节点 r,i 节点 s,j 表示是否 节点 s,j 取决于Node r,i ,即如果存在从Node r,i 到Node s的路径,j
  • DT 任务 r,m 任务 s,n 表示是否 任务 s,n 取决于Task r,m
  • M 任务 r,m 表示是否有任何节点映射到任务 r,m

基于以上信息,我必须在SMT中制定以下等式。

  1. 最小化(Σ r,m M 任务 r,m
  2. M 任务 r,m > = f Node r,i Task r,m (适用于所有i)
  3. Σ <子>米   f 节点 r,i 任务 r,m = 1(对于所有r!= I,O) 示例: f 节点 r,i 任务 r,m + f 节点 r,i 任务 r,m + 1 + f 节点 r,i 任务 r ,m + 2 = 1 + 0 + 0 =这告诉我们Node r,i 被映射到Task r,m ,因为f 节点 r,i 任务 r,m = 1(一次只能将一个节点映射到1个任务,但可以映射任务一次到几个节点)
  4. f 节点 r,i 任务 s,m = 0(对于所有r!= s)
  5. f 节点 r,i 任务 r,m = 1(对于所有r = I,O和m = i)
  6. f 节点 r,i 任务 r,m = 0(对于所有r = I,O和m!= i)< / LI>
  7. DT 任务 r,m 任务 s,n &gt; = f Node r,i 任务 r,m + f 节点 s,j 任务 s,n + DN < sub> Node r,i Node s,j - 2
  8. DT 任务 r,m 任务 s,n &gt; = DT 任务 r,m 任务 t,l + DT 任务 t,l 任务 s,n - 1 < / LI>
  9. DT 任务 r,m 任务 s,n + DT 任务 s,n 任务 r,m &lt; = 1
  10. 我不明白如何用SMT格式表示变量和这些公式。

1 个答案:

答案 0 :(得分:1)

我不确定如何最好地回答,因为该问题包含许多未完全指定的细节的引用。 例如,我和O是什么? 您可能正在询问如何添加线性不等式系统。或者如何使用0或1的整数变量来指定问题。

一种方法是引入如下功能:

       a = Function('a', IntSort(), IntSort(), IntSort())

然后&#39; a&#39;是一个将整数对映射到整数的函数。 您可以声明功能&#39; n&#39;以类似的方式(但我猜你的例子实际上有一些拼写错误,你使用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())

而不是功能应用程序。