2015-02-10 4 views
1

Я пытаюсь немного узнать о z3 и теории векторов бит. Мое намерение состоит в том, чтобы сделать функцию, чтобы получить клев от позиции bitvectorФункция получения nibbles с использованием Z3 и теории битвектора

Этот код возвращает клев:

(define-fun g_nibble(
    (l (_ BitVec 12)) 
    (idx (Int)) 
) (_ BitVec 4) 

(ite 
    (= idx 1) ((_ extract 11 8) l) 
    (ite 
     (= idx 2) ((_ extract 7 4) l) 
     (ite 
      (= idx 3) ((_ extract 3 0) l)  
      (_ bv0 4) 
     ) 
    ) 
)) 

проблема заключается в том, что я хочу избежать кратные жет звонить. Я пытался заменить ((_ экстракт 3 0) л) для Somthing как ((_ экстракт (+ 4 IDX) IDX л), но он не работает

Благодаря

PS:. Идея заключается в том используйте z3 из командной строки (без использования какой-либо библиотеки).

ответ

1

Функция extract использует только цифры, а не произвольные выражения. Однако мы можем перенести выражение в одно направление, а затем извлечь первый или последний четыре бита, например по линиям

((_ extract 11 8) (bvshl l (bvmul idx four))) 

(где idx и четыре являются битовыми векторными выражениями размера 12).

+0

thx, я полагаю, что idx должен быть битовым вектором из-за обеих теорий (Int и бит-вектор), которые нельзя использовать вместе? – user4547829

+0

Да, индекс должен быть битовым вектором. Эти теории могут использоваться вместе, но для функции bvshl требуется бит-вектор. –