课程背景
这是一门在coursera 著名的课程,强烈建议任何一个从事计算机相关工作的同学看看。学习本课程无需任何先前基础, 你将从最底层开始, 构建一个现代计算机系统。 这段激动人心的路程划分成六个需要上交的项目作业, 从构造基本的逻辑门到完成一个功能完全的通用目的计算机。 你将通过一种直接而有效的方式来完成学习,即了解计算机是如何工作的以及他们是如何被设计出来的。
布尔函数
布尔函数可以由布尔表达式或者真值表来表示
布尔表达式和真值表
-
x And y
x y And 0 0 0 0 1 0 1 0 0 1 1 1 -
x Or y
x | y | Or |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
-
Not x
x Not 0 1 1 0
布尔特征
-
交换原则
- (x And y) = (y And x)
- (x Or y) = (y Or x)
-
组合原则
- (x And (y And z)) = ((x And y) And z)
- (x Or (y Or z)) = ((x Or y) Or z)
-
分离原则
- (x And (y Or z)) = (x And y) Or (x And z)
- (x Or (y And z)) = (x Or y) And (x Or z)
-
德摩根原则
- Not(x And y) = Not(x) Or Not(y)
- Not(x Or y) = Not(x) And Not(y)
布尔代数
-
求:Not(Not(x) And Not(x Or y)) = ?
- 公式推导
Not(Not(x) And Not(x Or y)) = // 根据德摩根原则 Not(Not(x) And (Not(x) And Not(y))) = // 根据组合原则 Not((Not(x) And Not(x)) And Not(y)) = // 根据幂原则 Not(Not(x) And Not(y)) = // 根据德摩根原则 Not(Not(x)) Or Not(Not(y)) = // 双重否定 x Or y
- 穷举归纳法(菜鸟法)
x y 0 0 0 0 1 1 1 0 1 1 1 1 综上 = x Or y
布尔表达式和真值表相互转换
表达式-->真值表
f(x,y,z) = (x And y) Or (Not(x) And z)
遍历代入计算,汇总结果即可
x | y | z | f |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 0 | 0 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
真值表-->表达式
尝试由下列真值表求导出表达式
x | y | z | f |
---|---|---|---|
0 | 0 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 0 |
1 | 1 | 1 | 0 |
-
Step 1
设计一个表达式满足第一行
f1 = f(0,0,0) = Not(x) And Not(y) And Not(z)
-
Step 2
设计一个表达式满足第三行
F3 = f(0,1,0) = Not(x) And y And Not(z)
-
Step 3
设计一个表达式满足第五行
F5 = f(1,0,0) = x And Not(y) And Not(z)
-
Step 4
f=f1 Or f3 Or f5
(Not(x) And Not(y) And Not(z)) Or (Not(x) And y And Not(z)) Or (x And Not(y) And Not(z)) = (Not(x) And Not(z)) Or (x And Not(y) And Not(z)) = (Not(x) And Not(z)) Or (Not(y) And Not(z)) = Not(z) And (Not(x) Or Not(y)) 即 f(x,y,z) = Not(z) And (Not(x) Or Not(y))
Nand闪亮登场
世界不需要Or !
由上述真值表和表达式的相互推导可以得出一个结论。即任何布尔函数、变量是什么都能用And、Or和Not来组合表达。但是我们真的都需要他们吗?其实只要有And 和Not就足够了,因为Or也可以由And和Not推导出来
证明:(x Or y) = Not(Not(x) And Not(y))
那我们还能再精简点吗,比如去掉And 或者 Not?当然不行
不能再少了!
-
如果去掉And
只能传输入一个值,这样就不能进行组合,显然不行
-
如果去掉Not
And特性,如果存在某个值为0,那么结果只能为0,同样不行(因为如果输入存在0,但是输出为1的话就不满足了)
Nand:一个就够了
x Nand y = Not(x And y)
nand自身即可表达计算所有类型
证明(根据上面得出的结论,只要证明Nand能同时表达Not和And即可):
- Not(x) = x Nand x
- x And y = Not(x Nand y) = (x Nand y) Nand (x Nand y)
结论
只需要Nand就能计算所有结果,事实上,计算机正是由一个个Nand门组合而成。我们任何复杂的操作,本质都由一个个Nand组合而成。Awesome!!
阶段总结
我们刚刚完成了关于布尔逻辑的抽象观点。现在我们正在做一个非常有趣的转变,从抽象的逻辑运算到实际的门,以及我们构建计算机的实际门。这一转变实际上没有,就我们所做的事情而言,这两件不同的事情之间没有实际的区别。但这只是我们对他们的思考方式。到目前为止,我们要求你们把一切都看作抽象的布尔逻辑。从现在起,我们将开始要求您将所有内容都视为计算机中的实际小部件,以计算我们想要的功能
-- From Nand to Tetris