Verificação Formal de Software

3.2. Tipos Indutivos🔗

O comando inductive define um tipo novo listando os seus construtores. O tipo contém exatamente os valores construídos por finitas aplicações de construtores, e nada mais. A definição abaixo reconstrói os números naturais dentro de um espaço de nomes, já que o nome Nat pertence a Lean.

namespace MyNat inductive Nat : Type where | zero : Nat | succ : Nat Nat end MyNat

Os comandos #check e #print inspecionam o resultado. O construtor succ recebe um Nat e constrói o seguinte.

MyNat.Nat.succ : MyNat.Nat MyNat.Nat#check MyNat.Nat.succ
MyNat.Nat.succ : MyNat.Nat  MyNat.Nat
inductive MyNat.Nat : Type number of parameters: 0 constructors: MyNat.Nat.zero : MyNat.Nat MyNat.Nat.succ : MyNat.Nat MyNat.Nat#print MyNat.Nat
inductive MyNat.Nat : Type
number of parameters: 0
constructors:
MyNat.Nat.zero : MyNat.Nat
MyNat.Nat.succ : MyNat.Nat  MyNat.Nat

Construtores podem carregar dados de outros tipos. O tipo abaixo representa expressões aritméticas com constantes inteiras, variáveis nomeadas por cadeias de caracteres e quatro operadores. Ele é a sintaxe abstrata de uma linguagem pequena, e a linguagem imperativa das últimas aulas o estende.

inductive AExp : Type where | num : AExp | var : String AExp | add : AExp AExp AExp | sub : AExp AExp AExp | mul : AExp AExp AExp | div : AExp AExp AExp

Por fim, as listas. Uma lista sobre α é vazia ou é um elemento seguido de uma lista. Como no caso de Nat, Lean já fornece List, então a reconstrução vive em um espaço de nomes.

namespace MyList inductive List (α : Type) : Type where | nil : List α | cons : α List α List α end MyList

3.2.1. Exemplos🔗

Os exemplos abaixo constroem valores dos tipos indutivos desta seção e os inspecionam com #check e #print.

Exemplo 1. O numeral três são três aplicações de succ a zero.

MyNat.Nat.zero.succ.succ.succ : MyNat.Nat#check MyNat.Nat.succ (MyNat.Nat.succ (MyNat.Nat.succ MyNat.Nat.zero))
MyNat.Nat.zero.succ.succ.succ : MyNat.Nat

Exemplo 2. Uma enumeração é um tipo indutivo cujos construtores não carregam dados.

inductive Answer : Type where | yes : Answer | no : Answer | maybe : Answer Answer.maybe : Answer#check Answer.maybe
Answer.maybe : Answer

Exemplo 3. A expressão (x + 3) * y é um valor de AExp. As aplicações de construtores espelham a forma da expressão.

((AExp.var "x").add (AExp.num 3)).mul (AExp.var "y") : AExp#check AExp.mul (AExp.add (AExp.var "x") (AExp.num 3)) (AExp.var "y")
((AExp.var "x").add (AExp.num 3)).mul (AExp.var "y") : AExp

Exemplo 4. A lista que contém 3 e 7 são duas aplicações de cons terminadas em nil.

MyList.List.cons 3 (MyList.List.cons 7 MyList.List.nil) : MyList.List #check MyList.List.cons 3 (MyList.List.cons 7 MyList.List.nil)
MyList.List.cons 3 (MyList.List.cons 7 MyList.List.nil) : MyList.List 

Exemplo 5. Um construtor pode receber vários argumentos. O tipo abaixo empacota dois inteiros.

inductive Interval : Type where | mk : Interval Interval.mk 1 5 : Interval#check Interval.mk 1 5
Interval.mk 1 5 : Interval

Exemplo 6. #print lista os construtores de um tipo.

inductive MyList.List : Type Type number of parameters: 1 constructors: MyList.List.nil : {α : Type} MyList.List α MyList.List.cons : {α : Type} α MyList.List α MyList.List α#print MyList.List
inductive MyList.List : Type  Type
number of parameters: 1
constructors:
MyList.List.nil : {α : Type}  MyList.List α
MyList.List.cons : {α : Type}  α  MyList.List α  MyList.List α

Exemplo 7. Aplicações de construtores se aninham a qualquer profundidade. O valor abaixo é a expressão x / 0, um trecho de sintaxe legítimo cuja avaliação as próximas seções discutem.

(AExp.var "x").div (AExp.num 0) : AExp#check AExp.div (AExp.var "x") (AExp.num 0)
(AExp.var "x").div (AExp.num 0) : AExp

Exemplo 8. Os numerais do próprio Lean elaboram para o Nat do núcleo. A reconstrução e o original são tipos distintos.

3 : #check (3 : )
3 : 

Exemplo 9. A lista vazia sobre ℤ exige uma anotação de tipo, já que nil sozinho não determina α.

MyList.List.nil : MyList.List #check (MyList.List.nil : MyList.List )
MyList.List.nil : MyList.List 

Exemplo 10. Os quatro pontos cardeais como uma enumeração, impressos.

inductive Direction : Type where | north : Direction | south : Direction | east : Direction | west : Direction inductive Direction : Type number of parameters: 0 constructors: Direction.north : Direction Direction.south : Direction Direction.east : Direction Direction.west : Direction#print Direction
inductive Direction : Type
number of parameters: 0
constructors:
Direction.north : Direction
Direction.south : Direction
Direction.east : Direction
Direction.west : Direction