2.1. Predicados e Quantificadores
A Aula 1 excluiu "x é par" das proposições porque a sua verdade depende da variável livre x. Um predicado torna essa dependência explícita. Um predicado sobre um tipo α atribui uma proposição a cada elemento de α, então em Lean um predicado é uma função de tipo α → Prop.
#check fun n : Nat => n > 3
Quantificadores ligam a variável de um predicado e produzem uma proposição, e a Tabela 2.1.1 nomeia os dois.G. Frege, Begriffsschrift, eine der arithmetischen nachgebildete Formelsprache des reinen Denkens, Verlag von Louis Nebert, Halle, 1879. Escrevemos P x para a proposição que o predicado P produz em x.
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 |
Tabela 2.1.1. Os dois quantificadores, com os seus símbolos e leituras.
O quantificador liga a sua variável, então ∀ x, P x não depende de variável livre e é uma proposição. A variável percorre um tipo. Por exemplo, ∃ n : Nat, n * n = 9 afirma que algum número natural elevado ao quadrado dá 9. Quando o contexto determina o tipo, Lean o infere e omitimos a anotação.
2.1.1. Exemplos
Os exemplos abaixo escrevem predicados e proposições quantificadas e leem os seus tipos com #check. Um predicado tem tipo α → Prop, e uma proposição quantificada, que liga a sua variável, tem tipo Prop. O comando #eval informa o valor de verdade de um predicado decidível num ponto concreto através de decide.
Exemplo 1. Aplicar um predicado a um argumento produz uma proposição.
#check (fun n : Nat => n < 5) 3
Exemplo 2. Um predicado pode percorrer qualquer tipo, entre eles as cadeias de caracteres.
#check fun s : String => s.length > 0
Exemplo 3. Um predicado de dois argumentos é uma relação binária, uma função em Prop em duas etapas.
#check fun m n : Nat => m ≤ n
Exemplo 4. Um enunciado universalmente quantificado é uma proposição.
#check ∀ n : Nat, n + 0 = n
Exemplo 5. E um enunciado existencialmente quantificado também.
#check ∃ n : Nat, n > 100
Exemplo 6. Quantificadores aninhados de tipos diferentes ainda produzem uma proposição.
#check ∀ m : Nat, ∃ n : Nat, m < n
Exemplo 7. A variável ligada de um existencial pode percorrer cadeias de caracteres.
#check ∃ s : String, s.length = 3
Exemplo 8. Uma relação binária aplicada aos seus dois argumentos é de novo uma proposição.
#check (fun m n : Nat => m ≤ n) 2 3
Exemplo 9. Num ponto concreto um predicado decidível tem um valor de verdade computável, aqui verdadeiro.
#eval decide (3 < 5)
Exemplo 10. A mesma computação informa falso onde o predicado não vale.
#eval decide (2 = 3)