当前位置: 首页 > 面试题库 >

(Z3Py)检查方程的所有解

薛云瀚
2023-03-14
问题内容

在Z3Py中,如何检查给定约束的方程式是否只有一个解?

如果有多个解决方案,我该如何列举呢?


问题答案:

您可以通过添加新的约束来阻止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


 类似资料:
  • 嗨,伙计们,我有一个这样的东西 我可以检查tmp吗?如果所有数据都不为空,我会做些什么?,我知道使用if的简单方法,但如果使用if运算符,数据太多了?

  • 让我们得到一个m位消息,其中最后n位是CRC位。据我所知,为了检查接收是否正确,我们应该用特定CRC算法的多项式对所有m位进行异或。如果结果是全零,我们可以说没有错误。

  • 问题内容: 从ElasticSearch获取某个索引的所有_id的最快方法是什么?使用简单的查询是否可能?我的索引之一包含大约20,000个文档。 问题答案: 编辑:请也阅读@Aleck Landgraf的答案 您只想要elasticsearch-internal 字段吗?还是文档中的字段? 对于前者,请尝试 Note 2017更新: 该帖子最初包含在内,但此后名称已更改,并且是新值。 结果将仅包

  • 问题内容: 在执行一个简单的编译器检查之前,在一个Swift项目中,查看运行的是哪种方案,然后有条件地包含或不包含代码。例如: 但是由于某种原因,在我的Objective-C项目中,这似乎不起作用。应该以相同的方式工作吗?还是Swift编译器具有一些允许这种行为的进步? 问题答案: 用 您可以在此处定义预处理器宏 希望这可以帮助