você está aqui: Home  → Arquivo de Mensagens

Redução de expressões com operadores lógicos

Colaboração: Ricardo Takemura

Data de Publicação: 11 de março de 2016

Para quem fez informática: alguém se lembra de algumas aulas sobre redução de expressões lógicas? Sabia que dá para aplicar no código-fonte de uma aplicação?

Por exemplo, se eu tenho a condição:

  if (((x == 0) || (y == 0)) && ((x == 0) || (z == 0))) { 
  ... 
  } 

Eu posso reduzi-la pela equivalência:

  (A OR B) AND (A OR C) -> A OR (B AND C) 

Assim, eu posso simplificar o código da seguinte maneira:

  if ((x == 0) || ((y == 0) && (z == 0))) { 
  ... 
  } 

A mesma coisa, eu poderia fazer com outras expressões:

  (A AND B) OR (A AND C) -> A AND (B OR C) 
  (A AND B) AND (A AND C) -> A AND B AND C 
  (A OR B) OR (A OR C) -> A OR B OR C 

O legal, é que vale para aquelas expressões mais "complicadas" (ou mais "cabeças", como alguns falam :P ) :

  NOT A OR NOT B -> NOT (A AND B) 
  NOT A AND NOT B -> NOT (A OR B) 
  (NOT A AND B) OR (NOT B AND A) -> A XOR B 
  (NOT A OR B) AND (NOT B OR A) -> NOT (A XOR B) 

Vamos pegar a última expressão acima:

  if (((!(a > b)) || (c < d)) && ((!(c < d)) || (a > b))) { 
  ... 
  } 

Aplicando:

  (NOT A OR B) AND (NOT B OR A) -> NOT (A XOR B) 

Temos:

  if (!((a > b) ^ (c < d))) { 
  ... 
  } 

Será que isso ajuda alguém? :)



Veja a relação completa dos artigos de Ricardo Takemura