Я новичок в решении 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
все еще выполняет довольно хорошую работу и быстро ее решает,
Мне известно, что некоторые крипто-хеш-функции или математические формулы (например, гипотеза Коллатца) могут затруднить решение ограничений.Но это кажется довольно экстремальным.С другой стороны, например, предположим, что у меня есть следующее ограничение:
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