Uma tática opera sobre um objetivo e o prova ou cria subobjetivos. Um objetivo é o sequente C ⊢ Q, com antecedente C, o contexto local, e consequente Q, a conclusão.
Regressiva, a partir do objetivo
para provar c,
por hbc basta provar b;
para provar b,
por hab basta provar a;
e ha prova a.
Progressiva, a partir das hipóteses
de ha e hab, temos b;
de b e hbc, temos c.
A frase característica de uma prova regressiva é "basta provar". Em uma derivação de dedução natural, as premissas de cada regra ficam acima do traço de inferência e a conclusão abaixo dele. A leitura progressiva vai das suposições, no topo, para a conclusão, e a regressiva vai da conclusão para as suposições.
§4.1 Modo de táticas
A palavra-chave by entra no modo de táticas, e cada linha depois dela é uma tática. trace_state imprime o objetivo entre os passos.
Táticas básicas realizam uma transformação elementar do estado da prova cada uma, e nenhuma depende de um conectivo ou de uma teoria em particular.
intro move variáveis e suposições para o contexto; apply casa a conclusão do objetivo com a de um teorema e deixa os seus argumentos e premissas não resolvidos como objetivos; exact fecha o objetivo com um termo; assumption procura no contexto.
Um objetivo demonstrável continua demonstrável após intro. apply e clear podem transformar um objetivo demonstrável em um indemonstrável. sorry fecha qualquer coisa e #print axioms o relata como sorryAx.
§4.3 Regras como teoremas
Cada figura de inferência da Aula 1 é um teorema ordinário, aplicado regressivamente por apply.
Uma metavariável ?a representa um termo por determinar, e a unificação o determina. O marcador · foca um subobjetivo; a justaposição instancia uma regra progressivamente.
Passar hab diretamente a And.right é um pequeno passo progressivo dentro de uma prova regressiva, e evita as metavariáveis que apply And.right deixaria.
§4.3 Quantificadores, verdade, falsidade, negação
Exists.intro : ∀ (w : ?α), ?p w → ∃ x, ?p x
Exists.elim : (∃ x, ?p x) → (∀ (w : ?α), ?p w → ?b) → ?b
True.intro : True
False.elim : False → ?c
Classical.em : ∀ (p : Prop), p ∨ ¬p
Classical.byContradiction : (¬?a → False) → ?a
A negação dispensa regras: ¬a é definida como a → False, então intro se aplica a uma conclusão negada.
True.intro é a única regra da verdade; a falsidade não tem regra de introdução, e False.elim fecha qualquer objetivo a partir de uma prova de False.
As estratégias do guia para provas proposicionais.
Olhe a conclusão. Uma implicação ou uma negação pede intro.
Olhe as hipóteses. Uma conjunção oferece And.left e And.right, uma disjunção oferece Or.elim, uma equivalência oferece Iff.mp e Iff.mpr.
Case a conclusão do objetivo com uma regra de introdução e a aplique com apply.
Prefira táticas que preservam a demonstrabilidade enquanto fizerem progresso, e registre os pontos de escolha em que uma tática se compromete com um lado.
Quando um subobjetivo repete uma hipótese, exact ou assumption o fecha.
Quando nada construtivo se aplica, considere uma análise de casos sobre Classical.em.
Se a prova não progride, retroceda até o último ponto de escolha e tente a outra opção.
§4.4 rfl e as conversões
rfl prova l = r quando os lados coincidem a menos de computação, e cada passo de computação é uma conversão nomeada.
α renomeia uma variável ligada
β aplica uma função anônima
δ desdobra uma definição
ζ substitui um let
η fun x => f x é igual a f
ι projeta um construtor
rw aplica uma equação da esquerda para a direita, uma vez: encontra o primeiro subtermo que casa, substitui toda ocorrência dele e então tenta rfl. ← inverte a equação, at h mira uma hipótese, e o nome de uma constante usa as equações que a definem.
simp reescreve com o conjunto simp exaustivamente. simp [t] adiciona um teorema ou constante por chamada, simp [-t] remove um, simp [*] at * usa tudo em toda parte, e @[simp] registra um teorema permanentemente.
A reescrita é onde as provas deixam de ser previsíveis. Tente uma tática, estude os subobjetivos que surgem e ajuste. Nas palavras do guia, NÃO ENTRE EM PÂNICO.
§4.6 Indução
induction produz um subobjetivo nomeado por construtor, e os nomes do ramo ligam os argumentos do construtor e a hipótese de indução.
induction n with
| zero => (caso base)
| succ n' ih => (caso do passo)
Induza sobre o argumento que a recursão consome.
Um caso base difícil sinaliza a variável errada ou um teorema auxiliar que falta.
A Aula 3 enunciou reverse (x :: xs) = snoc (reverse xs) x com sorry. O enunciado mistura appendPretty e snoc, então a peça que falta é o teorema que os relaciona.