Здесь происходит несколько вещей:
Вы объявляете решающий объект s = Solver ()
, но затем вы вызываете функцию solve
. solve
создает свой собственный решатель. Вместо этого просто используйте s.add
.
Empty
создает последовательность с учетом сортировки. Вы не можете позвонить на iseq
. Это сообщение об ошибке, которое вы получаете.
Я предполагаю, что все, что вы пытаетесь сказать: объявите iseq
, убедитесь, что оно не пустое. Вы должны закодировать это следующим образом:
from z3 import *
s = Solver()
# declare a sequence of integers
iseq = Const('iseq', SeqSort(IntSort()))
# assert it's not empty
s.add (Length(iseq) != 0)
# get a model and print it:
if s.check() == sat:
print (s.model())
z3 говорит:
$ python a.py
[iseq = Unit(2)]
Итак, он дал вам модель, где iseq
- это одиночная последовательность, содержащая число 2
; не пусто, что удовлетворяет установленному нами ограничению.
Вот пример, который использует Empty
для создания пустой последовательности:
from z3 import *
s = Solver()
# Give a name to integer sequences
ISeq = SeqSort(IntSort())
# declare a sequence of integers
iseq = Const('iseq', ISeq)
# make sure it's empty!
s.add (iseq == Empty(ISeq))
# get a model and print it:
if s.check() == sat:
print (s.model())
z3 говорит:
[iseq = Empty(Seq(Int))]
Обратите внимание, что z3py по сути является функциональным языком; как только вы утверждаете, что что-то равно чему-то другому, вы можете , а не изменить это значение, как вы могли бы на императивном языке, например, скажем, Python. Надеюсь, это поможет!