Faça assim para simplificar Expressões Lógicas
07/02/2025
Como simplificar expressões lógicas usando Álgebra Booleana, Mapas de Karnaugh e ferramentas como CircuitVerse e Logisim. Id: 49

🔢 Simplificação de Expressão Lógica
📌 Introdução
A simplificação de expressões lógicas é fundamental na otimização de circuitos digitais e na redução da complexidade computacional. Em sistemas embarcados e aplicações industriais, expressões lógicas mais simples resultam em menor consumo de energia, maior eficiência e menor custo de implementação pois necessitam de menos componentes.
Na área da programação, muitas vezes ocorre de o programador se deparar com um complexo aninhamento de expressões lógicas, em um fluxo de controle (ifs, elses, do cases..). Não raro, é possível encontrar expressões equivalentes lógicas simplificadas. É isso o que mostraremos neste artigo.
💡 Contexto e Necessidade
As expressões lógicas são utilizadas nas mais diversas áreas, em sistemas eletrônicos e softwares. A formulação correta e eficiente das regras de implementação da funções lógicas e dos circuitos equivalentes evita falhas e otimiza a segurança do sistema, além de tornar os códigos mais simples e legíveis.
🔬 Fundamentos Teóricos
📘 Álgebra Booleana
A Álgebra Booleana é a base da lógica digital. Ela se fundamenta em operações com os operadores ou portas lógicas (AND, OR e NOT em especial), e é essencial para a formulação e simplificação tanto circuitos quanto de aplicativos de programação.
Veja mais em: https://pt.wikipedia.org/wiki/%C3%81lgebra_booliana_(estrutura)📊 Mapa de Karnaugh
O Mapa de Karnaugh é uma técnica gráfica utilizada para minimizar expressões booleanas, reduzindo a complexidade de circuitos lógicos. Ele permite visualizar padrões e agrupar termos semelhantes para encontrar expressões equivalentes mais simples.
Aplicativos como o Logisim permitem a visualização dos mapas de Karnaugh relacionados a uma expressão lógica. O aplicativo online Circuit Verse também permite a simplificação lógica, além de apresentar o circuito correpondente, assim como o Logisim.
A simplificação das expressões lógicas na prática
📝 Vejamos, na prática, como uma expressão complexa pode ser simplificada. Suponhamos algum dos sistemas exemplificados na parte final deste artigo. Como esses exemplos são formados por 4 variáveis boleanas na entrada, a tabela verdade de sua função lógica conterá 16 linhas. Isso porque as tabelas verdade contêm tantas linhas quanto o resultado da fórmula: 2 elevado a n, onde n é a quantidade de variáveis de entrada. Portanto, para n=4, haverá 16 linhas (2^4=16). Caso se tratasse de exemplos com 3 variáveis, haveria 8 linhas (2^3=8); se fossem 5 variáveis, 32 linhas (2^5=32) e assim por diante.
Digamos que, em uma abordagem ingênua (naive no inglês), um programador ou projetista de circuitos estivesse analisando uma tabela verdade de 16 linhas, igual à do Exemplo 1 , "Controle de Acesso a um Sistema" apresentado lá embaixo e, para programar seus vários casos, utilizasse o seguinte fluxo de execução:
if A:if B:if C:if D:return trueelse:return trueelse:if D:return falseelse:return falseelse:if C:if D:return trueelse:return falseelse:if D:return falseelse:return falseelse:if B:if C:if D:return falseelse:return falseelse:if D:return falseelse:return falseelse:if C:if D:return falseelse:return falseelse:if D:return falseelse:return false
🪟Tabela verdade do exemplo 1
A tabela verdade em questão, que o programador teria presumidamente utilizado, seria esta:
===============A B C D | Resultado da função lógica---------------0 0 0 0 | 00 0 0 1 | 00 0 1 0 | 00 0 1 1 | 00 1 0 0 | 00 1 0 1 | 00 1 1 0 | 00 1 1 1 | 01 0 0 0 | 01 0 0 1 | 01 0 1 0 | 01 0 1 1 | 11 1 0 0 | 01 1 0 1 | 01 1 1 0 | 11 1 1 1 | 1
🐞 Expressão lógica boleana, não simplificada, para trabalhar com a tabela verdade acima
((AB'CD)+(ABCD')+(ABCD))
✅ Expressão lógica boleana simplificada
função lógica: S = (A and C and (B or D))ou, na notação da álgebra boleana:S=(AC(B+D))
⚖️Código para comparar os resultados entre os algoritmos nas versões "ingênua" e simplificada
Comparem as duas versões da função contidas no código abaixo. Ambas produzem o mesmo resultado. Porém, enquanto a versão simplificada contém apenas 3 linhas de código, a versão "ingênua" contém quase 50 linhas.
'''Compararemos, aqui, as duas versões do algoritmo: a versão "ingênua" e a versão simplificada.O contexto é o do exemplo 1: Controle de Acesso a um SistemaEntrada:A = Usuário autenticadoB = Possui permissão de administradorC = Senha válidaD = Autenticação de dois fatores ativadaSaída:S = Acesso permitidoFunção Lógica simplificada:S = A ∧ C ∧ (B V D)Explicação:Usuário autenticado com senha válida e, além disso, ou é administrador ou tem 2FA ativado'''def controle_acesso_algoritmo_ingenuo(A: int, B: int, C: int, D:int) -> int:resultado=Noneif A:if B:if C:if D:resultado = 1else:resultado = 1else:if D:resultado = 0else:resultado = 0else:if C:if D:resultado = 1else:resultado = 0else:if D:resultado = 0else:resultado = 0else:if B:if C:if D:resultado = 0else:resultado = 0else:if D:resultado = 0else:resultado = 0else:if C:if D:resultado = 0else:resultado = 0else:if D:resultado = 0else:resultado = 0return resultadodef controle_acesso_algoritmo_simplificado(A: int, B: int, C: int, D:int) -> int:S=(A and C and (B or D)) #S=((AC(B+D))return int(S)# Exibir os resultadosprint("#"*100)print("Algoritmo ingênuo")print("="*25)print("A B C D | Resultado da função lógica 'ingênua'")print("-"*25)for A in range(2):for B in range(2):for C in range(2):for D in range(2):print(f"{A} {B} {C} {D} | {controle_acesso_algoritmo_ingenuo(A, B, C, D)}")print("#"*100)print("Algoritmo resultante da simplificação da expressão lógica")print("="*25)print("A B C D | Resultado da função lógica simplificada")print("-"*25)for A in range(2):for B in range(2):for C in range(2):for D in range(2):print(f"{A} {B} {C} {D} | {controle_acesso_algoritmo_simplificado(A, B, C, D)}")print("#"*100)
🔎 No exemplo 8, as vantagens da simplificação são mais evidentes
Se analisarmos o exemplo 8, do "Sistema de Controle de Tráfego", veremos ainda mais nítidas as vantagens da simplificação.
🪟Tabela verdade do exemplo 8
Tabela verdade (exemplo 8)===============A B C D | Resultado da função lógica---------------0 0 0 0 | 00 0 0 1 | 10 0 1 0 | 10 0 1 1 | 10 1 0 0 | 00 1 0 1 | 10 1 1 0 | 10 1 1 1 | 11 0 0 0 | 01 0 0 1 | 11 0 1 0 | 11 0 1 1 | 11 1 0 0 | 11 1 0 1 | 11 1 1 0 | 11 1 1 1 | 1
🐞 Expressão lógica boleana, não simplificada, para trabalhar com a tabela verdade do exemplo 8
((A'B'C'D)+(A'B'CD')+(A'B'CD)+(A'BC'D)+(A'BCD')+(A'BCD)+(AB'C'D)+(AB'CD')+(AB'CD)+(ABC'D')+(ABC'D)+(ABCD')+(ABCD))
✅ Expressão lógica boleana simplificada para o exemplo 8
função lógica: S = (A and B) or C or Dou, na notação da álgebra boleana:S= (AB) + C + D
⚡ Como realizar, na prática, a simplificação das expressões lógicas?
Bem, o melhor conselho seria estudar e aprofundar-se nas técnicas de álgebra boleana. Tudo fica mais fácil quando, além das experiências práticas, domina-se também a teoria envolvida.
Apresentaremos três outras formas de resolver essa simplificação:
1️⃣ Resolver com a ajuda do ChatGPT
Esta é a opção mais simples, mas também a menos indicada por ora, ao menos na versão gratuita.
Copie a expressão a simplificar, por exemplo, F=(((A'B'C'D)+(A'B'CD')+(A'B'CD)+(A'BC'D)+(A'BCD')+(A'BCD)+(AB'C'D)+(AB'CD')+(AB'CD)+(ABC'D')+(ABC'D)+(ABCD')+(ABCD)))
e, no prompt do ChatGPT, solicite a simplificação.
Um exemplo de prompt pode ser:
Simplifique esta expressão lógica o máximo que puder, considerando-se que utiliza a notação do caracter ' para o operador lógico not e + para o operador or. A expressão em questão: ((A'B'C'D)+(A'B'CD')+(A'B'CD)+(A'BC'D)+(A'BCD')+(A'BCD)+(AB'C'D)+(AB'CD')+(AB'CD)+(ABC'D')+(ABC'D)+(ABCD')+(ABCD)). Quando não houver caractere nenhum, considere que ali vai um operador lógico and. As variáveis de entrada são A, B, C e D e a função de saída é S=f(A,B,C,D).
Repito o alerta de que, por ora ao menos, e na versão gratuita, e nos momentos em que estiver utilizando os modelos mais simples dessa IA, este é o método mais sujeito a falhas e respostas erradas. Ainda assim, é bastante útil para uma visão geral, e como começo de verificação, para confirmação posterior por outros métodos, como os apresentados abaixo.
2️⃣ Resolver a simplificação da expressão lógica com o Circuit Verse
O Circuit Verse é uma ferramenta online que permite simular circuitos digitais. Para utilizar a ferramenta de análise combinacional que o Circuit Verse mantém disponível, siga estes passos:
- Acesse o Circuit Verse.
- Clique em "Launch Simulator".
- No menu superior, vá em Tools > Combinational Analysis.
- No campo "Enter boolean function", insira a expressão lógica
((A+B')C)+((A B C)(A C'))
. - Clique em "Next" para visualizar a tabela verdade resultante da expressão.
- Clique em "Generate circuit"
- Apague todas as conexões não utilizadas
- O circuito que restar corresponderá à versão lógica simplificada
3️⃣ Resolver a simplificação no aplicativo Logisim
A simplificação realizada no aplicativo Logisim é, de certo modo, ainda mais simples do que a apresentada acima, do Circuit Verse. Isso por que é diretamente apresentada na janela em que mostra o mapa de Karnaugh. O ponto negativo é que tem menos flexibilidade para tabelas maiores, pois tem um limite baixo de possíveis variáveis de entradas (limite de 12, na versão testada: 2.7.1).
Baixe o Logisim aqui: https://www.cburch.com/logisim/pt/index.html- Depois de baixá-lo e instalá-lo na pasta de sua preferência, abra o aplicativo
- Acesse a análise combinacional em "Projeto > Analisar Circuito"
- Ao contrário do Circuit Verse, o Logisim não permite a entrada direta da expressão a minimizar, portanto, é preciso entrar com as variáveis de entrada (A,B,C) e com a de saída (F).
- Depois disso, manualmente configurar a tabela verdade.
- A expressão resultante dependerá da configuração (manual) da tabela verdade
- Aí, sim, é que, na aba "Minimizada" é que o usuário terá o resultado da simplificação da expressão.
- Na aba "Minimizada", poderá escolher entre uma das formas de minimização: Soma de Produtos ou Produto das somas. Em cada caso, um ou outro pode ser o mais vantajoso em termos de simplicidade e de economia de recursos.
Exemplos de sistemas hipotéticos relativamente complexos
Solicitei ao ChatGpt para indicar alguns exemplos de sistemas hipotéticos relativamente complexos, com 4 variáveis booleanas na entrada e 1 na saída. Vejam as sugestões recebidas, já com as adaptações que fiz:
1. Controle de Acesso a um Sistema
Entrada:
- A = Usuário autenticado
- B = Possui permissão de administrador
- C = Senha válida
- D = Autenticação de dois fatores ativada
Saída:
S = Acesso permitido
Função Lógica simples:
S = A ∧ C ∧ (B V D)
Explicação:
Usuário autenticado com senha válida e, além disso, ou é administrador ou tem 2FA ativado
2. Sistema de Segurança Residencial
Entrada:
- A = Sensor de porta ativado
- B = Sensor de movimento detectado
- C = Alarme ativado
- D = Presença do proprietário
Saída:
S = Disparar alarme
Função Lógica simples:
S = C ∧ (A V B) ∧ ¬D
Explicação:
O alarme toca se estiver ativado e houver movimento ou porta aberta, mas não se o proprietário estiver presente
3. Carro Autônomo em Situação de Tráfego
Entrada:
- A = Placa de pare detectada
- B = Obstáculo à frente
- C = Veículo em movimento
- D = Sinal verde
Saída:
S = Frear
Função Lógica simples:
S = A V B V ( C ∧ ¬D)
Explicação:
Freia se houver placa de pare, obstáculo ou se estiver em movimento sem sinal verde
4. Sistema de Aprovação de Crédito
Entrada:
- A = Renda mínima atingida
- B = Nome limpo
- C = Histórico de crédito positivo
- D = Emprego formal confirmado
Saída:
S = Crédito aprovado
Função Lógica simples:
S = A ∧ B ∧ (C V D)
Explicação:
Aprovação se renda for suficiente, nome estiver limpo e houver um histórico positivo ou emprego confirmado
5. Sistema de Irrigação Automática
Entrada:
- A = Umidade do solo baixa
- B = Previsão de chuva
- C = Horário permitido para irrigação
- D = Sensor de temperatura indicando calor excessivo
Saída:
S = Acionar irrigação
Função Lógica simples:
S = A ∧ C ∧ (¬B V D)
Explicação:
Aciona a irrigação se a umidade do solo estiver baixa e estiver em horário permitido, além de não haver previsão para chuva ou o sensor de temperatura estiver marcando calor excessivo
6. Sistema de Detecção de Fraude em Transações
Entrada:
- A = Transação acima do valor médio
- B = Localização suspeita
- C = Cartão usado recentemente
- D = Usuário autenticado via biometria
Saída:
S = Bloquear transação
Função Lógica simples:
S = A ∧ (B V ¬C) ∧ ¬D
Explicação:
Bloqueia a transação se for acima do valor médio e se a localização for suspeita ou o cartão não foi usado recentemente além de o usuário não ter usado identificação por biometria
7. Gerenciamento de Carga em Veículo Elétrico
Entrada:
- A = Bateria abaixo de 20%
- B = Carregador disponível
- C = Rede elétrica sobrecarregada
- D = Modo de carregamento rápido ativado
Saída:
S = Iniciar carregamento
Função Lógica simples:
S = A ∧ B ∧ (¬C V D)
Explicação:
Inicia o carregamento se a bateria estiver abaixo de 20% e o carregador estiver disponível e se a rede não estiver sobrecarregada ou se o modo de carregamento rápido estiver ativado
8. Sistema de Controle de Tráfego
Entrada:
- A = Tráfego intenso
- B = Tempo de espera longo
- C = Veículo de emergência detectado
- D = Sinalização manual ativa
Saída:
S = Liberar sinal verde
Função Lógica simples:
S = (A ∧ B) V C V D
Explicação:
Libera o sinal verde em caso de tráfego intenso e tempo de espera longo ou se estiver passando um veículo de emergência ou se a sinalização manual estiver ativa
9. Sistema de Iluminação Pública Inteligente
Entrada:
- A = Horário noturno
- B = Movimento detectado
- C = Nível de luminosidade baixo
- D = Modo de economia de energia ativado
Saída:
S = Acionar iluminação
Função Lógica simples:
S = (A ∧ C) V (B ∧ ¬D)
Explicação:
Aciona a iluminação se estiver de noite e o nível de luminosidade estiver baixo ou se houver movimento detectado e o modo de economia estiver desativado
10. Controle de Temperatura em Estufas
Entrada:
- A = Temperatura acima do limite
- B = Umidade adequada
- C = Ventilação disponível
- D = Rega automática ativada
Saída:
S = Ativar sistema de resfriamento
Função Lógica simples:
S = A ∧ C ∧ ¬B ∧ ¬D
Explicação:
Ativa o resfriamento se temperatura acima do limite e umidade não estiver adequada, se houver ventilação disponível e se a rega automática estiver desativada
11. Sistema de Verificação de E-mails Suspeitos
Entrada:
- A = Contém links externos
- B = Possui anexos desconhecidos
- C = Remetente não verificado
- D = Linguagem persuasiva detectada
Saída:
S = E-mail suspeito
Função Lógica simples:
S = A V B V (C ∧ D)
Explicação:
É suspeito se houver links externos ou anexos desconhecidos ou se o remetente for duvidoso e apresentar linguagem persuasiva
12. Automação de Marketing Digital
Entrada:
- A = Usuário visitou a página de produto
- B = Adicionou ao carrinho
- C = Abandonou o carrinho
- D = E-mail de recuperação enviado
Saída:
S = Enviar lembrete por e-mail
Função Lógica simples:
S = A ∧ B ∧ C ∧ ¬D
Explicação:
Envia lembrete se o usuário visitou, adicionou ao carrinho, mas abandonou e ainda não recebeu e-mail
Código para apresentar as tabelas verdade de cada um dos exemplos acima
'''Variáveis booleanas do exemplo 1, sendo que os outros exemplos seguem modelo semelhante:1. Controle de Acesso a um SistemaEntrada:A = Usuário autenticadoB = Possui permissão de administradorC = Senha válidaD = Autenticação de dois fatores ativadaSaída:S = Acesso permitidoFunção Lógica:S=A∧C∧(B∨D)(Usuário autenticado com senha válida e, além disso, ou é administrador ou tem 2FA ativado)'''def fluxo_controle_complexo(A: int, B: int, C: int, D: int, exemplo: int)->int:if A:if B:if C:if D:caso="Caso 15: A, B, C e D são verdadeiros"else:caso="Caso 14: A, B e C são verdadeiros"else:if D:caso="Caso 13: A e B são verdadeiros, mas C é falso e D verdadeiro"else:caso="Caso 12: A e B são verdadeiros, mas C e D são falsos"else:if C:if D:caso="Caso 11: A e C são verdadeiros, mas B é falso e D verdadeiro"else:caso="Caso 10: A e C são verdadeiros, mas B e D são falsos"else:if D:caso="Caso 9: Apenas A e D são verdadeiros"else:caso="Caso 8: Apenas A é verdadeiro"else:if B:if C:if D:caso="Caso 7: Apenas A é falso"else:caso="Caso 6: Apenas A e D são falsos"else:if D:caso="Caso 5: Apenas A e C são falsos"else:caso="Caso 4: Apenas B é verdadeiro"else:if C:if D:caso="Caso 3: Apenas A e B são falsos"else:caso="Caso 2: Apenas C é verdadeiro"else:if D:caso="Caso 1: Apenas D é verdadeiro"else:caso="Caso 0: Nenhuma variável é verdadeira"S=Noneif (exemplo==1):S = (A and C and (B or D)) #S = A ∧ C ∧ (B ∨ D)if (exemplo==2):S = (C and (A or B) and not D) #S = C ∧ (A ∨ B) ∧ ¬Dif (exemplo==3):S = (A or B or (C and not D)) #S = A V B V ( C ∧ ¬D)if (exemplo==4):S = A and B and (C or D) #S = A ∧ B ∧ (C V D)if (exemplo==5):S = A and C and (not B or D) #S = A ∧ C ∧ (¬B V D)if (exemplo==6):S = A and (B or not C) and not D #S = A ∧ (B V ¬C) ∧ ¬Dif (exemplo==7):S = A and B and (not C or D) #S = A ∧ B ∧ (¬C V D)if (exemplo==8):S = (A and B) or C or D #S = (A ∧ B) V C V Dif (exemplo==9):S = (A and C) or (B and not D) #S = (A ∧ C) V (B ∧ ¬D)if (exemplo==10):S = A and C and not B and not D #S = A ∧ C ∧ ¬B ∧ ¬Dif (exemplo==11):S = A or B or (C and D) #S = A V B V (C ∧ D)if (exemplo==12):S = A and B and C and not D #S = A ∧ B ∧ C ∧ ¬Dreturn int(S), caso# Exibir os resultadosprint("="*15)print("A B C D | Resultado")print("-"*15)exemplos=["Controle de Acesso a um Sistema","Sistema de Segurança Residencial","Carro Autônomo em Situação de Tráfego","Sistema de Aprovação de Crédito","Sistema de Irrigação Automática","Sistema de Detecção de Fraude em Transações","Gerenciamento de Carga em Veículo Elétrico","Sistema de Controle de Tráfego","Sistema de Iluminação Pública Inteligente","Controle de Temperatura em Estufas","Sistema de Verificação de E-mails Suspeitos","Automação de Marketing Digital"]funcaoLogica=["S = (A and C and (B or D))","S = (C and (A or B) and not D)","S = (A or B or (C and not D))","S = A and B and (C or D)","S = A and C and (not B or D)","S = A and (B or not C) and not D","S = A and B and (not C or D)","S = (A and B) or C or D","S = (A and C) or (B and not D)","S = A and C and not B and not D","S = A or B or (C and D)","S = A and B and C and not D",]for exemplo in range (1,13):print(f"Exemplo: {exemplo} : {exemplos[exemplo-1]}")print(f"função lógica: {funcaoLogica[exemplo-1]}")for A in range(2):for B in range(2):for C in range(2):for D in range(2):print(f"{A} {B} {C} {D} | {fluxo_controle_complexo(A, B, C, D, exemplo)}")
📈 Conclusão
A simplificação de expressões lógicas é essencial para tornar circuitos mais eficientes e econômicos. Utilizando técnicas de simplificação das expressões lógicas, seja com o uso de álgebra booleana, do Mapa de Karnaugh ou de ferramentas como o CircuitVerse, o Logisim e os portais de IA como o ChatGPT, podemos construir sistemas otimizados e de melhor desempenho.