Z3中的所有不同约束

HiDefender

有没有一种方法可以在仅使用O(n)语句的Z3中生成全除例外约束?我知道XCSP3提供了此功能。

目前,可以使用O(n ^ 2)语句来做到这一点:

for i in range(len(G) - 1):
    s.add( [ Or(G[i] == 0, G[i] != G[j]) for j in range(i + 1, len(G)) ] )

如果重要的话,我有兴趣比较位向量。

别名

Z3确实带有Distinct确保所有元素都不同谓词,但是据我所知,没有内置函数distinct-except

为了对这种约束进行编码,我将使用数组来跟踪插入元素的基数。像这样:

from z3 import *

def distinct_except(G, ignored):
   if len(G) < 2:
       return BoolSort().cast(True)

   A = K(G[0].sort(), 0);
   for i in range(len(G)):
       A = Store(A, G[i], If(G[i] == ignored, 0, 1 + Select(A, G[i])))

   res = True
   for i in range(len(G)):
       res = And(res, Select(A, G[i]) <= 1)

   return res

我们只需将元素插入数组中,如果不忽略该元素,则将计数增加1,否则输入0。这将避免线性构建数组的if-then-else节点。然后,我们再次遍历该列表,并确保从未存储大于1的内容。

这将保持表达式的大小resA线性,并且z3应该能够相当有效地处理它。如果您发现其他情况,我想听听。

这是一些测试,以查看实际效果:

# Test: Create four variables, assert they are distinct in the above sense
a, b, c, d = BitVecs('a b c d', 32)
s = Solver()
s.add(distinct_except([a, b, c, d], 0))

# Clearly sat:
print s.check()
print s.model()

# Add a constraint that a and b are equal
# Still SAT, because we can make a and b 0
s.add(a == b)
print s.check()
print s.model()

# Force a to be non-zero
s.add(a != 0)

# Now we have unsat:
print s.check()

打印:

sat
[b = 1024, a = 16, c = 1, d = 536870912]
sat
[c = 33554432, a = 0, d = 32768, b = 0]
unsat

请注意,您始终可以print s.sexpr()在调用之前先查看所生成的表达式,s.check()以查看它们随着输入列表变大而如何增长。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

z3中所有内置符号的列表

来自分类Dev

lmfit 模型中拟合参数的不同约束

来自分类Dev

在Z3中有效检查两个约束的句法等价

来自分类Dev

在Z3中的函数上添加约束

来自分类Dev

关于Z3中对数组的约束

来自分类Dev

在Z3中对整数位添加约束

来自分类Dev

Z3 C API中的指数约束未知吗?

来自分类Dev

Z3 Python API 中的标签约束

来自分类Dev

Z3中记录数据类型的所有可能值?

来自分类Dev

如何使用Z3(python API)快速重命名公式中的所有变量

来自分类Dev

Z3为所有公式提供了意外的UNSAT

来自分类Dev

显示Z3模型的所有值(Python)

来自分类Dev

z3 SMT求解器中的不同数组值

来自分类Dev

XSD验证:N个带有其他不同约束的子级

来自分类Dev

Randomize()函数可以为具有相同约束的4个不同寄存器选择不同的随机值吗?

来自分类Dev

在Z3中编码“至多k个/最少k个布尔值是真实的”约束

来自分类Dev

与z3 SMT和python不同

来自分类Dev

自动布局横向和纵向模式的不同约束

来自分类Dev

如何从具有不同约束的同一张表中计算出百分比

来自分类Dev

使用Z3从受约束的空间采样

来自分类Dev

Z3 答案不满足约束

来自分类Dev

有没有一种方法可以使用Z3获取涉及集的约束模型?

来自分类Dev

有没有办法使用Z3来获得涉及序列和图的约束模型?

来自分类Dev

试图在python中使用Z3查找布尔公式的所有解决方案

来自分类Dev

Z3:在c ++中找到所有令人满意的模型

来自分类Dev

使用C ++ API具有实际约束的Z3优化器不满足要求

来自分类Dev

是否可以在z3中使用SMT-LIB2接口定义一个具有所有量化断言的函数?

来自分类Dev

Z3中的变量消除

来自分类Dev

Z3中的优化:删除ε

Related 相关文章

热门标签

归档