# 布尔代数

布尔代数又叫逻辑演算,是使用数学方法研究逻辑问题的学科,他用等式表示判断,把推理看作等式的变换.这种变换的有效性不依赖人们对符号的解释,只依赖于符号的组合规律.布尔代数究是非常重要的数学分支,电子,计算机等学科都是建立在其之上.

SymPy对逻辑演算也有支持,使用的是子模块`sympy.logic`下.


```python
from sympy import init_printing
init_printing(use_unicode=True)
```

## 基本的布尔运算


布尔代数研究的对象取值范围就是真值`true`和假值`false`,基本操作也只有4个:与`&(And)`,或`|(Or)`,非`~(Not)`,symbol对象可以直接使用对应运算符构造表达式


```python
from sympy import symbols
x, y = symbols('x,y')
```


```python
y | (x & y)
```


```python
x | y
```


```python
~x
```

要代入值计算布尔代数表达式只要使用`.subs`接口即可.


```python
from sympy.logic import true,false
```


```python
(y & x).subs({x: true, y: true})
```




$\displaystyle \text{True}$



注意Sympy下的true,false不等同于python中的True,False,要做判断需要使用`if`.千万不要使用`==`或`is`


```python
True if true else False
```




    True




```python
True if false else False
```




    False




```python
True == true
```




    True




```python
False == false
```




    True




```python
True is true
```




    False




```python
False is false
```




    False



## 扩展的布尔运算

在实际使用中布尔运算常用的运算符往往是上面三个基本运算符的组合,SymPy还支持的运算符包括:

运算符接口|运算符|含义
---|---|---
`^(Xor)`|异或|同则false,异则true
`Nand`|与非门|当输入均为true ,则输出为false;若输入中至少有一个为false,则输出为true
`Nor`|或非门|当输入均为false,则输出为true;若输入中至少有一个为true,则输出为false
` >> (Implies)`|蕴含|相当于`！A \| B`,`<<`代表逆蕴含
`Equivalent`|等价|相当于当一个为true时另一个也为true;当一个为false时另一个也为false


```python
x ^ y
```


```python
from sympy.logic import Nand,Nor,Equivalent
```


```python
Nand(x, y)
```


```python
Nor(x, y)
```


```python
x >> y
```


```python
Equivalent(x,y)
```

## ITE

这个方法在`sympy.logic.boolalg`下,`ITE`是一个三元运算符,含义就和python中的`xxx if xxx else ...`一样.


```python
from sympy.logic.boolalg import ITE
```


```python
ITE(true | false, true & true, true ^ true)
```




$\displaystyle \text{True}$



## 合取范式和析取范式

SymPy中可以使用`to_cnf(expr, simplify=False)`将逻辑表达式转换为合取范式,使用`is_cnf(expr)`判断表达式是否符合合取范式;使用`to_dnf(expr, simplify=False)`将逻辑表达式转换为析取范式,使用`is_dnf(expr)`判断表达式是否符合析取范式.


```python
from sympy.abc import A, B, D
from sympy.logic.boolalg import to_cnf,is_cnf
```


```python
expr = ~(A | B) | D
expr
```


```python
expr_cnf = to_cnf(expr)
expr_cnf
```


```python
is_cnf(expr)
```




    False




```python
is_cnf(expr_cnf)
```




    True



+ todo `SOP Form`和`POS Form`
+ 形式化简
+ 逻辑推断


```python

```

a0d294c23f70245967f6e3d0c300c8394472bf02
ipynb
Jupyter Notebook
src/数据分析篇/工具介绍/SymPy/符号计算/.ipynb_checkpoints/布尔代数-checkpoint.ipynb
hsz1273327/TutorialForDataScience
1d8e72c033a264297e80f43612cd44765365b09e
MIT
src/数据分析篇/工具介绍/SymPy/符号计算/.ipynb_checkpoints/布尔代数-checkpoint.ipynb
hsz1273327/TutorialForDataScience
1d8e72c033a264297e80f43612cd44765365b09e
MIT
2020-03-31T03:36:05.000Z
2020-03-31T03:36:21.000Z
src/数据分析篇/工具介绍/SymPy/符号计算/.ipynb_checkpoints/布尔代数-checkpoint.ipynb
hsz1273327/TutorialForDataScience
1d8e72c033a264297e80f43612cd44765365b09e
MIT
Qwen/Qwen-72B
1. YES
2. YES