Quantificadores, leis de negação, ordem dos quantificadores e conjuntos como predicados em Lean
Christiano Braga · Mestrado em Sistemas e Computação · IME
Baseada em How To Prove It with Lean (HTPIwL), capítulos 2 e 3.
Um predicado sobre um tipo α atribui uma proposição a cada elemento, então em Lean é uma função α → Prop.
fun n => n > 3 : Nat → Prop#check fun n : Nat => n > 3
fun n => n > 3 : Nat → PropQuantificadores ligam a variável de um predicado e produzem uma proposição (Frege, 1879). A variável percorre um tipo, inferido quando o contexto o determina.
Símbolo | Nome | Leitura |
|---|---|---|
∀ x, P x | quantificador universal | P x vale para todo x |
∃ x, P x | quantificador existencial | P x vale para algum x |
∃ n, n > 3 : Prop#check ∃ n : Nat, n > 3
∀ (n : Nat), n > 3 : Prop#check ∀ n : Nat, n > 3
∃ n, n > 3 : Prop∀ (n : Nat), n > 3 : Prop
O quantificador leva o predicado, de tipo Nat → Prop, a uma proposição, de tipo Prop.
Introduza ∀ x, P x considerando um elemento arbitrário: intro, a mesma tática que introduz implicações.
Elimine por instanciação. Uma hipótese universal é uma função, então h a a instancia em a; specialize faz isso no lugar.
example (α : Type) (P Q : α → Prop)
(h : ∀ x, P x ∧ Q x) : ∀ x, P x := α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x ∧ Q x⊢ ∀ (x : α), P x
α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x ∧ Q xa:α⊢ P a
All goals completed! 🐙
example (α : Type) (P Q : α → Prop) (h : ∀ x, P x → Q x)
(a : α) (hPa : P a) : Q a := α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x → Q xa:αhPa:P a⊢ Q a
α:TypeP:α → PropQ:α → Propa:αh:P a → Q ahPa:P a⊢ Q a
All goals completed! 🐙
O quantificador universal distribui sobre a conjunção. A prova combina as regras do quantificador com as regras da Aula 1 para conjunção e bicondicional.
theorem forall_and_distrib (α : Type) (P Q : α → Prop) :
(∀ x, P x ∧ Q x) ↔ (∀ x, P x) ∧ (∀ x, Q x) := α:TypeP:α → PropQ:α → Prop⊢ (∀ (x : α), P x ∧ Q x) ↔ (∀ (x : α), P x) ∧ ∀ (x : α), Q x
α:TypeP:α → PropQ:α → Prop⊢ (∀ (x : α), P x ∧ Q x) → (∀ (x : α), P x) ∧ ∀ (x : α), Q xα:TypeP:α → PropQ:α → Prop⊢ ((∀ (x : α), P x) ∧ ∀ (x : α), Q x) → ∀ (x : α), P x ∧ Q x
α:TypeP:α → PropQ:α → Prop⊢ (∀ (x : α), P x ∧ Q x) → (∀ (x : α), P x) ∧ ∀ (x : α), Q x α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x ∧ Q x⊢ (∀ (x : α), P x) ∧ ∀ (x : α), Q x
α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x ∧ Q x⊢ ∀ (x : α), P xα:TypeP:α → PropQ:α → Proph:∀ (x : α), P x ∧ Q x⊢ ∀ (x : α), Q x
α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x ∧ Q x⊢ ∀ (x : α), P x α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x ∧ Q xa:α⊢ P a
All goals completed! 🐙
α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x ∧ Q x⊢ ∀ (x : α), Q x α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x ∧ Q xa:α⊢ Q a
All goals completed! 🐙
α:TypeP:α → PropQ:α → Prop⊢ ((∀ (x : α), P x) ∧ ∀ (x : α), Q x) → ∀ (x : α), P x ∧ Q x α:TypeP:α → PropQ:α → Proph:(∀ (x : α), P x) ∧ ∀ (x : α), Q xa:α⊢ P a ∧ Q a
All goals completed! 🐙
Introduza ∃ x, P x exibindo uma testemunha com a sua prova: o construtor anônimo ⟨3, rfl⟩, ou a tática exists.
Elimine nomeando uma testemunha e a sua prova: cases (um caso, construtor intro) ou obtain ⟨a, ha⟩ := h num só passo.
example : ∃ n : Nat, n * n = 9 := ⟨3, rfl⟩
example (α : Type) (P Q : α → Prop)
(h : ∃ x, P x ∧ Q x) : ∃ x, P x := α:TypeP:α → PropQ:α → Proph:∃ x, P x ∧ Q x⊢ ∃ x, P x
cases h with
α:TypeP:α → PropQ:α → Propa:αha:P a ∧ Q a⊢ ∃ x, P x All goals completed! 🐙
example (α : Type) (P Q : α → Prop)
(h : ∃ x, P x ∧ Q x) : ∃ x, Q x := α:TypeP:α → PropQ:α → Proph:∃ x, P x ∧ Q x⊢ ∃ x, Q x
α:TypeP:α → PropQ:α → Propa:αha:P a ∧ Q a⊢ ∃ x, Q x
All goals completed! 🐙
O teorema abaixo combina os dois quantificadores. Uma implicação ponto a ponto transporta a existência de P para Q, e a testemunha não muda.
theorem exists_imp_exists (α : Type) (P Q : α → Prop)
(h : ∀ x, P x → Q x) : (∃ x, P x) → ∃ x, Q x := α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x → Q x⊢ (∃ x, P x) → ∃ x, Q x
α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x → Q xhex:∃ x, P x⊢ ∃ x, Q x
α:TypeP:α → PropQ:α → Proph:∀ (x : α), P x → Q xa:αhPa:P a⊢ ∃ x, Q x
All goals completed! 🐙
Nome | Equivalência |
|---|---|
Negação de ∃ | ¬(∃ x, P x) ≡ ∀ x, ¬P x |
Negação de ∀ | ¬(∀ x, P x) ≡ ∃ x, ¬P x |
Elas trocam a negação com os quantificadores, estendendo as leis de De Morgan da Aula 1.
A primeira lei é construtiva nas duas direções.
Na segunda, produzir a testemunha exige raciocínio clássico, como na primeira lei de De Morgan: duas aplicações de Classical.byContradiction.
theorem not_exists_iff (α : Type) (P : α → Prop) :
¬(∃ x, P x) ↔ ∀ x, ¬P x := α:TypeP:α → Prop⊢ (¬∃ x, P x) ↔ ∀ (x : α), ¬P x
α:TypeP:α → Prop⊢ (¬∃ x, P x) → ∀ (x : α), ¬P xα:TypeP:α → Prop⊢ (∀ (x : α), ¬P x) → ¬∃ x, P x
α:TypeP:α → Prop⊢ (¬∃ x, P x) → ∀ (x : α), ¬P x α:TypeP:α → Proph:¬∃ x, P xa:αhPa:P a⊢ False
All goals completed! 🐙
α:TypeP:α → Prop⊢ (∀ (x : α), ¬P x) → ¬∃ x, P x α:TypeP:α → Proph:∀ (x : α), ¬P xhex:∃ x, P x⊢ False
α:TypeP:α → Proph:∀ (x : α), ¬P xa:αhPa:P a⊢ False
All goals completed! 🐙
theorem not_forall_exists (α : Type) (P : α → Prop)
(h : ¬∀ x, P x) : ∃ x, ¬P x := α:TypeP:α → Proph:¬∀ (x : α), P x⊢ ∃ x, ¬P x
α:TypeP:α → Proph:¬∀ (x : α), P x⊢ (¬∃ x, ¬P x) → False
α:TypeP:α → Proph:¬∀ (x : α), P xhne:¬∃ x, ¬P x⊢ False
α:TypeP:α → Proph:¬∀ (x : α), P xhne:¬∃ x, ¬P x⊢ ∀ (x : α), P x
α:TypeP:α → Proph:¬∀ (x : α), P xhne:¬∃ x, ¬P xa:α⊢ P a
α:TypeP:α → Proph:¬∀ (x : α), P xhne:¬∃ x, ¬P xa:α⊢ ¬P a → False
α:TypeP:α → Proph:¬∀ (x : α), P xhne:¬∃ x, ¬P xa:αhnPa:¬P a⊢ False
All goals completed! 🐙
intro aceita o padrão de construtor anônimo, introduzindo o existencial e o destruindo num só passo.
Um objetivo negado é uma função em False, então um termo de prova com um fun que casa padrões a prova, sem táticas.
Intro com padrão
example (α : Type) (P : α → Prop)
(h : ∀ x, ¬P x) : ¬∃ x, P x := α:TypeP:α → Proph:∀ (x : α), ¬P x⊢ ¬∃ x, P x
α:TypeP:α → Proph:∀ (x : α), ¬P xa:αhPa:P a⊢ False
All goals completed! 🐙
Termo de prova
example (α : Type) (P : α → Prop)
(h : ∀ x, P x) : ¬∃ x, ¬P x :=
fun ⟨a, hnPa⟩ => hnPa (h a)
A ordem determina o que um enunciado afirma.
Em ∀ y, ∃ x, R x y, a testemunha x pode depender de y; em ∃ x, ∀ y, R x y, uma única testemunha serve para todo y. A testemunha uniforme é o enunciado mais forte.
Quantificadores do mesmo tipo comutam; as trocas para ∀ e ∃ apareceram como exemplos nas §2.2 e §2.3.
Quantificadores de tipos distintos não comutam. Só uma direção vale: a ordem mais forte implica a mais fraca.
theorem exists_forall_swap (α β : Type) (R : α → β → Prop)
(h : ∃ x, ∀ y, R x y) : ∀ y, ∃ x, R x y := α:Typeβ:TypeR:α → β → Proph:∃ x, ∀ (y : β), R x y⊢ ∀ (y : β), ∃ x, R x y
α:Typeβ:TypeR:α → β → Proph:∃ x, ∀ (y : β), R x yb:β⊢ ∃ x, R x b
α:Typeβ:TypeR:α → β → Propb:βa:αha:∀ (y : β), R a y⊢ ∃ x, R x b
All goals completed! 🐙
A recíproca falha. Sobre ℕ tome R x y como x ≥ y. As duas afirmações do contraexemplo valem em Lean.
example : ∀ y : Nat, ∃ x : Nat, x ≥ y := ⊢ ∀ (y : Nat), ∃ x, x ≥ y
b:Nat⊢ ∃ x, x ≥ b
All goals completed! 🐙
example : ¬∃ x : Nat, ∀ y : Nat, x ≥ y := ⊢ ¬∃ x, ∀ (y : Nat), x ≥ y
a:Natha:∀ (y : Nat), a ≥ y⊢ False
All goals completed! 🐙
Um conjunto de elementos de α é determinado por quais elementos pertencem a ele, então o predicado de pertinência determina o conjunto. Tomamos isso como definição.
Um conjunto dado por uma propriedade é o predicado, e uma prova de pertinência é uma prova da propriedade.
def Set (α : Type) : Type := α → Prop
def Evens : Set Nat := fun n => ∃ k, n = 2 * k
example : (6 : Nat) ∈ Evens := ⟨3, rfl⟩
Uma classe de tipos declara uma operação e a deixa sem significado; uma instance fornece o significado em um tipo. O símbolo chega aos nossos conjuntos em três passos.
O símbolo é notação do módulo do núcleo Init.Notation, e abrevia uma aplicação. O nome à sua direita é o único campo de uma classe de Init.Prelude.
notation:50 a:50 " ∈ " b:50 => Membership.mem b a class Membership (α : outParam (Type u)) (γ : Type v) where mem : γ → α → Prop
O recipiente vem primeiro em mem e vem depois na notação, então x ∈ s abrevia Membership.mem s x.
O terceiro passo é nosso. O elaborador procura entre as instâncias registradas uma para o tipo de s, e Set α é uma definição desta aula, então sem uma instância nossa a busca falha.
As instâncias abaixo encerram essa busca: x ∈ s é s x por definição, e ⊆, ∪ e ∩ definem-se a partir dela.
instance : Membership α (Set α) :=
⟨fun s a => s a⟩
instance : HasSubset (Set α) :=
⟨fun s t => ∀ x, x ∈ s → x ∈ t⟩
instance : Union (Set α) :=
⟨fun s t => fun x => x ∈ s ∨ x ∈ t⟩
instance : Inter (Set α) :=
⟨fun s t => fun x => x ∈ s ∧ x ∈ t⟩
Cada notação desdobra-se na sua definição
example (α : Type) (s t : Set α) (h : s ⊆ t)
(x : α) (hx : x ∈ s) : x ∈ t := h x hx
example (α : Type) (s t : Set α) (x : α)
(hx : x ∈ s) : x ∈ s ∪ t := Or.inl hx
example (α : Type) (s t : Set α) (x : α)
(hx : x ∈ s ∩ t) : x ∈ t := hx.right
A teoria ingênua de conjuntos admite um conjunto para cada propriedade. Tome R como o conjunto de todos os conjuntos que não são elementos de si mesmos.
Então R ∈ R vale exatamente quando R ∉ R, uma contradição, e a teoria colapsa.
Em Lean, s : Set α contém apenas elementos de α, e o próprio s tem tipo Set α, não α, então s ∈ s não é bem tipado. Não há como enunciar a propriedade que define R, e o paradoxo não ocorre.
B. Russell, carta a Frege, 16 de junho de 1902.
A inclusão s ⊆ t é uma implicação universalmente quantificada, então as suas provas começam com intro x hx.
A pertinência a ∩ é uma conjunção e a ∪ uma disjunção; as regras dos conectivos da Aula 1 aplicam-se. Identidades de conjuntos são enunciadas como inclusões, pois a igualdade exige extensionalidade.
theorem inter_subset_left (α : Type) (s t : Set α) :
s ∩ t ⊆ s := α:Types:Set αt:Set α⊢ s ∩ t ⊆ s
α:Types:Set αt:Set αx:αhx:x ∈ s ∩ t⊢ x ∈ s
All goals completed! 🐙
theorem union_subset_swap (α : Type) (s t : Set α) :
s ∪ t ⊆ t ∪ s := α:Types:Set αt:Set α⊢ s ∪ t ⊆ t ∪ s
α:Types:Set αt:Set αx:αhx:x ∈ s ∪ t⊢ x ∈ t ∪ s
cases hx with
α:Types:Set αt:Set αx:αh:x ∈ s⊢ x ∈ t ∪ s All goals completed! 🐙
α:Types:Set αt:Set αx:αh:x ∈ t⊢ x ∈ t ∪ s All goals completed! 🐙
Um predicado é uma função α → Prop; quantificadores ligam a sua variável e produzem uma proposição.
∀: introduza com intro; elimine por instanciação, h a ou specialize.
∃: introduza com uma testemunha, ⟨3, rfl⟩ ou exists; elimine com obtain ⟨a, ha⟩ := h.
As leis de negação trocam ¬ com os quantificadores; ¬∃ é construtiva nas duas direções, ¬∀ exige Classical.byContradiction.
A ordem dos quantificadores importa: a testemunha uniforme ∃ x, ∀ y é mais forte, e só vale (∃ x, ∀ y) → (∀ y, ∃ x).
Um conjunto é o seu predicado de pertinência, Set α := α → Prop, com instâncias Membership, HasSubset, Union, Inter dando a notação.
Provas de inclusão começam com intro x hx; a pertinência a ∩ é uma conjunção e a ∪ uma disjunção, ponto a ponto.
Exercícios: veja as notas de aula.