Z3py: как расширить и переустановить переменные?

У меня есть две переменные «a» и «b» разного размера, см. Ниже. У меня мало вопросов:

(1) Как я могу скопировать значение «a» в «b»? (т. е. продлить работу)

(2) Как мне скопировать значение «b» в «a»? (т. е. операции trunc)

Благодарю.

a = BitVec('a', 1)
b = BitVec('b', 32)
4
nl ja de

1 ответы

Для расширения мы используем ZeroExt или SignExt . ZeroExt добавит «нули», а SignExt будет «скопировать» бит знака (т. Е. Самый старший бит). Для усечения мы используем Extract , он может извлекать любую подпоследовательность бит. Вот небольшой пример (также доступен в Интернете по адресу raise4fun ).

a = BitVec('a', 1)
b = BitVec('b', 32)
solve(ZeroExt(31, a) == b)
solve(b > 10, Extract(0,0,b) == a)

EDIT: we can use p == (x == 1) to 'assign' a Boolean variable p with the value of a Bit-vector x of size 1, and vice-versa. The formula p == (x == 1) is just stating that p is true if and only if x is 1. Here is an example (also available online here)

x = BitVec('x', 1)
p = Bool('p')

solve(p == (x == 1), x == 0)
solve(p == (x == 1), x == 1)
solve(p == (x == 1), Not(p))
solve(p == (x == 1), p)
7
добавлено
Я просто обновил ответ с помощью случая Bool <-> BitVec (1).
добавлено автор Leonardo de Moura, источник
Лео, ваш ответ потрясающий! Кстати, как я могу присвоить переменную типа Bool другой переменной типа BitVec (1)? Это возможно, учитывая, что эти две переменные фактически имеют одинаковый размер (размер 1 бит). Благодарю.
добавлено автор user311703, источник
Идея иметь «p == (x == 1)» велика, но это может только «присваивать» значение Boolean 'p', заданное значение BitVec (1) 'x'. Как сделать противоположное: заданное значение «p», установить значение «x»? Я пытался использовать «Implies», но это уродливо. У вас есть лучшее решение? Благодарю.
добавлено автор user311703, источник
хм, кажется, я пропустил тот факт, что «p == (x == 1)» фактически выполняет двухсторонние операции: заданный «p», он также устанавливает значение «x», соответственно
добавлено автор user311703, источник