Prova por Reescrita

Esse teorema é um pouco mais interessante que anteriores:

Plus_id_example (n: Nat) (m: Nat) (e: Equal Nat n m) : Equal Nat (Plus n n) (Plus m m)

Assim como mostrado anteriormente, essa é uma prova que dentro de seus argumentos temos uma outra prova, ou hipótese: no caso, temos Equal n m - ou seja, n e m são iguais.

Como n e m são números arbitrários, não podemos só usar simplificação para demonstrar o teorema. Em vez disso, nós observando que, já que assumimos Equal n m, poderíamos substituir n por m no objetivo e os dois lados ficarão iguais. A função que usamos para fazer essa substituição é a Equal.rewrite.

Como não podemos reescrever diretamente no objetivo, nós usamos uma outra igualdade e fazemos ela ser igual ao objetivo. No nosso caso, usaremos um Equal.apply em e para conseguir essa igualdade.

Plus_id_example (n: Nat) (m: Nat) (e: Equal Nat n m) : Equal Nat (Plus n n) (Plus m m)

Plus_id_example n m e =
  let app = Equal.apply (k => Plus k n) e
  ? 
+ INFO  Inspection.

   • Expected: Equal Nat (Plus n n) (Plus m m) 

   • Context: 
   •   n   : Nat 
   •   m   : Nat 
   •   e   : Equal Nat n m 
   •   app : Equal Nat (Plus n n) (Plus m n) 
   •   app = Equal.apply Nat Nat n m (k => (Plus k n)) e
    
   let app = Equal.apply (k => Plus k n) e
      ?
      ┬
      └Here!

Esse app será do tipo Equal (Plus n n) (Plus m n), como mostrado no comentário. Com isso feito, precisamos trocar o n por m no lado direito da igualdade, e pra isso usamos o rewrite:

Plus_id_example (n: Nat) (m: Nat) (e: Equal Nat n m) : Equal Nat (Plus n n) (Plus m m)
Plus_id_example n m e =
  let app = Equal.apply (k => Plus k n) e
  let rrt = Equal.rewrite e (x => Equal (Plus n n) (Plus m x)) app
  rrt
+ INFO  Inspection.

   • Expected: Equal Nat (Plus n n) (Plus m m) 

   • Context: 
   •   n   : Nat 
   •   m   : Nat 
   •   e   : Equal Nat n m 
   •   app : Equal Nat (Plus n n) (Plus m n) 
   •   app = Equal.apply Nat Nat n m (k => (Plus k n)) e 
   •   rrt : Equal Nat (Plus n n) (Plus m m) 
   •   rrt = Equal.rewrite Nat n m e (x => Equal Nat (Plus n n) (Plus m x)) app

O retorno da operação Equal.rewrite já será a prova que precisamos, então só retornamos direto o resultado da função.

Plus_id_exercise

Prove que:

Plus_id_exercise (n: Nat) (m: Nat) (o: Nat) (e1: Equal Nat n m) (e2: Equal Nat m o) : Equal Nat (Plus n m) (Plus m o)
Plus_id_exercise n m o e1 e2 = ?