Я пытаюсь сделать простой пример для проверки байтов в фиксированном массиве. Я также читал Z3 учебники, но я не могу заставить его работать. Вот может, сценарий:Простой массив байтов в Z3 (SMT)
Я установил массив длиной 16: T (16)
У меня есть эти условия, чтобы проверить:
A = (T(16) + 1) And 0x0F
T(A) = 0x76
0x01 <= A <= 0x7F
Это значит взять байт из T(16)
добавить 1
, сделайте AND
с 0x0F
и присвойте номер результата переменной A
. Теперь проверьте, есть ли в массиве T
в позиции A
T(A)
есть номер 0x76
. Также A
может находиться между значениями 0x01
и 0x7F
.
Эти условия повторяются для большего количества позиций в массиве, но мне нужно заставить его работать только для первого случая. Целью этого является поиск правильного порядка известных байтов в фиксированном массиве на основе заданных уравнений.
Я использую этот сценарий, но не работает.
Error: operator is applied to arguments of the wrong sort.
(declare-const t (Array Int Int))
(declare-const a Int)
; A = (t(16) + 1) And 0x0F
(assert (= a (bvand (+ (select t 16) 1) #x0F)))
; t(A) = 0x76
(assert (= (select t a) #x76))
(check-sat)
;(get-model)
Пример:
на T(16)
это значение 0x14
+ 1 = 0x15
, AND
0x0F
= 0x05
, на T(0x05)
должно быть значение 0x76
.
спасибо.
Спасибо, да, вы правы в отношении типов. О идее не использовать массивы - я могу создать 16 битовых переменных ... но как я могу читать значение на позиции X? Случай: T (A) = 0x76, Может быть, какой-то ** Выбрать случай **? Если A = 1, то используйте T1, если A = 2 Используйте переменную T2? Потому что X неизвестен ... –
Что-то вроде 'i == 0? x0: i == 1? x1: ... '. Это неудобно, но может быть быстрее, чем использование массивов, потому что это заставляет Z3 использовать более общий решатель. – usr
О 'i == 0? x0' ... Это может быть записано командой if-then-else ** ite **? например, присваивать значение X N-го значения из наших значений T0, T1 .. '(assert (= X (ite (= A 0) T0 (ite (= A 1) T1 T2))))' .... но это будет очень длинное выражение ... (я пишу только первые 2 значения из 16, как пример) –