Z3Py中满足N取K约束

Z3Py中满足N取K约束,z3,z3py,Z3,Z3py,我有一个程序,其逻辑如下面的伪代码所述x是一个字符串,x[k]将返回索引k处字符的十进制字符code。^运算符返回操作数的十进制异或结果 x = input int checksum = x[0] ^ x[1] ^ x[2] int sum = 0 sum += x[36] ^ x[23] == 111 sum += x[23] ^ x[29] == 101 sum += x[29] ^ x[30] == 116 sum += x[30] ^ x[9] == 115 sum += x[9] ^

我有一个程序,其逻辑如下面的伪代码所述
x
是一个字符串,
x[k]
将返回索引
k
处字符的十进制字符code。
^
运算符返回操作数的十进制异或结果

x = input
int checksum = x[0] ^ x[1] ^ x[2]
int sum = 0

sum += x[36] ^ x[23] == 111
sum += x[23] ^ x[29] == 101
sum += x[29] ^ x[30] == 116
sum += x[30] ^ x[9] == 115
sum += x[9] ^ x[25] == 0

return sum == checksum and x[0] ^ x[29] == 100 and x[1] ^ x[30] == 200
我想找到使该程序返回
true
的输入。如果我想用Z3Py解决这个问题,有没有办法?我需要一些N取K约束,它允许我将约束表示为表达式,但我还没有找到对此的支持

我想用Z3做什么的Psedocode:

int checksum = x[0] ^ x[1] ^ x[2]

bools = []

bools.append(Bool(x[36] ^ x[23] == 111))
bools.append(Bool(x[23] ^ x[29] == 101))
bools.append(Bool(x[29] ^ x[30] == 116))
bools.append(Bool(x[30] ^ x[9] == 115))
bools.append(Bool(x[9] ^ x[25] == 0))

state.add(bools[0])
state.add(bools[1])
state.add(bools[2])
state.add(bools[3])
state.add(bools[4])
state.add(x[0] ^ x[29] == 100)
state.add(x[1] ^ x[30] == 200)

state.add(PbEq([boolean for boolean in bools], checksum))

阅读您的问题描述,我不明白您为什么需要N取K约束来解决此问题。这似乎是一种使用位向量理论的简单编码。但也许我不太明白你要解决的问题。这将有助于展示你尝试了什么,失败了什么

在任何情况下,如果您确实需要N取K约束,那么Z3以各种形式对它们提供了特殊支持:


这种约束称为“伪布尔”,因此是
Pb
前缀

阅读您的问题描述,我不明白您为什么需要N取K约束来解决此问题。这似乎是一种使用位向量理论的简单编码。但也许我不太明白你要解决的问题。这将有助于展示你尝试了什么,失败了什么

在任何情况下,如果您确实需要N取K约束,那么Z3以各种形式对它们提供了特殊支持:


这种约束称为“伪布尔”,因此是
Pb
前缀

我编辑了我的问题。如果你能找到一个更简单的方法来解决这个问题,我想听听。我认为这个问题不需要任何N-out-of-K约束。这听起来非常类似于这个现有的问题,看看答案是否对你有帮助:链接中的问题是一个普通的XOR问题。我的问题要求您解决从
校验和导出的数量可变的约束。
校验和
依次从约束本身中的变量派生出来,循环一整圈。我当然可能遗漏了一些东西,但我的问题从表面上看似乎有所不同。提示是关于如何在Z3py IDOM中对其进行编码。Stackoverflow的效果最好,如果你首先尝试一些东西,当你陷入困境时寻求帮助,而不是寻求完整的解决方案。请参见此处的MVCE指南:我编辑了我的问题。如果你能找到一个更简单的方法来解决这个问题,我想听听。我认为这个问题不需要任何N-out-of-K约束。这听起来非常类似于这个现有的问题,看看答案是否对你有帮助:链接中的问题是一个普通的XOR问题。我的问题要求您解决从
校验和导出的数量可变的约束。
校验和
依次从约束本身中的变量派生出来,循环一整圈。我当然可能遗漏了一些东西,但我的问题从表面上看似乎有所不同。提示是关于如何在Z3py IDOM中对其进行编码。Stackoverflow的效果最好,如果你首先尝试一些东西,当你陷入困境时寻求帮助,而不是寻求完整的解决方案。请参见此处的MVCE指南: