Files
agda-doodles/plfa/Induction.agda
2020-06-05 19:01:27 +02:00

207 lines
5.3 KiB
Agda
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module plfa.Induction where
import Relation.Binary.PropositionalEquality as Eq hiding (subst)
open Eq using (_≡_; refl; cong; sym)
open Eq.≡-Reasoning
open import Data.Nat using (; zero; suc; _+_; _*_; _∸_; _^_)
+-assoc : (m n p : ) (m + n) + p m + (n + p)
+-assoc zero n p = refl
+-assoc (suc m) n p =
begin
(suc m + n) + p
≡⟨⟩
suc (m + n) + p
≡⟨⟩
suc ((m + n) + p)
≡⟨ cong suc (+-assoc m n p)
suc (m + (n + p))
≡⟨⟩
suc m + (n + p)
+-zero : (m : ) m + zero m
+-zero zero = refl
+-zero (suc m) =
begin
suc m + zero
≡⟨⟩
suc (m + zero)
≡⟨ cong suc (+-zero m)
suc m
+-suc : (m n : ) m + suc n suc (m + n)
+-suc zero n = refl
+-suc (suc m) n =
begin
suc m + suc n
≡⟨⟩
suc (m + suc n)
≡⟨ cong suc (+-suc m n)
suc (suc (m + n))
≡⟨⟩
suc (suc m + n)
+-comm : (m n : ) m + n n + m
+-comm m zero =
begin
m + zero
≡⟨ +-zero m
m
≡⟨⟩
zero + m
+-comm m (suc n) =
begin
m + suc n
≡⟨ +-suc m n
suc (m + n)
≡⟨ cong suc (+-comm m n)
suc (n + m)
≡⟨⟩
suc n + m
+-rearrange : (m n p q : ) (m + n) + (p + q) m + (n + p) + q
+-rearrange m n p q =
begin
(m + n) + (p + q)
≡⟨ +-assoc m n (p + q)
m + (n + (p + q))
≡⟨ cong (m +_) (sym (+-assoc n p q))
m + ((n + p) + q)
≡⟨ sym (+-assoc m (n + p) q)
(m + (n + p)) + q
≡⟨⟩
m + (n + p) + q
-- stretch finite-+-assoc
-- this one is weird, but maybe:
-- 0 : N
-- 1 : N (0 + 0) + 0 ≡ 0 + (0 + 0)
-- 2 : N (0 + 0) + 0 ≡ 0 + (0 + 0) (1 + 0) + 0 ≡ 1 + (0 + 0) (1 + 1) + 0 ≡ 1 + (1 + 0) ...
-- 3 : N (0 + 0) + 0 ≡ 0 + (0 + 0) (1 + 0) + 0 ≡ 1 + (0 + 0) ... (2 + 2) + 2 ≡ 2 + (2 + 2)
-- but im not really sure here
+-assoc : (m n p : ) (m + n) + p m + (n + p)
+-assoc zero n p = refl
+-assoc (suc m) n p rewrite +-assoc m n p = refl
+-identity : (n : ) n + zero n
+-identity zero = refl
+-identity (suc n) rewrite +-identity n = refl
+-suc : (m n : ) m + suc n suc (m + n)
+-suc zero n = refl
+-suc (suc m) n rewrite +-suc m n = refl
+-comm : (m n : ) m + n n + m
+-comm m zero rewrite +-identity m = refl
+-comm m (suc n) rewrite +-suc m n | +-comm m n = refl
+-swap : (m n p : ) m + (n + p) n + (m + p)
+-swap m n p =
begin
m + (n + p)
≡⟨ sym (+-assoc m n p)
m + n + p
≡⟨ cong (_+ p) (+-comm m n)
n + m + p
≡⟨ +-assoc n m p
n + (m + p)
*-distrib-+ : (m n p : ) (m + n) * p m * p + n * p
*-distrib-+ zero n p = refl
*-distrib-+ (suc m) n p rewrite +-suc m n | *-distrib-+ m n p | +-assoc p (m * p) (n * p) = refl
*-assoc : (m n p : ) (m * n) * p m * (n * p)
*-assoc zero n p = refl
*-assoc (suc m) n p rewrite *-distrib-+ n (m * n) p | *-assoc m n p = refl
*-zero : (m : ) m * 0 0
*-zero zero = refl
*-zero (suc m) = *-zero m
*-id : (m : ) m * 1 m
*-id zero = refl
*-id (suc m) rewrite *-id m = refl
*-suc : (m n : ) m * suc n m + m * n
*-suc zero n = refl
*-suc (suc m) n rewrite *-suc m n | +-swap n m (m * n) = refl
*-comm : (m n : ) m * n n * m
*-comm m zero = *-zero m
*-comm m (suc n) rewrite *-suc m n | *-comm m n = refl
0∸n≡0 : (n : ) zero n zero
0∸n≡0 zero = refl
0∸n≡0 (suc n) = refl
∸-+-assoc : (m n p : ) m n p m (n + p)
∸-+-assoc m zero p rewrite +-zero m = refl
∸-+-assoc zero (suc n) p rewrite 0∸n≡0 p = refl
∸-+-assoc (suc m) (suc n) p rewrite ∸-+-assoc m n p = refl
+*^-dist : (m n p : ) m ^ (n + p) (m ^ n) * (m ^ p)
+*^-dist m n zero rewrite +-zero n | *-id (m ^ n) = refl
+*^-dist m n (suc p) rewrite +-suc n p | +*^-dist m n p | sym (*-assoc m (m ^ n) (m ^ p)) | *-comm m (m ^ n) | *-assoc (m ^ n) m (m ^ p) = refl
^-zero-pos : (m : ) 0 ^ (suc m) 0
^-zero-pos m = refl
*^-dist : (m n p : ) (m * n) ^ p (m ^ p) * (n ^ p)
*^-dist m n zero = refl
*^-dist m zero (suc p) rewrite ^-zero-pos (suc p) | *-comm m (m ^ p) | *-zero m =
begin
0
≡⟨ sym (*-zero m)
m * 0
≡⟨ cong (m *_) (sym (*-zero (m ^ p)))
m * ((m ^ p) * 0)
≡⟨ sym (*-assoc m (m ^ p) 0)
m * m ^ p * 0
≡⟨ cong (_* 0) (*-comm m (m ^ p))
(m ^ p) * m * 0
*^-dist zero (suc n) (suc p) rewrite ^-zero-pos (suc p) = refl
*^-dist (suc m) (suc n) (suc p) rewrite *^-dist m n p = {!!}
data Bin : Set where
⟨⟩ : Bin
_O : Bin Bin
_I : Bin Bin
inc : Bin Bin
inc ⟨⟩ = ⟨⟩ I
inc (m O) = m I
inc (m I) = inc m O
to : Bin
to zero = ⟨⟩
to (suc n) = inc (to n)
from : Bin
from ⟨⟩ = 0
from (n O) = 2 * from n
from (n I) = 1 + 2 * from n
-- Exercise
inc-suc : (x : Bin) from (inc x) suc (from x)
inc-suc ⟨⟩ = refl
inc-suc (x O) = refl
inc-suc (x I) rewrite inc-suc x | +-suc (suc (from x)) (from x + 0) = refl
-- to (from b) -> wrong when leading Os are involved
from-to : (n : ) from (to n) n
from-to zero = refl
from-to (suc n) rewrite inc-suc (to n) | from-to n = refl