使用布尔运算符在Z3中定义约束

时间:2018-12-17 01:46:30

标签: python z3 z3py

比方说,我想将字符串的每个字符限制为字符集:[a-zA-Z0-9_]使用Z3约束,我可以使用布尔运算符来指定该字符集吗?

例如:

input = [BitVec("input%s" % i, 8) for i in range(10)]

for i in range(10):
  s.add(input[i] >= 0x30 and input[i] <= 0x39)
  s.add(input[i] >= 0x41 and input[i] <= 0x5A)
  s.add(input[i] >= 0x61 and input[i] <= 0x7A)

这是正确的吗?还有其他定义约束的有效方法吗?

通常在Python中,我可以做类似的事情:

import string

charset = string.uppercase + string.lowercase + string.digits + "_"

for i in charset:
    ...

是否可以执行类似的操作来定义Z3中的约束?

谢谢。

1 个答案:

答案 0 :(得分:1)

解决此问题的最佳方法是仅使用z3的正则表达式匹配工具:

from z3 import *
import string

lower  = Union([Re(c) for c in string.lowercase])
upper  = Union([Re(c) for c in string.uppercase])
digs   = Union([Re(c) for c in string.digits])
uscore = Re('_')

charset = Union(lower, upper, digs, uscore)
lang    = Plus(charset)


s = Solver()
test = String("test")
s.add(Length(test) == 10)
s.add(InRe(test, lang))

print s.check()
print s.model()

此打印:

sat
[test = "9L25ZPC1B8"]

或者您可以使用它来测试特定的字符串是否属于您定义的正则表达式:

>>> print (simplify(InRe("hEllO_123", lang)))
True
>>> print (simplify(InRe("%$", lang)))
False