An Interest In:
Web News this Week
- March 21, 2024
- March 20, 2024
- March 19, 2024
- March 18, 2024
- March 17, 2024
- March 16, 2024
- March 15, 2024
lgebra booliana
H algum tempo, quando a bug_elseif ainda estava fazendo listas de exerccios em Python, apareceu um problema que envolvia verificar se um ano era bissexto ou no. Embora a construo de uma expresso para verificar se um ano bissexto seja at intuitiva, como estvamos utilizando a condio invertida (verificar se o ano no era bissexto), sua construo no estava sendo fcil, porm possvel usar um pouco de matemtica para chegar nela.
Construo da expresso
Primeiramente vamos construir uma expresso para verificar se um ano bissexto. Para isso, ele deve ser mltiplo de 4, porm se o ano terminar com 00, ele tambm deve ser mltiplo de 400. Para verificar se um nmero termina com 00, basta verificar se ele mltiplo de 100, e para verificar se um nmero mltiplo de outro, podemos verificar o resto da diviso ou mdulo (quem sabe falo sobre matemtica modular em outro artigo), caso o resultado dessa operao seja 0, o primeiro nmero divisvel pelo segundo, e caso seja qualquer outro valor, o primeiro nmero no divisvel pelo segundo (ou no possui uma diviso inteira).
Assim, a expresso para verificar se o ano bissexto pode ser construda como:
(ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0
A primeira coisa a ser observada que existem duas subexpresses com o conectivo disjuntivo ("ou" ||
), ou seja, para um ano ser bissexto basta ele cumprir uma das duas condies (subexpresses). A primeira condio tambm dividida em outras duas subexpresses, porm dessa vez com o conectivo conjuntivo ("e" &&
), assim necessrio que as duas condies sejam verdadeiras para que o seu valor seja considerado verdadeiro, onde a primeira verifica se o ano divisvel por 4 (resto da diviso igual a 0), e a segunda verifica se ele no divisvel por 100 (resto da diviso diferente de 0). Essa a primeira possibilidade para um ano ser bissexto. A outra possibilidade se ele for divisvel por 400 (resto da diviso igual a zero).
Assim, essa expresso retorna verdadeiro se o ano for bissexto, e falso caso ele no for.
Invertendo a expresso
Porm na ocasio, a expresso que estvamos usando deveria retornar verdadeiro caso o ano no fosse bissexto, e falso caso ele fosse bissexto (o contrrio da expresso apresentada). Isso poderia ser feito negando a expresso anterior, ou escrevendo uma expresso de tal forma que retorne o oposto, e era justamente essa segunda opo que estvamos tentando fazer.
Entretanto, existe uma forma matemtica de trabalhar com a negao da expresso, alteando-a at que ela chegue prximo ou a exata expresso que estvamos construindo. Isso possvel atravs de propriedades das operaes boolianas, substituindo parte da expresso a cada vez que uma propriedade por aplicada. Sendo as mais comuns para esse tipo de operao as propriedades de negao da negao (!!a = a
), distributiva (a || (b && c) = (a || b) && (a || c)
e a && (b || c) = (a && b) || (a && c)
, que lembra a distributiva da matemtica 2 * (3 + 4) = (2 * 3) + (2 * 4)
), e as leis de De Morgan (!(a || b) = !a && !b
e !(a && b) = !a || !b
). Para mais propriedades veja a pgina sobre o assunto na Wikipdia.
Para esse caso necessrio aplicar apenas as leis de De Morgan. Partindo da negao da expresso, aplicando-a passo a passo, temos:
!((ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0)!(ano % 4 == 0 && ano % 100 != 0) && !(ano % 400 == 0)(!(ano % 4 == 0) || !(ano % 100 != 0)) && !(ano % 400 == 0)(ano % 4 != 0 || ano % 100 == 0) && ano % 400 != 0
Onde essa ltima expresso a que precisvamos para o cdigo.
Consideraes
lgebra booliana interessante para trabalhar condies como de if
e laos de repeties dos cdigos, seja para otimiz-la ou inverter os blocos de cdigo do if
e else
, por exemplo, o que pode ser utilizado para deixar o cdigo mais fcil de entender, colocando os blocos de cdigo em uma ordem que faa mais sentido para a leitura. Ela tambm pode ser utilizada para facilitar a construo de expresses, como no caso apresentando, onde muito mais fcil e intuitivo escrever uma expresso que verifica se o ano bissexto do que um ano que no , onde essa ltima pode at ser contraintuitiva, onde a lgebra booliana permite partir da expresso mais fcil para a mais difcil.
E para quem quiser se aprofundar nesse assunto, recomendo as aulas do RiverFount, que professor de filosofia.
Original Link: https://dev.to/acaverna/algebra-booliana-20lc
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To