使用布尔运算符在 Z3 中定义约束
Defining constraints in Z3 using Boolean operators
比方说,我想将字符串的每个字符限制为字符集:[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 中的约束吗?
谢谢。
解决此问题的最佳方法是简单地使用 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
比方说,我想将字符串的每个字符限制为字符集:[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 中的约束吗?
谢谢。
解决此问题的最佳方法是简单地使用 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