eolas/neuron/674ca64c-a00f-4fd4-88ed-0d1856b37688/Boolean_function_synthesis.md
2024-11-12 08:09:20 +00:00

142 lines
4.5 KiB
Markdown

---
tags:
- propositional-logic
- nand-to-tetris
- logic
---
# Boolean function synthesis
When we looked at
[boolean functions](Boolean_functions.md) we were
working in a particular direction: from a function to a truth table. When we do
Boolean function synthesis we work in the opposite direction: from a truth table
to a function.
This is an important skill that we will use when constructing
[logic circuits](Digital_circuits.md).
We will go from truth conditions (i.e. what we want the circuit to do and when
we want it to do it) to a function expression which is then reduced to its
simplest form and implemented with
[logic gates](Logic_gates.md).
Specifically, NAND gates.
We will show here that a complex logical expression can be reduced to an
equivalent expression that uses only the NAND operator.
## The process
The process proceeds as follows:
1. Work out the truth conditions for the circuit we want to construct
2. Identify the rows where the output is equal to 1
3. For each of these rows construct a Boolean expression that evaluates to that
output
4. Join each expression with OR
5. Reduce these expressions to a single expression in its simplest form
## Example
Let's say we have the following truth table:
| Line | $x$ | $y$ | $z$ | $f$ |
| ---- | --- | --- | --- | --- |
| 1 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 1 | 0 |
| 3 | 0 | 1 | 0 | 1 |
| 4 | 0 | 1 | 1 | 0 |
| 5 | 1 | 0 | 0 | 1 |
| 6 | 1 | 0 | 1 | 0 |
| 7 | 1 | 1 | 0 | 0 |
| 8 | 1 | 1 | 1 | 0 |
We only need to focus on lines 1, 3, and 5 since they have the output 1:
| Line | $x$ | $y$ | $z$ | $f$ |
| ---- | --- | --- | --- | --- |
| 1 | 0 | 0 | 0 | 1 |
| 3 | 0 | 1 | 0 | 1 |
| 5 | 1 | 0 | 0 | 1 |
For each line we construct a Boolean expression that would result in the value
in the $f$ column. In other words we construct the function:
| Line | $x$ | $y$ | $z$ | $f$ |
| ---- | --- | --- | --- | ----------------------------------------- |
| 1 | 0 | 0 | 0 | $\lnot(x) \land \lnot (y) \land \lnot(z)$ |
| 3 | 0 | 1 | 0 | $\lnot(x) \land y \land \lnot(z)$ |
| 5 | 1 | 0 | 0 | $x \land \lnot(y) \land \lnot(z)$ |
We can now join each expression to create a complex expression that covers the
entire truth table using OR:
$$
(\lnot(x) \land \lnot (y) \land \lnot(z)) \\ \lor \\ (\lnot(x) \land y \land \lnot(z)) \\ \lor \\ (x \land \lnot(y) \land \lnot(z))
$$
It's clear that we have transcribed the truth conditions accurately but that we
are doing so in a rather verbose way. We can simplify by just looking at the
position of the 1s in the truth table. Notice:
- $z$ is always 0
- $x$ and $y$ are either 0 or 1 but never both 1 in the same row
So we simplify:
$$
(\lnot(x) \land \lnot(z)) \lor (\lnot(y) \land \lnot(z))
$$
Notice that $\lnot(z)$ is repeated so we can remove the repetition through
[idempotence](Boolean_algebra.md#idempotent-law):
$$
\lnot z \land (\lnot(x) \lor \lnot(y))
$$
The upshot is that we now have a simpler expression that uses only NOT, OR and
AND. These are the fundamental logic gates thus we are able to construct a
circuit that embodies the logic of the expression.
> This is important and is an instance of the general theorem that _any Boolean
> function_ can be represented using an expression containing AND, OR and NOT
> operations
But even this is too complex. We could get rid of the OR and just use AND and
NOT:
We can prove this theorem by showing that an expression with AND, NOT, and OR
can be formulated as an equivalent expression using just NOT and AND:
$$
x \lor y = \lnot(\lnot(x) \land \lnot(y))
$$
| $x$ | $y$ | $x \lor y$ | $\lnot(\lnot(x) \land \lnot(y)$ |
| --- | --- | ---------- | ------------------------------- |
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 |
Finally, we can simplify even further by doing away with AND and NOT and using a
single
[NAND gate](Logic_gates.md#nand-gate)
which embodies the logic of both, being true in all instances where AND would be
false: $\lnot (x \land y)$.
Let's prove the theorem that every logical expression can be formulated as a
NAND function. To do this we need to show that both NOT and AND can be converted
to NAND.
NOT:
$$
\lnot(x) = x \lnot\land x
$$
AND:
$$
x \land y = \lnot(x \lnot\land y)
$$