Big o 除了Z3中的约束之外,所有其他约束都不同

Big o 除了Z3中的约束之外,所有其他约束都不同,big-o,z3,z3py,bitvector,Big O,Z3,Z3py,Bitvector,在Z3中,有没有一种方法可以只使用O(n)语句生成一个完全不同的except约束?我知道它提供了这个 目前可以使用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

在Z3中,有没有一种方法可以只使用O(n)语句生成一个完全不同的except约束?我知道它提供了这个

目前可以使用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

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

从z3导入*
def distinct_除外(G,忽略):
如果len(G)<2:
返回BoolSort().cast(True)
A=K(G[0].sort(),0);
对于范围内的i(len(G)):
A=存储(A,G[i],如果(G[i]==忽略,0,1+选择(A,G[i]))
res=真
对于范围内的i(len(G)):

res=和(res,Select(A,G[i])我印象深刻,谢谢。我以前没有研究过数组理论。为什么第9行不是这样:
A=Store(A,G[i],If(G[i]==忽略,0+Select(A,G[i]),1+Select(A,G[i])
?如果忽略该值,它总是0。(从0的数组开始。)所以,你所写的也可以,但它绝对没有任何作用,因为如果
G[i]
被忽略,那么
Select(A,G[i])
将始终为0。因此,保持它仅为
0
是非常好的。试着自己写几个例子,然后运行它的样子。
sat
[b = 1024, a = 16, c = 1, d = 536870912]
sat
[c = 33554432, a = 0, d = 32768, b = 0]
unsat