Equal.chain e Equal.mirror
Nessa parte não falaremos de nenhuma ferramenta inerentemente nova, mas sim de alguns utilitários de provas para facilitar o uso das ferramentas anteriores.
Imagine o exemplo:
Example_mirror (a: Nat) (b: Nat) (e: Equal Nat a b) : Equal Nat b a
Parece um exemplo trivial. Se a é igual a b, b é igual a a, correto?
Apesar de correto, o type checker do Kind não reconhece essa igualdade, pois para ele, a ordem é importante.
Para esse tipo de situação, temos a função Equal.mirror, que simplesmente troca os lados de uma igualdade.
Example_mirror (a: Nat) (b: Nat) (e: Equal Nat a b) : Equal Nat b a
Example_mirror a b e =
let mir = Equal.mirror e
mir
+ INFO Inspection.
• Expected: Equal Nat b a
• Context:
• a : Nat
• b : Nat
• e : Equal Nat a b
• mir : Equal Nat b a
• mir = Equal.mirror Nat a b e
Apesar de não parecer muito útil no momento, essa operação é muito útil para nosso segundo utilitário: Equal.chain.
Equal.chain é um caso específico do Equal.rewrite, no qual você reescreve um lado inteiro de uma igualdade usando outra.
Example_chain (a: Nat) (b: Nat) (c: Nat) (e1: Equal Nat b (Plus a a)) (e2 : Equal Nat c (Plus a a)) : Equal Nat b c
Como nós já conhecemos o Equal.rewrite, poderíamos usar ele para resolver esse teorema, mas ao invés disso vamos usar o Equal.chain.
Equal.chain funciona "encadeando" duas igualdades que tenham a mesma expressão no lado direito da primeira igualdade e no lado esquerdo da segunda,
"grudando" essas igualdades pela expressão em comum, gerando uma nova igualdade com as outras duas expressões (Equal.chain (a=b) (b=c) = (a=c)).
Por exemplo, no nosso exemplo, o lado direito das duas igualdades é igual. Se usarmos Equal.mirror em uma delas, podemos dar Equal.chain nelas:
Example_chain (a: Nat) (b: Nat) (c: Nat) (e1: Equal Nat b (Plus a a)) (e2 : Equal Nat c (Plus a a)) : Equal Nat b c
Example_chain a b c e1 e2 =
let e3 = Equal.mirror e2
let chn = Equal.chain e1 e3
+ INFO Inspection.
• Expected: Equal Nat b c
• Context:
• a : Nat
• b : Nat
• c : Nat
• e1 : Equal Nat b (Plus a a)
• e2 : Equal Nat c (Plus a a)
• e3 : Equal Nat (Plus a a) c
• e3 = Equal.mirror Nat c (Plus a a) e2
• chn : Equal Nat b c
• chn = Equal.chain Nat b (Plus a a) c e1 e3