📅  最后修改于: 2023-12-03 15:12:44.923000             🧑  作者: Mango
本次介绍是关于Sudo GATE 2020 Mock I(2019年12月27日)中的问题4:门。该问题涉及到真值表、逻辑电路和布尔代数方面的知识。
现有两个门,每个门都有两个输入和一个输出。两个门的输入和输出均为布尔类型。下面为两个门的真值表:
门 A:
| Input A | Input B | Output X | | ------- | ------- | -------- | | false | false | true | | false | true | true | | true | false | true | | true | true | false |
门 B:
| Input A | Input B | Output Y | | ------- | ------- | -------- | | false | false | false | | false | true | true | | true | false | true | | true | true | true |
现定义一个新的门,记作门 C,其输入和输出与门 A 和门 B 相同。定义门 C 的真值表如下:
| Input A | Input B | Output Z | | ------- | ------- | -------- | | false | false | true | | false | true | false | | true | false | false | | true | true | true |
请你设计一个电路,其中仅包含门 A、门 B 和门 C,并使得该电路满足下列等式:
$$[( A\lor B) \lor ( \bar {C})] \land [( \bar {A}\lor C) \lor ( \bar {B})] \land [( C\lor B) \lor ( \bar {A})] \land [( A\lor \bar {B}) \lor ( \bar {C})] = \text {true}$$
观察等式中的每一项,都是由两个或多个布尔值的或运算与一个布尔值的或运算组成的。为求出整个等式的真值表,要对这四个由或运算组成的布尔值再使用一次或运算。考虑如何构造这四个运算。
首先观察 $A\lor B$ 的真值表,可以发现,这是一个或门的真值表。为构造它,可以考虑将两个输入均接到一个或门中。
接着观察 $\bar {C}$ 的真值表,可以发现,这是一个非门的真值表。为构造它,可以使用门 A 中的 true 输出,接到一个非门中。
观察 $\bar {A}\lor C$ 的真值表,可以类比 $\bar {C}$,但它是或运算,而非非运算。考虑通过修改门 A 的 true 输出和输入为 false 的输出的值,再接到一个或门中来构造它。
最后,观察 $C\lor B$ 的真值表,可以发现,这是一个或门的真值表。为构造它,可以将输入分别接到门 C 的输入和门 B 的输入,再将它们的输出接到一个或门中。
最终,将这四个由或运算构成的值经由四个或门连接起来,即可得到等式左侧的值。连接一个非门,将其输入连接到等式左侧的值,即可得到等式右侧的值。
# 门| Sudo GATE 2020 Mock I(2019年12月27日)|问题4
## 解题思路
观察等式中的每一项,都是由两个或多个布尔值的或运算与一个布尔值的或运算组成的,因此可通过或门、非门和或门来构造这四个运算。
- 将门 A 的两个输入分别接到一个或门中,得到 $A\lor B$。
- 将门 A 的 true 输出接到一个非门中,将得到 $\bar {C}$。
- 修改门 A 的 true 输出和输入为 false 的输出,接到一个或门中,将得到 $\bar {A}\lor C$。
- 将门 C 的两个输入分别接到门 B 和门 C 的输入上,将它们的输出接到一个或门中,得到 $C\lor B$。
将这四个运算接到四个或门上,再将这四个或门的输出接到一个与门上,即可得到等式左侧的值。再将这个值接到一个非门上,得到等式右侧的值。
## 代码片段
```python
# gate_a、gate_b、gate_c分别为门A、门B、门C的真值表。
# t表示true值,f表示false值。
gate_a = {
('f', 'f'): 't',
('f', 't'): 't',
('t', 'f'): 't',
('t', 't'): 'f'
}
gate_b = {
('f', 'f'): 'f',
('f', 't'): 't',
('t', 'f'): 't',
('t', 't'): 't'
}
gate_c = {
('f', 'f'): 't',
('f', 't'): 'f',
('t', 'f'): 'f',
('t', 't'): 't'
}
# 定义四个门,将它们经由或门连接起来
output_1 = gate_a[(gate_a['t', 'f'], gate_b['t', 'f'])] | gate_c['f', 'f']
output_2 = gate_a[('f', gate_c['f', 't'])] | gate_b['f', 't']
output_3 = gate_b[(gate_c['t', 'f'], gate_b['f', 't'])] | gate_a['f', 'f']
output_4 = gate_a[('t', gate_b['f', 't'])] | gate_c['t', 'f']
output = int(output_1 or output_2 or output_3 or output_4)
# 将等式右侧的值通过非门得到
final_output = not output