【发布时间】:2014-12-23 08:16:49
【问题描述】:
我正在尝试将可达性属性形式化,以便如果存在长度为 4 的路径(这意味着如果有 3 个中间节点通过它连接 2 个所需节点),我可以找到一个令人满意的解决方案。 注意:我将它限制为只能找到长度为 4 的路径。以下是我所做的:
from z3 import*
# link between two nodes
L= Function('L', IntSort(), IntSort(),BoolSort())
# path between two nodes
p=Function('p', IntSort(), IntSort(), BoolSort())
u=Int('u')
x=Int('x')
y=Int('y')
z=Int('z')
i=Int('i')
j=Int('j')
s=Solver()
s.add(x>=0, x<=5, y>=0,y<=5, u>=0,u<=5,i>=0,i<=5, j>=0,j<=5,z>=0,z<=5)
# no self link or path
si1= ForAll(i, And (L(i,i)==False,p(i,i)==False))
si2=ForAll([x,y], p(x,y)==p(y,x))
# To fix source and destination
si3= ForAll([u,x,y], And(L(u,x)==False, L(y,u)==False) )
# To fix the length of path
si4=ForAll([x,y], Exists([i,j,z] , And( L(x,i)==True, L(i,j)==True,L(j,z)==True,L(z,y)==True) ) )
si5=ForAll([x,y,z], Implies (And (p(x,y)==True, L(x,z)==False,L(y,z)==False), L(x,y)==True))
#s.add(L(1,2)==True,L(2,3)==True, L(3,4)==True,L(4,5)==True)
s.add( Implies (p(x,y)==True, Exists([x,y], And(si1==True,si2==True,si3==True,si4==True,si5==True))) )
#s.add(p(x,y)==True)
result=s.check()
model = s.model()
print result, model ,model[p].else_value()
它返回我 SAT,但现在的问题是,如果我取消评论/添加 s.add(p(x,y)==True) 它让我不满意,而是应该给我一个 SAT 结果。因为在 x 和 y 之间存在一条路径。即使我手动提及(这是一种幼稚的方法)
s.add(L(1,2)==True,L(2,3)==True, L(3,4)==True,L(4,5)==True)
它仍然返回 x=0 和 y=3,因为这不是一个可满足的解决方案,所以第一个可满足的解决方案应该是 x=0 和 y=4
si4=ForAll([x,y], Exists([i,j,z] , And( L(x,i)==True, L(i,j)==True,L(j,z)==True,L(z,y)==True) ) )
我哪里错了?
【问题讨论】: