Z3 の初心者として、定義済みの Python 関数で Z3Py を動作させる方法があるかどうか疑問に思っています。以下は、私の質問を説明する小さな例です。
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 が変数 "a" の適切な値 (たとえば -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
この頂点を削除した後、G2 が G1 と同型になるように、G2 の頂点を見つけるのに Z3 が必要です。例えば
G2.remove_node(0)
print(nx.is_isomorphic(G1, G2))
#True