Usando Matemática Discreta e Mario Kart para deixar o seu código mais limpo
Imagine que você precisa validar se o Mário foi o campeão. Nas aulinhas de programação (não interessa a linguagem), você deve ter aprendido algo bem parecido com isso:
def mario_campeao(posicao):
if(posicao == 1):
return True`
else:
return False
Mas, se queremos deixar esse código mais limpo, você também deve ter aprendido nas aulinhas que o operador ternário é a opção.
Em Python, temos uma implementação parecida com esse operador:
def mario_campeao(posicao):
return True if posicao == 1 else False
E a linguagem Python, do jeito que foi desenhada, nos faz acreditar que o código realmente ficou o mais limpo possível. Praticamente, o que se lê na linha do “return” da função é uma frase em inglês, totalmente inteligível:
retorne verdadeiro se posição for igual a 1, ou então falso.
Mas, será que esse código não poderia ficar ainda mais limpo?
Bem, já que estamos falando em linguagem humana, vamos transformar a premissa do nosso código em uma frase. O que ela diz é o seguinte:
“Se a posição do Mário for igual a 1, então o Mário é campeão”.
Temos duas orações nessa frase, que poderiam ser muito bem divididas assim:
(oração p): Se a posição do Mário for igual a 1, (oração q): então o Mário é campeão
Essas duas orações tem uma relação de dependência. O Mário só pode ser campeão se sua posição for igual a 1. Ou seja, a veracidade da oração “q” depende totalmente da veracidade da oração “p”.
Se a oração “p” for verdadeira, então a oração “q” é verdadeira, ou seja, se é verdade que a posição do Mário na corrida é 1, então também é verdade que ele é o campeão.
Mas, se a oração “p” for falsa, então a afirmação da oração “q” (o Mário é campeão”) é falsa.
Logo, podemos resumir assim:
(p): Se a posição do Mário for igual a 1, (q): então o Mário é campeão
A posição do Mário é igual a 1
Então... O Mário é campeão
Sendo assim, uma vez que o resultado “q” está 100% amarrado a afirmação “p”, o nosso código não precisa tratar explicitamente a possibilidade de falsidade, pois ele está sendo redundante, uma vez que é lógico que se a posição não é 1, então a afirmação é falsa, uma vez que só existem duas possibilidades. Sendo assim, podemos inferir a veracidade de "q" através da veracidade de "p"
Ou seja, depois de todo esse devaneio, descobrimos que, se quisermos realmente “limpar” esse trecho de código, bastaria fazer o seguinte:
def mario_campeao(posicao):
return posicao == 1
Pois, como já dissemos, se a afirmação “posição == 1” for verdade, logo, o Mário é campeão. E, por consequência, se “posição == 1” for falso, podemos deduzir que o Mário não pode ser campeão.
Se você ainda não tinha sido apresentado à Matemática Discreta, então muito prazer!
Isso que nós tratamos é, mais especificamente, o Modus Ponens, ou o “modo de afirmação”, que é a regra de inferência (foco neste verbo: inferir) que diz que posso inferir, ou deduzir a validade de um argumento através do seguinte raciocínio lógico:
Se a premissa é verdadeira, então a consequência é verdadeira
A premissa é verdadeira.
Logo, a consequência é verdadeira.
Por isso afirmar que posição é igual a 1 no nosso “return” funciona. Quando fazemos essa afirmação, estamos afirmando que a premissa é verdadeira. Então:
Se a premissa for verdadeira, a consequência é verdadeira
Se a premissa for falsa, a consequência é falsa
O campo da Matemática Discreta que trata desses assuntos é a Lógica Proposicional. Este é o termo que você deve procurar no Google. Estudando Lógica Proposicional, você terá acesso a muitas outrass regras de inferência, que te ajudarão a construir argumentações fortes, seja na dialética, seja na programação.
Receio que não tem como escrever “clean code”, o termo que está na moda, sem dominar lógica proposicional. Até mesmo a forma declarativa de escrever código (que ficou em evidência com o hype do paradigma funcional) depende muito desses conceitos que tratamos.
A Matemática Discreta trata de mais assuntos igualmente importantes, mas por hoje está bom né?
(Se você puder dar um feedback a respeito da explicação, ficaria muito agradecido! Nunca havia escrito um texto sobre matemática na minha vida. É mais difícil do que parece. Foi um desafio! rsrs.)