Я изучаю решение Z3. У меня вопрос о массивах и связанных с ними условиях. В частности, мне нужно создать код Z3py для решения условия if ниже:
totalAccounts = [ 1, 2, 3, 4, 5 ]
def (myAccounts):
cnt = len(myAccounts)
if (cnt > 10) doSomething()
myAccounts
- это список целых чисел, подмножество списка totalAccounts
. Условие для перехода - cnt > 10
которое зависит от длины списка myAccounts
.
Я думаю, мне нужно представить myAccounts
как массив Z3 и скопировать значения в totalAccounts
на нем с помощью функции Store
.
MYACCOUNTS = Array ('MYACCOUNTS', IntSort(), IntSort())
I = Int('I')
i = 0
for elem in totalAccounts:
MYACCOUNTS = Store(MYACCOUNTS, i, elem)
i = i + 1
Но я не знаю, как представить длину такого массива при создании условия для добавления в решатель:
solver = Solver()
solver.add( ??? > 10 )
Правильно ли я это делаю?
Массивы SMTLib (и, следовательно, массивы z3 и z3py) индексируются по всему их типу домена. В вашем примере тип индекса - Int()
, поэтому массив имеет элемент для любого целочисленного значения. Обратите внимание, что это отличается от обычного обращения к массивам в языках программирования, где вы обычно получаете "длину" массива. Вы можете узнать больше о массивах SMTLib здесь: http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf (в частности, стр. 39).
Чтобы моделировать любое понятие длины массива, обычно он отслеживает его в отдельной символической переменной и всякий раз, когда свойства выражаются, это обычно делается в отношении этой переменной. Задавая, какую именно проблему вы пытаетесь решить, вы получите еще больше.
Вы также можете просмотреть руководство Z3 (https://rise4fun.com/z3/tutorial/guide), в котором также есть раздел о массивах. Stack-overflow также имеет похожие вопросы относительно использования массива в z3py, вот один пример ответа, относящийся к текущему контексту: qaru.site/questions/2135551/...