我是 SMT 求解的新手,我正在写信询问一些建议和指示,以了解difficult constraint
SMT 求解器真正需要解决的问题,例如 Z3。
我试图调整位向量的长度,例如通过以下方式:
>>> a = BitVec("a", 10000)
>>> b = BitVec("b", 10000)
>>> c = a >> 18 + 6 - 32 + 69 == b <<12 + 7 * 32
>>>
>>> s = Solver()
>>> s.add(c)
>>> s.check()
虽然直觉上这可能会导致相当大的搜索空间,但事实证明它Z3
仍然做得很好并且可以迅速解决它。
我知道一些加密哈希函数或数学公式(例如,Collatz 猜想)可能会使约束求解变得非常困难。但这似乎很极端。另一方面,例如假设我有以下约束:
a * 4 != b + 5
如何让约束求解器更难求解?有什么通用的方法吗?我的印象是,不知何故,约束变成了“非线性”,那就很难了。但我仍然不清楚它是如何工作的。
==================================
感谢您提供所有友好的注释和有见地的帖子。我非常感激!
因此,根据@usr 的建议,这里有一些试探性的测试:
c = BitVec("c", 256)
for i in range(0, 10):
c = c ^ (c << 13) + 0x51D36335;
s = Solver()
s.add(c == 0xdeadbeef)
print (s.check())
print (s.model())
➜ work time python test.py
sat
[c = 37865234442889991147654282251706833776025899459583617825773189302332620431087]
python test.py 0.38s user 0.07s system 81% cpu 0.550 total