Módulo 1 · Lógica e demonstrações

Lógica proposicional e booleana

Aula 1.1 · cerca de 15 minutos

Todo if que você escreve é uma fórmula de lógica proposicional. Uma proposição é uma afirmação que é verdadeira ou falsa. Combinamos proposições com os conectivos ¬ (não), ∧ (e), ∨ (ou), → (implica) e ↔ (se e somente se).

A implicação que engana

A implicação p → q só é falsa quando p é verdadeira e q é falsa. Por isso ela equivale a ¬p ∨ q. Em código: !p || q. Uma premissa falsa torna a implicação verdadeira: “se 2 + 2 = 5, então eu sou o papa” é uma frase verdadeira.

p → q  ≡  ¬p ∨ q  ≡  ¬q → ¬p   (contrapositiva)

Leis de De Morgan

As leis de De Morgan simplificam condições negadas, e é aqui que surgem muitos bugs de refatoração.

¬(p ∧ q) ≡ ¬p ∨ ¬q        ¬(p ∨ q) ≡ ¬p ∧ ¬q
# Antes
if not (user.is_admin and user.is_active):
    deny()

# Depois (equivalente, por De Morgan)
if not user.is_admin or not user.is_active:
    deny()

Quantificadores

∀x P(x) (“para todo x”) é o all() do Python. ∃x P(x) (“existe x”) é o any(). A negação troca um pelo outro: ¬∀x P(x) ≡ ∃x ¬P(x). Para refutar “todo teste passa”, basta um teste que falha.

Dica: Quando uma condição ficar confusa, escreva a tabela-verdade. Com 3 variáveis são só 8 linhas, e dá para gerá-las com itertools.product([False, True], repeat=3).

Exercício 1

Simplifique not (a or not b).

Exercício 2

Escreva a negação de “todo usuário tem pelo menos um pedido” usando quantificadores.