Мне удалось создать массив записей с использованием Z3, но теперь я пытаюсь увидеть синтаксис, который мне нужен для выполнения операции $ \ forall $ в массиве ... вот пример фрагмента SMT -LIB2-код, который у меня есть.Z3 ForAll on Arrays
(declare-datatypes() ((rec (mk-R5 (age Int) (area Int) (married Bool)))))
(declare-const recs (Array Int rec))
(declare-const r1 rec)
(assert(= (age r1) 15))
(assert(= (area r1) 10001))
(assert(= (married r1) true))
(declare-const r2 rec)
(assert(= (age r2) 35))
(assert(= (area r2) 2845))
(assert(= (married r2) true))
(declare-const x Int)
(declare-const y Int)
(assert (= recs (store recs x r1)))
(assert (= recs (store recs y r2)))
(assert(forall ((i rec)) (= (married i) true)))
(check-sat)
(get-model)
Я предполагаю, что третья-последняя строка должна иметь некоторую ссылку на массив, но я пробовал все, и учебник не поможет мне с этой проблемой.
Как выполнить операцию $ \ forall $ над массивом, который у меня есть?
«Это говорит о том, что recs является массивом, индексированным всеми целыми числами. То есть, домен является множеством всех значений Int. Это, вероятно, не то, что вы имели в виду». Действительно ... какова альтернатива. Благодарю. У меня были некоторые трудности с документацией для этого замечательного продукта. –
Вы все равно можете использовать такие массивы, но при каждом его индексировании вам придется ограничивать индексы, находящиеся в пределах границ. Вы можете сделать это, явно указывая значения, которые могут иметь ваши индексы. Опять же, зависит от того, что вы пытаетесь моделировать; невозможно предложить что-либо, не зная больше о реальной проблеме. –