证明布尔表达式

时间:2018-11-18 10:52:42

标签: bit-manipulation z3 boolean-algebra

>>> import z3  
>>> X = z3.BitVec('X', 32)  
>>> z3.prove( X^18 == ((X|(~44)) & (X^62)) + (X&44) )  
proved  

x ^ 18 等同于((x |(〜44))&(x ^ 62))+(x&44) ??

怎么可能?
我想了解有关证明此公式的详细信息...

1 个答案:

答案 0 :(得分:2)

您可以将(中间)位向量显示为每个8位的符号集:

| X                       |   x7 |   x6 |   x5 |   x4 |   x3 |   x2 |   x1 |   x0  |
| 44                      |    0 |    0 |    1 |    0 |    1 |    1 |    0 |    0  |
| ~44                     |    1 |    1 |    0 |    1 |    0 |    0 |    1 |    1  |
| X|(~44)                 |    1 |    1 |   x5 |    1 |   x3 |   x2 |    1 |    1  |
| 62                      |    0 |    0 |    1 |    1 |    1 |    1 |    1 |    0  |
| X^62                    |   x7 |   x6 |  !x5 |  !x4 |  !x3 |  !x2 |  !x1 |   x0  |
| (X|(~44))&(X^62)        |   x7 |   x6 |    0 |  !x4 |    0 |    0 |  !x1 |   x0  |
| X&44                    |    0 |    0 |   x5 |    0 |   x3 |   x2 |    0 |    0  |
| (X|(~44))&(X^62)+(X&44) |   x7 |   x6 |   x5 |  !x4 |   x3 |   x2 |  !x1 |   x0  |
| X^18                    |   x7 |   x6 |   x5 |  !x4 |   x3 |   x2 |  !x1 |   x0  |

6位就足够了,因为62可以用6位来表示。

加法步骤不能产生进位位,因为所有对应的位对每个都有一个零位。其他操作仅具有按位效果。因此,人们可以逐位分析等效位。

最后两行表显示表达式实际上是等效的。