Este post oferece um passo a passo técnico dos conceitos fundamentais da lógica proposicional e sua implementação formal usando a linguagem de programação e assistente de provas (theorem prover) Lean 4.
Seja você um matemático buscando formalizar demonstrações ou um programador mergulhando na teoria dos tipos, este guia reconstrói a lógica a partir dos primeiros princípios. Começaremos com constantes lógicas básicas e exploraremos como o Lean 4 modela construções lógicas com elegância usando o Isomorfismo de Curry-Howard — o princípio de que proposições são tipos e provas são programas.
Antes de definir nossos conectivos lógicos, precisamos configurar um ambiente base. No Lean 4, isso geralmente é feito usando dois comandos específicos para controlar o escopo e o comportamento computacional.
namespace Basic
noncomputable section
namespace Basic: Este comando agrupa nossas definições, evitando conflitos de nomes com a biblioteca padrão do Lean (o Prelude). Ele nos permite redefinir estruturas fundamentais como True, False e And do zero para fins educacionais.noncomputable section: O Lean 4 é tanto um assistente de provas quanto uma linguagem de programação funcional. Por padrão, ele tenta gerar bytecode executável para cada definição. Marcar uma seção como noncomputable diz ao compilador para pular essa etapa, o que é comum na lógica formal, onde nos importamos com propriedades matemáticas em vez de execução em tempo de execução (runtime).Nesta seção, definiremos os elementos fundamentais da lógica, mapeando a notação matemática padrão para código em Lean 4.
A proposição mais simples é aquela que é universalmente válida do ponto de vista lógico. Em termos de programação, se comporta como um tipo Unidade (Unit type) — possui exatamente um estado e não carrega dados adicionais.
Definição:
inductive True : Prop where
| intro : True
Como é definido com um único construtor (intro), a única maneira de “provar” True é fornecer exatamente esse construtor.
Exemplos:
-- Proving True unconditionally
example : True := True.intro
-- Any proposition 'a' trivially implies True
example {a : Prop} : a → True := fun _ => True.intro
Enquanto True é definido pela existência trivial de uma prova, False é definido pela ausência total de uma. É um tipo Vazio (Empty type ou Void type).
Definição:
inductive False : Prop
Como False não possui construtores, você nunca pode instanciá-lo do nada. Ele representa uma contradição lógica.
O Princípio da Explosão (Ex Falso Quodlibet):
Se você algum dia se encontrar com uma prova de False em mãos, a lógica entra em colapso e você pode provar qualquer coisa. O Lean lida com isso usando o recursor False.elim.
-- From a falsehood, any proposition 'a' follows (⊥ → a)
def False.elim {a : Prop} (false_proof : False) : a :=
false_proof.rec
No Lean 4, a negação não é um conceito primitivo embutido. Em vez disso, ela é definida funcionalmente usando implicação e False. Para provar que a proposição é falsa (denotada por ), você deve demonstrar uma função na qual assumir leva diretamente a uma contradição ().
Definição:
def Not (a : Prop) : Prop := a → False
Teoremas Principais:
-- Proving Negation: If assuming 'a' proves False, then Not 'a' is true.
theorem Not.intro {a : Prop} (h : a → False) : Not a :=
fun ha => h ha
-- Double Negation Introduction (a → ¬¬a)
theorem not_not_intro {a : Prop} (ha : a) : Not (Not a) :=
fun na => na ha -- 'na' has type (a → False), so passing 'ha' yields False.
-- Modus Tollens: If (a → b) and (¬b), then (¬a)
theorem Not.imp {a b : Prop} (nb : Not b) (ab : a → b) : Not a :=
fun ha =>
have hb : b := ab ha
nb hb
Como o Lean se baseia na teoria dos tipos, a implicação lógica () é tratada literalmente como uma função. Para provar que implica , você deve escrever uma função que recebe uma prova arbitrária de e retorna uma prova de .
Exemplo de Implicação Encadeada: Se você consegue transformar em , e transformar em , você pode transformar uma função de em uma de .
theorem imp_imp_imp {a b c d : Prop}
(ca : c → a) (bd : b → d) : (a → b) → (c → d) :=
fun ab => fun hc =>
have ha : a := ca hc
have hb : b := ab ha
bd hb
A conjunção lógica, que exige que tanto quanto sejam verdadeiros, é modelada como uma structure. Em termos de programação, trata-se de um tipo Produto (Product type) (uma struct ou tupla) que armazena duas evidências separadas.
Definição:
structure And (a b : Prop) : Prop where
intro ::
left : a
right : b
Padrões Principais de Prova:
-- Introduction: Creating an And
example {a b : Prop} (ha : a) (hb : b) : And a b :=
And.intro ha hb
-- Symmetry: a ∧ b → b ∧ a
theorem And.symm {a b : Prop} (h : And a b) : And b a :=
And.intro h.right h.left
A disjunção lógica exige que pelo menos uma das proposições seja verdadeira. Ao contrário de And, Or é um tipo Soma (Sum type) indutivo (uma tagged union), porque existem duas maneiras distintas e alternativas de construir uma prova.
Definição:
inductive Or (a b : Prop) : Prop where
| inl (h : a) : Or a b
| inr (h : b) : Or a b
Para provar , você encapsula uma prova de no construtor inl (inject-left), ou uma prova de no construtor inr (inject-right).
Exemplo:
-- Symmetry: a ∨ b → b ∨ a
theorem Or.symm {a b : Prop} (h : Or a b) : Or b a :=
match h with
| Or.inl ha => Or.inr ha
| Or.inr hb => Or.inl hb
A bi-implicação, ou “se e somente se” (Iff), representa que duas proposições são logicamente equivalentes. Ela é definida como uma estrutura que armazena implicações em ambas as direções.
Definição:
structure Iff (a b : Prop) : Prop where
intro ::
mp : a → b
mpr : b → a
Exemplo de Reflexividade:
-- Every proposition is equivalent to itself (a ↔ a)
theorem Iff.refl {a : Prop} : Iff a a :=
Iff.intro (fun ha => ha) (fun ha => ha)
Ao reconstruir a lógica proposicional do zero no Lean 4, revelamos a beleza mecânica dos sistemas formais:
And é uma struct, Or é um enum, True é unit e False é void.Dominar esses blocos de construção fundamentais fornece a base essencial para encarar teoremas matemáticos mais complexos, lógica de predicados e a verificação formal de sistemas de software complexos.
Baixe a edição offline selecionada de O Estilo de Vida do Kaue—um guia prático para otimizar 🍏 Saúde, 💰 Riqueza, ❤️ Amor e 🧘 Sentido.
Receba notificações quando eu publicar novos ensaios, resumos de livros e guias práticos sobre como viver bem. Sem spam—cancele quando quiser.
Tem alguma pergunta, perspectiva ou sugestão? Compartilhe suas ideias abaixo. Os comentários usam o GitHub Discussions (sem anúncios e sem spam)—clique em Entrar com o GitHub abaixo para comentar ou reagir (criar uma conta gratuita no GitHub leva menos de um minuto).
Atualizado em 11 de out. de 2026.
AVISO LEGAL: O conteúdo deste site tem finalidade exclusivamente informativa e educacional e não constitui aconselhamento médico, psicológico, financeiro, de investimentos, tributário ou jurídico. As ideias, a curadoria e as opiniões aqui apresentadas são exclusivamente minhas e não representam as do meu empregador. Os resumos de livros, palestras e artigos são comentários educacionais independentes e permanecem propriedade intelectual de seus respectivos autores. Ferramentas de IA podem ser utilizadas para auxiliar na edição, formatação e síntese; embora todos os esforços sejam feitos para garantir a precisão, erros podem ocorrer. PRIVACIDADE: Este site utiliza serviços de terceiros para inscrição opcional em newsletter (follow.it), comentários (giscus / GitHub Discussions) e mídia incorporada (YouTube), que podem processar endereços IP e cookies dos visitantes de acordo com suas respectivas políticas de privacidade.