Решить с помощью решателя Z3 условие с длиной массива произвольного размера

1

Я изучаю решение 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 )

Правильно ли я это делаю?

Теги:
z3
z3py
solver

1 ответ

1
Лучший ответ

Массивы 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/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню