如何使用Z3py使预定义的Python函数有效?

时间:2014-03-21 15:13:28

标签: function z3 z3py

作为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

1 个答案:

答案 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