A Álgebra Booleana é o fundamento matemático de toda a computação digital. Toda operação que um processador realiza — comparar valores, tomar decisões, armazenar dados — pode ser descrita por combinações de apenas três operações lógicas básicas. Neste artigo, exploramos essa álgebra do zero: das operações fundamentais aos teoremas, das leis de De Morgan à simplificação de circuitos, com exemplos práticos em Python ao longo do caminho.
Contexto histórico #
Em 1854, o matemático inglês George Boole publicou An Investigation of the Laws of Thought, onde propôs um sistema algébrico para representar e manipular proposições lógicas usando os valores 0 (falso) e 1 (verdadeiro). Boole não tinha computadores em mente — estava formalizado o raciocínio lógico em termos matemáticos.
Quase um século depois, em 1937, Claude Shannon percebeu que a Álgebra Booleana podia modelar circuitos elétricos de chaveamento: interruptores abertos correspondem a 0, interruptores fechados a 1. Esse insight transformou a engenharia elétrica e abriu caminho para toda a computação moderna.
Se você já estudou lógica proposicional, vai reconhecer as operações. A diferença está na ênfase: enquanto a lógica proposicional foca em raciocínio formal, a Álgebra Booleana foca em manipulação algébrica e implementação em circuitos. Veja o artigo Lógica para programadores para uma introdução à lógica proposicional.
Variáveis e funções lógicas #
Uma variável booleana (ou variável lógica) só pode assumir dois valores: 0 (falso) e 1 (verdadeiro). Uma função booleana recebe uma ou mais variáveis booleanas como entrada e produz uma saída booleana.
Uma mesma função lógica pode ser representada de quatro formas equivalentes:
- Expressão algébrica: notação compacta usando operadores matemáticos
- Tabela verdade: lista todas as \(2^n\) combinações possíveis de \(n\) variáveis e a saída correspondente
- Símbolo lógico (porta lógica): representação gráfica usada em diagramas de circuitos
- Circuito elétrico equivalente: implementação com chaves e componentes
Para uma função com \(n\) variáveis, a tabela verdade tem \(2^n\) linhas. Com 2 variáveis: 4 linhas. Com 3 variáveis: 8 linhas. Com 10 variáveis: 1024 linhas.
Exemplo: A função \(F(A,B) = \bar{A} \cdot B + A \cdot \bar{B}\) pode ser representada algebricamente, como acabamos de ver, em tabela verdade:
| A | B | \(\bar{A} \cdot B + A \cdot \bar{B}\) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Ou como símbolo lógico (símbolo \(\oplus\), uma porta XOR — veremos adiante), ou como circuito elétrico equivalente. As quatro representações descrevem exatamente o mesmo comportamento.
Operações fundamentais #
As três operações básicas da Álgebra Booleana são suficientes para descrever qualquer função lógica. Na verdade, bastam apenas duas: os conjuntos \(\{\text{AND}, \text{NOT}\}\) e \(\{\text{OR}, \text{NOT}\}\) são funcionalmente completos — qualquer outra operação pode ser construída a partir deles. Esse conceito será desenvolvido em detalhe após as Leis de De Morgan.
AND — Produto lógico #
$$F(A, B, C, \ldots, N) = A \cdot B \cdot C \cdots N$$\(F = 1\) se e somente se todas as entradas forem 1. Para duas variáveis:
| A | B | \(F = A \cdot B\) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Para três variáveis, a tabela verdade tem \(2^3 = 8\) linhas:
| A | B | C | \(F = A \cdot B \cdot C\) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 1 |
Apenas a última linha — quando todas as entradas são 1 — resulta em 1.
A figura abaixo apresenta o símbolo gráfico da porta AND, usado em diagramas de circuito digital:

Analogia elétrica: AND equivale a interruptores em série — a lâmpada só acende se todos os interruptores estiverem fechados, pois a corrente precisa passar por cada um deles. A figura abaixo ilustra esse conceito:

