python Z3如果没有else怎么用

python Z3 how to use if without else

我尝试使用 z3 做一些简单的数学运算,条件是 if 没有 else。

............................................

  for (i = 0; i <= 15; ++i)
  {
    if (s1[i] > 64 && s1[i] <= 90)
      s1[i] = (s1[i] - 51) % 26 + 65;
    if (s1[i] > 96 && s1[i] <= 122)
      s1[i] = (s1[i] - 79) % 26 + 97;
  }
  for (i = 0; i <= 15; ++i)
  {
    result = key[i];
    if (s1[i] != result)
      return result;
  }
from z3 import *

key = list(b"Qsw3sj_lz4_Ujw@l")
s1 = [BitVec('s1_%d' % i, 8) for i in range(len(key))]

s = Solver()
for i, n in enumerate(key):
    con1 = If(Or(64 < s1[i], s1[i] <= 90), (s1[i] - 51) % 26 + 65 == key[i])
    con2 = If(Or(96 < s1[i], s1[i] <= 122), (s1[i] - 79) % 26 + 97 == key[i])
    s.add(con1)
    s.add(con2)
print(s.check())
print(s.model())

遇到错误。 TypeError: If() missing 1 required positional argument: 'c'

If 接受三个参数; (1) 条件,(2) then 结果,以及 (3) else 结果。你只提供了两个。如果您不关心 else 大小写约束,则可以替换 True

    con1 = If(Or(64 < s1[i], s1[i] <= 90), (s1[i] - 51) % 26 + 65 == key[i], True)

con2.

也类似

请注意,在 z3 中 没有 没有 elseIf 之类的东西。 虽然这会修复您的“语法”错误,但不会修复您在模型中犯的错误;如果有的话,当然。 (如前所述,您的条件是 unsat,我认为这不是您所期望的。)当条件为假时,您应该真正考虑程序如何更改(或不更改),而不是像这样的约束,你应该模拟变量在将它们放入 SSA(单一静态赋值形式)后如何变化。