作为Z3的初学者,我想知道是否有办法让Z3Py使用预定义的Python函数。以下是一个解释我问题的小例子。
from z3 import *
def f(x):
if x > 0:
print " > 0"
return 1
else:
print " <= 0"
return 0
a=Int('a')
s=Solver()
s.insert(f(a) == 0)
t = s.check()
print t
print a
m = s.model()
print m
f(x)是python中定义的函数。当x <= 0时,f(x)返回0.我添加约束s.insert(f(a) == 0)
并希望Z3可以为变量&#34; a&#34;找到合适的值。 (例如-3)。但这些代码无法正常工作。我该怎么改变它?
(请注意,我需要在Z3外定义f(x),然后由Z3调用。)
我要做的是调用图库提供的预定义函数,而不将其转换为Z3。我正在使用NetworkX库,一些代码如下:
import networkx as nx
G1=nx.Graph()
G1.add_edge(0,1)
G2=nx.Graph()
G2.add_edge(0,1)
G2.add_edge(1,2)
print(nx.is_isomorphic(G1, G2))
#False
我需要Z3帮我在G2中找到一个顶点,这样在移除这个顶点后,G2与G1同构。 e.g。
G2.remove_node(0)
print(nx.is_isomorphic(G1, G2))
#True
答案 0 :(得分:1)
我认为如果f
是一般函数(例如,如果它是递归的那样)会很难,但如果你假设它有一些结构(例如,如果那么其他),你可能能够写一个简单的翻译。问题是Z3的函数本质上是数学的,并不直接等同于Python函数(参见http://en.wikipedia.org/wiki/Uninterpreted_function)。如果可能的话,我建议采用相反的方向:根据Z3结构定义函数f
,然后在程序中对其进行评估(例如,使用此方法:Z3/Python getting python values from model)。如果这对您不起作用,请提供一些有关如何使用该功能的其他详细信息。这是一个最小的例子(rise4fun链接:http://rise4fun.com/Z3Py/pslw):
def f(x):
return If(x > 0, 1, 0)
a=Int('a')
s=Solver()
P = (f(a) == 0)
s.add(P)
t = s.check()
print t
print a
m = s.model()
print m
res = simplify(f(m[a])) # evaluate f at the assignment to a found by Z3
print "is_int_value(res):", is_int_value(res)
print res.as_long() == 0 # Python 0
print f(1)
print simplify(f(1)) # Z3 value of 1, need to convert as above