Em Python, a operação AND existe em duas formas:
# Operador lógico (para booleanos, avalia com curto-circuito)
True and True # True
True and False # False
False and True # False ← nem avalia o segundo operando
# Operador bitwise (para inteiros, opera bit a bit)
0b1010 & 0b1100 # 0b1000 = 8
5 & 3 # 1 (0101 & 0011 = 0001)and vs & em Python
and é o operador lógico: retorna um dos operandos (não necessariamente
True/False) e usa avaliação de curto-circuito. & é o operador bitwise:
opera em cada par de bits correspondentes de dois inteiros.
Já abordamos avaliação de curto-circuito aqui anteriormente. Da mesma forma, já vimos os operadores bitwise em outro artigo.
OR — Soma lógica #
$$F(A, B, C, \ldots, N) = A + B + C + \cdots + N$$\(F = 1\) se ao menos uma entrada for 1. Para duas variáveis:
| A | B | \(F = A + B\) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
Para três variáveis:
| A | B | C | \(F = A + B + C\) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
Apenas a primeira linha — quando todas as entradas são 0 — resulta em 0.
A figura abaixo apresenta o símbolo gráfico da porta OR, usado em diagramas de circuito digital:

Analogia elétrica: OR equivale a interruptores em paralelo — a lâmpada acende se qualquer interruptor estiver fechado. A figura abaixo ilustra esse conceito:

Em Python, a operação OR também existe em duas formas:
# Operador lógico
True or False # True
False or False # False
# Operador bitwise
0b1010 | 0b1100 # 0b1110 = 14
5 | 3 # 7 (0101 | 0011 = 0111)NOT — Negação lógica #
$$F(A) = \bar{A}$$Simplesmente inverte a entrada: \(F = 0\) se \(A = 1\), e \(F = 1\) se \(A = 0\).
| A | \(F = \bar{A}\) |
|---|---|
| 0 | 1 |
| 1 | 0 |
NOT é também escrito como \(A’\) ou \(\sim A\). No símbolo lógico, o pequeno círculo (bolinha) na saída indica inversão.
A figura abaixo apresenta o símbolo gráfico da porta NOT, usado em diagramas de circuito digital:

Em Python, a inversão existe em duas formas:
# Operador lógico
not True # False
not False # True
# Operador bitwise (complemento de bits — resultado depende do tamanho do tipo)
~5 # -6 (complemento de dois em inteiros sinalizados)
~0b0101 # ...11111010 (em complemento de dois)
# Para trabalhar com bits positivos, use máscara:
~5 & 0xFF # 250 (0b11111010)Funções derivadas #
As três funções seguintes são derivadas das operações fundamentais. As duas primeiras (NAND e NOR) são especialmente importantes para a fabricação de circuitos.
NAND — NOT AND (Não E) #
$$F(A, B, \ldots, N) = \overline{A \cdot B \cdots N}$$\(F = 0\) se e somente se todas as entradas forem 1 (complemento do AND).
| A | B | \(F = \overline{A \cdot B}\) |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
NAND é uma das portas mais baratas de fabricar em tecnologia CMOS (Complementary Metal-Oxide-Semiconductor, padrão dominante na fabricação de circuitos integrados). Veremos adiante que isso tem uma consequência fundamental para o projeto de chips.
A figura abaixo apresenta o símbolo gráfico da porta NAND, usado em diagramas de circuito digital:

Podemos definir a função NAND em Python usando as operações lógicas básicas:
def nand(a, b):
return not (a and b)
nand(True, True) # False
nand(True, False) # True
nand(False, True) # True
nand(False, False) # TrueNOR — NOT OR (Não OU) #
$$F(A, B, \ldots, N) = \overline{A + B + \cdots + N}$$\(F = 1\) se e somente se todas as entradas forem 0 (complemento do OR).
| A | B | \(F = \overline{A + B}\) |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
Assim como NAND, a porta NOR ocupa área de silício mínima em CMOS. Por esse motivo, ambas são amplamente preferidas na fabricação de chips — razão que exploraremos em detalhe adiante.
A figura abaixo apresenta o símbolo gráfico da porta NOR, usado em diagramas de circuito digital:

Podemos definir a função NOR em Python usando as operações lógicas básicas:
def nor(a, b):
return not (a or b)
nor(False, False) # True
nor(True, False) # FalseXOR — Exclusive OR (Ou Exclusivo) #
$$F(A, B) = A \oplus B = A \cdot \bar{B} + \bar{A} \cdot B$$\(F = 1\) quando exatamente uma das entradas é 1 (entradas diferentes).
| A | B | \(F = A \oplus B\) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
XOR é 1 quando o número de entradas em 1 é ímpar. É a base dos circuitos de detecção de paridade e do meio-somador binário.
A figura abaixo apresenta o símbolo gráfico da porta XOR, usado em diagramas de circuito digital:

