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