Z3 (z3py) опция "elim_and" функции "упрощения ()" всегда включена для битовых векторов - PullRequest
0 голосов
/ 04 июля 2019

Я хотел бы использовать функцию упрощения () z3py, но без изменения побитового и '&' на побитовый или '|'.

Кажется, существует опция под названием "elim_and" дляфункция упрощения, но мне не удается заставить ее работать для побитовых операций.Функция help_simplify () сообщает:

elim_and (bool) соединения переписываются с использованием отрицания и дизъюнкции (по умолчанию: false)

>>> from z3 import *
>>> x = BitVec('x', 8)
>>> y = BitVec('y', 8)
>>> z = x & y
>>> z
x & y
>>> simplify(z)
~(~x | ~y)
>>> simplify(z, elim_and=False)
~(~x | ~y)

Я хотел бы, чтобы результатбыть "х & у".Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 04 июля 2019

В настоящее время это невозможно. Обратите внимание, что elim_and предназначено для логических значений, а не для битовых векторов:

>>> from z3 import *
>>> a = Bool("a")
>>> b = Bool("b")
>>> simplify(And(a, b))
And(a, b)
>>> simplify(And(a, b), elim_and=True)
Not(Or(Not(a), Not(b)))

Нет эквивалента simplify, который управляет этим для битовых векторов. На самом деле, перевод на дизъюнкцию происходит еще до того, как вы вызовете упрощатель, см. Здесь: https://github.com/Z3Prover/z3/blob/master/src/ast/rewriter/bv_rewriter.cpp#L1980-L1988

0 голосов
/ 04 июля 2019

elim_and для логических выражений, а не для битовых векторов.Боюсь, у Z3 нет возможности отключить определенные правила перезаписи.

...