Exemplos em Python:
# Operador bitwise XOR
5 ^ 3 # 6 (0101 ^ 0011 = 0110)
True ^ True # False (0 ^ 0 = 0... ou 1 ^ 1 = 0, ambos 0)
True ^ False # True
# Propriedade interessante: A ^ A = 0, A ^ 0 = A
x = 42
x ^ x # 0 (qualquer valor XOR ele mesmo = 0)
x ^ 0 # 42 (qualquer valor XOR 0 = ele mesmo)O XOR possui duas propriedades de simetria úteis na manipulação de expressões:
- Inverter ambas as entradas não altera a saída: \(A \oplus B = \bar{A} \oplus \bar{B}\)
- Inverter apenas uma entrada inverte a saída: \(A \oplus \bar{B} = \overline{A \oplus B}\)
Como exercício, tente demonstrar essas identidades usando a definição \(A \oplus B = A\bar{B} + \bar{A}B\) em conjunto com as leis de De Morgan.
Tabela comparativa das 6 portas #
A tabela abaixo reúne as características essenciais das seis portas estudadas:
| Porta | Expressão | Saída = 1 quando… | Universalidade |
|---|---|---|---|
| AND | \(A \cdot B\) | Todas as entradas = 1 | Não |
| OR | \(A + B\) | Pelo menos uma entrada = 1 | Não |
| NOT | \(\bar{A}\) | Entrada = 0 | Não |
| NAND | \(\overline{A \cdot B}\) | Nem todas as entradas = 1 | Sim |
| NOR | \(\overline{A + B}\) | Nenhuma entrada = 1 | Sim |
| XOR | \(A \oplus B\) | Entradas diferentes | Não |
O diagrama abaixo evidencia as relações de derivação: NAND e NOR resultam de aplicar NOT à saída de AND e OR, respectivamente; XOR é uma restrição do OR ao caso de entradas distintas:
graph TD
subgraph Básicas["Operações Básicas"]
AND["AND: A·B
F=1 se todos=1"]
OR["OR: A+B
F=1 se algum=1"]
NOT["NOT: Ā
Inverte a entrada"]
end
subgraph Derivadas["Derivadas"]
NAND["NAND: NOT(A·B)
F=0 se todos=1"]
NOR["NOR: NOT(A+B)
F=1 se todos=0"]
XOR["XOR: A⊕B
F=1 se entradas diferentes"]
end
AND -->|NOT na saída| NAND
OR -->|NOT na saída| NOR
OR -->|restrição| XOR
Postulados da Álgebra de Boole #
Os postulados são as regras básicas aceitas sem demonstração formal. Eles formam a base sobre a qual todos os teoremas e propriedades são construídos.
| # | Postulado | Forma AND (·) | Forma OR (+) |
|---|---|---|---|
| 1 | Variável binária | \(A \in \{0, 1\}\) | \(A \in \{0, 1\}\) |
| 2 | Constante com 0 | \(0 \cdot 0 = 0\) | \(0 + 0 = 0\) |
| 3 | Constante com 1 | \(1 \cdot 1 = 1\) | \(1 + 1 = 1\) |
| 4 | Misto | \(1 \cdot 0 = 0\) | \(1 + 0 = 1\) |
| 5 | Complemento | \(\bar{1} = 0\) | \(\bar{0} = 1\) |
Observe a dualidade: em geral, trocando AND por OR e 0 por 1 (e vice-versa), obtemos outro postulado válido. Essa simetria se repete em todo o sistema.
Teoremas #
Os teoremas são consequências derivadas dos postulados:
| # | Teorema | Forma AND (·) | Forma OR (+) | Nome |
|---|---|---|---|---|
| 1 | \(A \cdot 0 = 0\) | \(A + 0 = A\) | Elemento absorvente / neutro | |
| 2 | \(A \cdot 1 = A\) | \(A + 1 = 1\) | Elemento neutro / absorvente | |
| 3 | \(A \cdot A = A\) | \(A + A = A\) | Idempotência | |
| 4 | \(A \cdot \bar{A} = 0\) | \(A + \bar{A} = 1\) | Complemento | |
| 5 | \(\bar{\bar{A}} = A\) | \(\bar{\bar{A}} = A\) | Dupla negação | |
| 6 | \(A(A+B) = A\) | \(A + AB = A\) | Absorção | |
| 7 | \(A(\bar{A}+B) = AB\) | \(A + \bar{A}B = A + B\) | Absorção expandida |
Observe nos Teoremas 1 e 2 que os papéis de 0 e 1 se invertem dependendo da operação matemática:
- Na operação AND (\(\cdot\)), o 1 é o elemento neutro (\(A \cdot 1 = A\)) e o 0 é o elemento absorvente (\(A \cdot 0 = 0\), a saída é forçada para zero).
- Na operação OR (\(+\)), o 0 é o elemento neutro (\(A + 0 = A\)) e o 1 é o elemento absorvente (\(A + 1 = 1\), a saída é forçada para um).
Verificação em Python: idempotência e complemento
# Idempotência: A & A = A, A | A = A
for a in (0, 1):
assert (a & a) == a, f"Falhou para a={a}"
assert (a | a) == a, f"Falhou para a={a}"
# Complemento: A & ~A = 0, A | ~A = 1 (para 1 bit)
for a in (0, 1):
comp = 1 - a # complemento de 1 bit
assert (a & comp) == 0
assert (a | comp) == 1
print("Todos os teoremas verificados!")Propriedades algébricas #
As propriedades a seguir regem como os operadores se comportam quando combinamos múltiplas variáveis entre si — são as ferramentas essenciais para a manipulação e simplificação de expressões booleanas.
Comutativa #
$$A \cdot B = B \cdot A \qquad A + B = B + A$$A ordem dos operandos não altera o resultado — assim como na multiplicação e adição comum.
Associativa #
$$A \cdot (B \cdot C) = (A \cdot B) \cdot C$$$$A + (B + C) = (A + B) + C$$
O agrupamento não importa — podemos omitir parênteses em sequências de AND ou de OR.
Distributiva #
$$A \cdot (B + C) = A \cdot B + A \cdot C$$Essa é análoga à distributividade da multiplicação sobre a adição na álgebra comum. Mas a Álgebra Booleana tem uma segunda forma distributiva sem equivalente na álgebra comum:
$$A + (B \cdot C) = (A + B) \cdot (A + C)$$
Prova da distributividade do OR
$$= A + AC + AB + BC \quad \text{(idempotência: }A \cdot A = A\text{)}$$
$$= A(1 + C + B) + BC$$
$$= A \cdot 1 + BC \quad \text{(elemento absorvente: }1 + X = 1\text{)}$$
$$= A + BC \quad \checkmark$$
Leis de De Morgan #
As leis de De Morgan são os teoremas mais importantes para manipulação e simplificação de expressões booleanas:
$$\overline{A + B + C + \cdots + N} = \bar{A} \cdot \bar{B} \cdot \bar{C} \cdots \bar{N}$$
Regra mnemônica: “Quebra a barra, inverte a operação (· vira +, + vira ·), inverte cada variável.”
Prova tabular para duas variáveis #
Primeira lei: \(\overline{A \cdot B} = \bar{A} + \bar{B}\)
| A | B | \(\bar{A}\) | \(\bar{B}\) | \(\overline{A \cdot B}\) | \(\bar{A} + \bar{B}\) |
|---|---|---|---|---|---|
| 0 | 0 | 1 | 1 | 1 | 1 ✓ |
| 0 | 1 | 1 | 0 | 1 | 1 ✓ |
| 1 | 0 | 0 | 1 | 1 | 1 ✓ |
| 1 | 1 | 0 | 0 | 0 | 0 ✓ |

Segunda lei: \(\overline{A + B} = \bar{A} \cdot \bar{B}\)
| A | B | \(\bar{A}\) | \(\bar{B}\) | \(\overline{A + B}\) | \(\bar{A} \cdot \bar{B}\) |
|---|---|---|---|---|---|
| 0 | 0 | 1 | 1 | 1 | 1 ✓ |
| 0 | 1 | 1 | 0 | 0 | 0 ✓ |
| 1 | 0 | 0 | 1 | 0 | 0 ✓ |
| 1 | 1 | 0 | 0 | 0 | 0 ✓ |

Equivalências de circuito #
As leis de De Morgan revelam quatro formas de implementar cada porta usando combinações de outras portas. Isso é fundamental para padronizar projetos usando apenas NAND ou apenas NOR:
| Equivalência | Expressão | Leitura |
|---|---|---|
| 1 | \(\overline{AB} = \bar{A}+\bar{B}\) | NAND(A,B) = OR com entradas invertidas |
| 2 | \(\overline{A+B} = \bar{A}\cdot\bar{B}\) | NOR(A,B) = AND com entradas invertidas |
| 3 | \(A \cdot B = \overline{\bar{A}+\bar{B}}\) | AND(A,B) = NOR com entradas invertidas |
| 4 | \(A + B = \overline{\bar{A}\cdot\bar{B}}\) | OR(A,B) = NAND com entradas invertidas |
As equivalências 1 e 2 já foram mostradas na forma de circuitos lógicos equivalentes na seção anterior. As equivalências 3 e 4 podem ser visualizadas nas duas figuras abaixo:


Em tecnologia CMOS, portas NAND e NOR ocupam menos área de silício que AND e OR. Com as equivalências de De Morgan, qualquer projeto pode ser implementado usando apenas um tipo de porta, reduzindo complexidade de fabricação.
# Verificando De Morgan em Python com operadores bitwise
def de_morgan_1(a, b):
"""NOT(A AND B) deve ser igual a (NOT A) OR (NOT B)"""
lado_esq = ~(a & b)
lado_dir = (~a) | (~b)
return lado_esq == lado_dir
def de_morgan_2(a, b):
"""NOT(A OR B) deve ser igual a (NOT A) AND (NOT B)"""
lado_esq = ~(a | b)
lado_dir = (~a) & (~b)
return lado_esq == lado_dir
# Verificar para todos os valores de 1 bit
for a in (0, 1):
for b in (0, 1):
assert de_morgan_1(a, b), f"De Morgan 1 falhou: a={a}, b={b}"
assert de_morgan_2(a, b), f"De Morgan 2 falhou: a={a}, b={b}"
print("Leis de De Morgan verificadas para 1 bit!")Universalidade das portas (Completude Funcional) #
As portas NAND e NOR, além de baratas de fabricar, possuem uma propriedade notável: cada uma delas é funcionalmente completa por si só. Isso significa que, com um estoque infinito de apenas um desses tipos de porta, é possível reconstruir qualquer outra porta lógica e, consequentemente, qualquer circuito digital.
Essa propriedade é o que permite que a indústria padronize a fabricação de chips complexos usando bilhões de componentes idênticos (geralmente portas NAND em tecnologia CMOS).
Construindo a lógica básica com NAND #
Para provar a completude funcional da NAND (\(\overline{A \cdot B}\)), veja como ela pode assumir o papel das três operações fundamentais:
-
NOT a partir de NAND: Basta interligar as duas entradas da porta NAND. Pela lei da idempotência (\(A \cdot A = A\)), a saída será a negação da entrada.
$$F = \overline{A \cdot A} = \bar{A}$$ -
AND a partir de NAND: Como a NAND é um “AND invertido”, basta inverter a sua saída usando uma segunda NAND configurada como NOT.
$$F = \overline{(\overline{A \cdot B}) \cdot (\overline{A \cdot B})} = A \cdot B$$ -
OR a partir de NAND: Pelas Leis de De Morgan (\(\overline{A \cdot B} = \bar{A} + \bar{B}\)), invertemos as entradas individualmente antes de passá-las por uma terceira porta NAND.
$$F = \overline{\bar{A} \cdot \bar{B}} = \bar{\bar{A}} + \bar{\bar{B}} = A + B$$
Tente realizar o mesmo exercício usando apenas portas NOR. O raciocínio é análogo, partindo da dualidade da Álgebra Booleana (apresentada na seção de Postulados): como você construiria um NOT, um OR e um AND usando apenas a função \(\overline{A+B}\)?
Solução do desafio: lógica básica com NOR
Assim como a NAND, a porta NOR (\(\overline{A + B}\)) também é funcionalmente completa. A lógica de construção é espelhada em relação à NAND, graças à dualidade da Álgebra Booleana:
1. NOT a partir de NOR: Interligamos as duas entradas. Pela lei da idempotência (\(A + A = A\)), a saída será a negação da entrada.
$$F = \overline{A + A} = \bar{A}$$2. OR a partir de NOR: Como a NOR é um “OR invertido”, basta inverter a sua saída usando uma segunda NOR configurada como NOT (conforme o passo 1).
$$F = \overline{(\overline{A + B}) + (\overline{A + B})} = A + B$$3. AND a partir de NOR: Pela segunda Lei de De Morgan (\(\overline{A + B} = \bar{A} \cdot \bar{B}\)), invertemos as entradas \(A\) e \(B\) individualmente (usando NORs como inversores) e aplicamos o resultado a uma terceira porta NOR.
$$F = \overline{\bar{A} + \bar{B}} = \bar{\bar{A}} \cdot \bar{\bar{B}} = A \cdot B$$Simplificação de expressões lógicas #
Por que simplificar? #
Expressões mais simples correspondem a circuitos com menos portas lógicas, o que significa:
- Menor custo de fabricação (menos componentes)
- Maior velocidade (menos atrasos de propagação)
- Menor consumo de energia
A simplificação usa os postulados e teoremas da álgebra para reescrever uma expressão em forma equivalente, mas com menos termos ou variáveis.
Exemplos resolvidos #
Os exemplos a seguir aplicam progressivamente as ferramentas vistas — de propriedades simples ao Teorema do Consenso —, mostrando o raciocínio algébrico passo a passo:
Exemplo 1 — Propriedade distributiva do OR
Mostrar que \(A + BC = (A + B)(A + C)\)
$$(A+B)(A+C) = AA + AC + AB + BC$$$$= A + AC + AB + BC \quad \text{(idempotência)}$$
$$= A(1 + C + B) + BC$$
$$= A + BC \quad \checkmark \quad \text{(elemento absorvente: } 1 + X = 1\text{)}$$
Exemplo 2 — Absorção expandida
Mostrar que \(A + \bar{A}B = A + B\)
$$A + \bar{A}B = A + AB + \bar{A}B \quad \text{(absorção: } A = A + AB\text{)}$$$$= A + B(A + \bar{A})$$
$$= A + B \cdot 1 = A + B \quad \checkmark$$
Exemplo 3 — Simplificação com três variáveis
Simplificar \(F(x,y,z) = \bar{x}yz + x\bar{y}z + xy\bar{z} + xyz\)
$$F = \bar{x}yz + x\bar{y}z + xy(\bar{z} + z)$$$$= \bar{x}yz + x\bar{y}z + xy \quad \text{(complemento: } \bar{z} + z = 1\text{)}$$
$$= y(\bar{x}z + x) + x\bar{y}z$$
$$\text{Aplicando Absorção expandida com } A=x, B=z: \quad \bar{x}z + x = x + z$$
$$= y(x + z) + x\bar{y}z = xy + yz + x\bar{y}z$$
$$= yz + x(y + \bar{y}z) = yz + x(y + z) \quad \text{(Absorção expandida novamente)}$$
$$\boxed{F(x,y,z) = xy + xz + yz}$$
O resultado \(xy + xz + yz\) é a função votador majoritário para 3 variáveis: a saída é 1 quando pelo menos 2 das 3 entradas são 1.
Exemplo 4 — Teorema do Consenso
Mostrar que \(AB + \bar{A}C + BC = AB + \bar{A}C\)
O termo \(BC\) é redundante — toda combinação que o torna 1 já é coberta pelos outros dois termos:
- Quando \(A = 1\): \(BC\) só é 1 se \(B = C = 1\), mas \(AB\) já cobre esse caso.
- Quando \(A = 0\): \(BC\) só é 1 se \(B = C = 1\), mas \(\bar{A}C\) já cobre esse caso.
Formalmente:
$$AB + \bar{A}C + BC = AB + \bar{A}C + BC(A + \bar{A})$$$$= AB + \bar{A}C + ABC + \bar{A}BC$$
$$= AB(1 + C) + \bar{A}C(1 + B)$$
$$= AB + \bar{A}C \quad \checkmark$$
Exemplo 5 — Simplificação radical
Simplificar \(F(x,y,z) = xyz + \bar{x}y\bar{z} + \bar{x}yz + xy\bar{z}\)
Reagrupando os termos que compartilham \(y\):
$$F = xy(z + \bar{z}) + \bar{x}y(\bar{z} + z)$$$$= xy \cdot 1 + \bar{x}y \cdot 1 \quad \text{(complemento: } z + \bar{z} = 1\text{)}$$
$$= y(x + \bar{x}) = y \cdot 1$$
$$\boxed{F(x,y,z) = y}$$
Uma expressão com 4 termos e 12 literais reduz-se a uma única variável. O resultado significa que a saída é 1 exatamente quando \(y = 1\), independentemente dos valores de \(x\) e \(z\).
Exemplo 6 — Análise de circuito com simplificação
Simplificar \(F(A,B) = (A \oplus B) + B\)
Expandindo o XOR: \(A \oplus B = \bar{A}B + A\bar{B}\)
$$F = \bar{A}B + A\bar{B} + B$$$$= B(\bar{A} + 1) + A\bar{B}$$
$$= B + A\bar{B} \quad \text{(elemento absorvente: } 1 + X = 1\text{)}$$
Aplicando Absorção expandida com \(X = B\): \(B + \bar{B}A = B + A\)
$$\boxed{F(A,B) = A + B}$$O circuito complexo (XOR + OR) simplifica para uma única porta OR!
Exercícios de análise de circuitos #
Nos exercícios a seguir, partimos de um diagrama de circuito para obter e simplificar a expressão lógica da saída. Essa habilidade é essencial para compreender como circuitos reais funcionam e como otimizá-los.
Exercício 1 — Determinar a expressão lógica para a saída \(F\):

É comum nesse tipo de exercício identificar as saídas intermediárias para facilitar a análise. Elas já foram sinalizadas no diagrama acima como \(F1\) e \(F2\).
No circuito acima, identificamos as saídas intermediárias:
- \(F1 = A\bar{B}\)
- \(F2 = \bar{B} \oplus C = \bar{B} \bar{C} + BC\)
- \(F = F1 + F2\)
Exercício 2 — Determinar a expressão lógica para a saída \(F\) do circuito abaixo:

Assim como no exercício anterior, identificamos as saídas intermediárias:
- \(F1 = \overline{A \oplus B} = \overline{\bar{A}B + A\bar{B}} = AB + \bar{A}\bar{B}\)
- \(F2 = \bar{B}\)
- \(F = \overline{F1 + F2} = \overline{AB + \bar{A}\bar{B} + \bar{B}} \)
Simplificando:
$$ \begin{align*} F &= \overline{AB + \bar{A}\bar{B} + \bar{B}} \\ &= \overline{\bar{B}(1 + \bar{A}) + AB} \\ &= \overline{\bar{B} + AB} \\ &= \overline{\bar{B} + A} \text{ (Absorção expandida)} \\ &= \bar{A}B \text{ (De Morgan)} \\ \end{align*} $$Ou seja, a expressão original do circuito é equivalente a \(F = \bar{A}B\), que pode ser implementada com um único AND e um inversor, como mostrado no diagrama abaixo:

Exercício 3 — Desenhe o circuito correspondente a expressão abaixo. Faça o desenho antes de simplificar a expressão, e depois simplifique para obter um circuito mais eficiente.
$$F = \overline{\bar{A}BC} + BC$$Antes da simplificação, o circuito correspondente à expressão é:

Simplificando a expressão:
$$ \begin{align*} F &= \overline{\bar{A}BC} + BC \\ &= A + \bar{B} + \bar{C} + BC \quad &\text{(De Morgan)} \\ &= A + \bar{B} + C + \bar{C} \quad &\text{(absorção expandida: } \bar{B} + BC = \bar{B} + C\text{)} \\ &= A + \bar{B} + 1 \quad &\text{(complemento: } C + \bar{C} = 1\text{)} \\ &= 1 \quad &\text{(elemento absorvente: } X + 1 = 1\text{)} \end{align*} $$A expressão é uma tautologia — a saída é sempre 1, independentemente de A, B e C. Representando isso em um circuito lógico, temos:

A figura acima ilustra uma porta inversora (NOT) com a sua entrada fisicamente conectada ao terra (representado pelo símbolo de linhas horizontais, o que equivale a 0 volts). Na Álgebra Booleana, isso representa visualmente o postulado da negação: \(\bar{0} = 1\).
Do ponto de vista da engenharia de hardware, esse é um circuito real e indispensável. Em chips reais (especialmente na tecnologia CMOS), as entradas das portas lógicas que não estão sendo usadas nunca devem ser deixadas desconectadas (“flutuantes”). Pinos soltos agem como pequenas antenas que captam ruídos eletromagnéticos do ambiente, causando instabilidade no componente. Ao aterrar a entrada (forçando um “0” contínuo), garante-se a segurança do circuito e obtém-se um nível lógico “1” constante e limpo na saída.
Exercício 4 — Dado o circuito a seguir, obter a expressão simplificada para \(F\):

Identificando as saídas intermediárias passo a passo:
Passo 1:
- \(F_1 = \overline{A + B} = \bar{A}\bar{B}\) — porta NOR
Passo 2:
- \(F_2 = \overline{F_1 \cdot \bar{B} \cdot C} = \overline{\bar{A}\bar{B} \cdot \bar{B} \cdot C} = \overline{\bar{A}\bar{B}C}\) (usando \(\bar{B} \cdot \bar{B} = \bar{B}\) — idempotência)
- Pelo De Morgan: \(F_2 = A + B + \bar{C}\)
Passo 3:
- \(F = \overline{F_1 \cdot F_2} = \overline{F_1} + \overline{F_2}\)
Aplicando Teorema 7 duas vezes:
$$A + \bar{A}\bar{B}C = A + \bar{B}C \qquad \text{e então} \qquad B + \bar{B}C = B + C$$$$\boxed{F(A,B,C) = A + B + C}$$Um circuito aparentemente complexo (NOR + NAND + NAND) equivale a uma simples porta OR de 3 entradas! O circuito equivalente é mostrado abaixo:

Python na prática #
Para além dos exemplos isolados, Python oferece formas diretas de explorar a Álgebra Booleana.
Operadores bitwise: resumo #
Os principais operadores bitwise de Python e seus equivalentes booleanos, aplicados a valores inteiros:
a, b = 0b1010, 0b1101 # 10 e 13 em decimal
print(f"a AND b : {a & b:04b} = {a & b}") # 1000 = 8
print(f"a OR b : {a | b:04b} = {a | b}") # 1111 = 15
print(f"a XOR b : {a ^ b:04b} = {a ^ b}") # 0111 = 7
print(f"NOT a : {~a}") # -11 (complemento de dois)
print(f"NOT a (4 bits): {~a & 0xF:04b}") # 0101 = 5Verificando propriedades com Python #
def verifica_boole(n_bits=4):
"""Verifica as principais propriedades para todos os valores de n_bits."""
limite = 2**n_bits
mascara = limite - 1 # ex: 0b1111 para 4 bits
erros = []
for a in range(limite):
comp_a = (~a) & mascara # complemento de n_bits de a
# Idempotência
if (a & a) != a: erros.append(f"Idem AND: a={a}")
if (a | a) != a: erros.append(f"Idem OR: a={a}")
# Complemento
if (a & comp_a) != 0: erros.append(f"Comp AND: a={a}")
if (a | comp_a) != mascara: erros.append(f"Comp OR: a={a}")
# Dupla negação
if ((~comp_a) & mascara) != a: erros.append(f"Dupla neg: a={a}")
for b in range(limite):
# Comutativa
if (a & b) != (b & a): erros.append(f"Comut AND: a={a}, b={b}")
if (a | b) != (b | a): erros.append(f"Comut OR: a={a}, b={b}")
# De Morgan
if (~(a & b) & mascara) != ((~a | ~b) & mascara):
erros.append(f"De Morgan 1: a={a}, b={b}")
if (~(a | b) & mascara) != ((~a & ~b) & mascara):
erros.append(f"De Morgan 2: a={a}, b={b}")
if erros:
print("Erros encontrados:", erros)
else:
print(f"Todas as propriedades verificadas para {n_bits} bits!")
verifica_boole(4)
# Todas as propriedades verificadas para 4 bits!Uso prático: bitmasks em permissões de arquivo #
Um caso de uso clássico de Álgebra Booleana em sistemas é o controle de permissões. Em sistemas Unix/Linux, as permissões de arquivo são armazenadas como bits:
# Permissões de arquivo Unix (os módulos stat do Python)
LEITURA = 0b100 # 4
ESCRITA = 0b010 # 2
EXECUCAO = 0b001 # 1
# Uma permissão de "leitura e execução" (sem escrita):
permissao = LEITURA | EXECUCAO # 0b101 = 5
# Verificar se tem permissão de leitura:
tem_leitura = bool(permissao & LEITURA) # True
# Adicionar permissão de escrita:
permissao = permissao | ESCRITA # OR: adiciona o bit
# Remover permissão de execução:
permissao = permissao & ~EXECUCAO # AND com complemento: zera o bit
# Verificar permissão exata:
tem_exatamente_leitura = (permissao & LEITURA) == LEITURAEsses exemplos mostram que a Álgebra Booleana está presente em tarefas cotidianas de programação — do controle de acesso à manipulação de dados em nível de bits.
Conclusão #
A Álgebra Booleana é muito mais do que teoria abstrata — é a linguagem com que processadores, memórias e todos os circuitos digitais são projetados. Dominar suas operações, postulados, teoremas e as leis de De Morgan é fundamental para:
- Entender como processadores executam operações lógicas e aritméticas
- Projetar e otimizar circuitos digitais
- Usar corretamente operadores bitwise em Python e outras linguagens
- Compreender sistemas de permissões, protocolos de rede e criptografia
Os exercícios de simplificação mostram que expressões aparentemente complexas frequentemente se reduzem a formas muito simples — e cada simplificação representa circuitos mais rápidos, menores e mais eficientes.
Num próximo artigo, exploraremos métodos sistemáticos de simplificação: Mintermos, Maxtermos e Mapas de Karnaugh — ferramentas que permitem encontrar a forma mínima de qualquer função lógica de forma metódica.