(Z3Py)检查方程所有解决方案((Z3Py) checking all solutions for

2019-06-17 16:40发布

在Z3Py,我怎么能检查是否方程给定的约束只有一个解决办法?

如果不止一个解决方案,我怎么能列举出来?

Answer 1:

您可以通过添加新的限制,阻止该模型由Z3返回做到这一点。 例如,假设在模型中通过Z3返回我们有x = 0y = 1 。 然后,我们可以通过添加约束阻止这种模式Or(x != 0, y != 1) 下面的脚本的伎俩。 :您可以在线试用http://rise4fun.com/Z3Py/4blB

请注意,下面的脚本有一些限制。 输入公式不能包括未解释的函数,数组或未解释排序。

from z3 import *

# Return the first "M" models of formula list of formulas F 
def get_models(F, M):
    result = []
    s = Solver()
    s.add(F)
    while len(result) < M and s.check() == sat:
        m = s.model()
        result.append(m)
        # Create a new constraint the blocks the current model
        block = []
        for d in m:
            # d is a declaration
            if d.arity() > 0:
                raise Z3Exception("uninterpreted functions are not supported")
            # create a constant from declaration
            c = d()
            if is_array(c) or c.sort().kind() == Z3_UNINTERPRETED_SORT:
                raise Z3Exception("arrays and uninterpreted sorts are not supported")
            block.append(c != m[d])
        s.add(Or(block))
    return result

# Return True if F has exactly one model.
def exactly_one_model(F):
    return len(get_models(F, 2)) == 1

x, y = Ints('x y')
s = Solver()
F = [x >= 0, x <= 1, y >= 0, y <= 2, y == 2*x]
print get_models(F, 10)
print exactly_one_model(F)
print exactly_one_model([x >= 0, x <= 1, y >= 0, y <= 2, 2*y == x])

# Demonstrate unsupported features
try:
    a = Array('a', IntSort(), IntSort())
    b = Array('b', IntSort(), IntSort())
    print get_models(a==b, 10)
except Z3Exception as ex:
    print "Error: ", ex

try:
    f = Function('f', IntSort(), IntSort())
    print get_models(f(x) == x, 10)
except Z3Exception as ex:
    print "Error: ", ex


文章来源: (Z3Py) checking all solutions for equation
标签: python z3 z3py