まずは,z3というモジュールに含まれる定義を使うことを宣言する.
from z3 import *
solverを作る
solver = Solver()
実数型の変数を作る.それぞれが非負であるという制約をsolverに加える.
x = Real("x")
y = Real("y")
solver.add(x >= 0)
solver.add(y >= 0)
制約式p1, p2, p3 を作り,それを元に作成した節を加える.
p1 = (x + y <= 2)
p2 = (2 * x + y <= 3)
p3 = (x + y >= 3)
solver.add(p3)
solver.add(Or(p1, p2))
solver.add(Or(Not(p1), Not(p2)))
制約を満たす変数割り当てがあるかどうかをチェックする.
solver.check()
変数割り当ての一つを表示させる.
solver.model()
別解があるかどうかを調べるために,見つかった解を除く制約を加える
solver.add(Or(y != 3, x != 0))
制約を満たす変数割り当てがあるかどうかをチェックする.
solver.check()
なお,solveという関数で一度に解くこともできる.
x, y = Reals("x y")
p1 = (x + y <= 2)
p2 = (2 * x + y <= 3)
p3 = (x + y >= 3)
solve(x >= 0, y >= 0, p3, Or(p1, p2), Or(Not(p1), Not(p2)))