Python 表示图G中存在一个函数‘path(x,y)’

Python 表示图G中存在一个函数‘path(x,y)’,python,z3,smt,z3py,Python,Z3,Smt,Z3py,我试图通过Z3Py中的边和顶点的连通性来形式化图中存在的路径的属性 我在z3py中有以下定义: 从z3导入* #图中存在的顶点集 V=清空设置() V=SetAdd(V,0) V=SetAdd(V,1) V=SetAdd(V,2) Edge=数据类型(“Edge”) declare('Edge',('first',IntSort()),('second',IntSort())) Edge=Edge.create() def makeEdge(i,j): 返回边。边(i,j) #图中的方向边集 E

我试图通过Z3Py中的边和顶点的连通性来形式化图中存在的路径的属性

我在z3py中有以下定义:

从z3导入*
#图中存在的顶点集
V=清空设置()
V=SetAdd(V,0)
V=SetAdd(V,1)
V=SetAdd(V,2)
Edge=数据类型(“Edge”)
declare('Edge',('first',IntSort()),('second',IntSort()))
Edge=Edge.create()
def makeEdge(i,j):
返回边。边(i,j)
#图中的方向边集
E=清空设置()
E=SetAdd(E,makeEdge(0,1))
E=SetAdd(E,makeEdge(1,2))
根据上述定义,我们可以说一个图
G
有两个集合:
V
E
,它们是
G
中存在的顶点和边的集合

我现在定义成员资格的谓词,并将它们固定到解算器中

x=Int('x')
y=Int('y')
IsVertex=函数('IsVertex',IntSort(),BoolSort())
IsEdge=函数('IsEdge',IntSort(),IntSort(),BoolSort())
顶点公理=ForAll([x],IsMember(x,V)==IsVertex(x))
边公理=ForAll([x,y],IsMember(makeEdge(x,y),E)=IsEdge(x,y))
s=解算器()
s、 添加(顶点公理)
s、 添加(边_公理)
调用
s.check()
时,上面返回的是
sat
。使用随机值作为函数
IsVertex
IsEdge
的输入进行测试,仅当值如预期在集合
V
E
内时,才会返回true

现在我尝试定义一个谓词函数
IsPath(x,z)
wrt to
G
,其中
IsPath(x,z)
当且仅当顶点
x
z
之间存在路径时才应返回true

z = Int('z')
IsPath = Function('IsPath', IntSort(), IntSort(), BoolSort())

# base case
path_axiom1 = ForAll([x, z], Implies(IsEdge(x, z), IsPath(x, z))

# recurrence case
'''
A path exists between x, z if and only if there is a vertex y such that
x, y is an edge in G and y, z is a path
'''
path_axiom2 = ForAll([x, z], Exists([y], And(And(IsVertex(y), IsEdge(x, y)), IsPath(y, z) == IsPath(x, z))))
使用第一个代码段中定义的图形将其固定到解算器中:

s.add(path_axiom1)
s.add(path_axiom2)
print(s.check())
返回
unsat
,这是有意义的,因为所有对顶点都不存在路径

如何更好地优化表达式,使其仅引用符合路径公式的顶点,并将其添加到解算器中


谢谢。

我不清楚你想问什么。如果您显示您尝试执行的操作和未执行的操作,则堆栈溢出效果最佳。你是不是想通过某种方式提高效率?(我可以想象使用量词会减慢解算器的速度或使其返回
unknown