Skip to content

Instantly share code, notes, and snippets.

@khibino
Created October 18, 2023 10:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save khibino/e42d20d7302bb9605d3e036d91611a18 to your computer and use it in GitHub Desktop.
Save khibino/e42d20d7302bb9605d3e036d91611a18 to your computer and use it in GitHub Desktop.
Monoid Sum
open import Relation.Binary.PropositionalEquality.Core using (_≡_; refl; cong)
record Monoid (m : Set) : Set where
infixl 6 _⊕_
field
_⊕_ : m → m → m
associativity : ∀{a b c} → ((a ⊕ b) ⊕ c) ≡ (a ⊕ (b ⊕ c))
open Monoid {{...}}
data NList (m : Set) : Set where
Sing : m → NList m
Cons : m → NList m → NList m
infixr 5 _++_
_++_ : ∀ {m} → NList m → NList m → NList m
Sing x ++ ys = Cons x ys
Cons x xs ++ ys = Cons x (xs ++ ys)
data Bin (m : Set) : Set where
Leaf : m → Bin m
Plus : Bin m → Bin m → Bin m
bin2nlist : ∀ {m} → Bin m → NList m
bin2nlist (Leaf m) = Sing m
bin2nlist (Plus b₁ b₂) = bin2nlist b₁ ++ bin2nlist b₂
sumNList : ∀ {m}{{M : Monoid m}} → NList m → m
sumNList {_} (Sing m) = m
sumNList {m} (Cons x xs) = x ⊕ sumNList xs
sumBin : ∀ {m}{{M : Monoid m}} → Bin m → m
sumBin (Leaf m) = m
sumBin (Plus b₁ b₂) = sumBin b₁ ⊕ sumBin b₂
sum-dist : ∀{m} {{M : Monoid m}} → (xs ys : NList m) → sumNList (xs ++ ys) ≡ sumNList xs ⊕ sumNList ys
sum-dist {_} (Sing x) ys = refl
sum-dist {m} (Cons x xs) ys rewrite associativity {m} {x} {sumNList xs} {sumNList ys} =
cong (_⊕_ x) (sum-dist xs ys)
sum-universal : ∀{m} {{M : Monoid m}} → (b : Bin m) → sumNList (bin2nlist b) ≡ sumBin b
sum-universal {m} (Leaf x) = refl
sum-universal {m} (Plus b₁ b₂)
rewrite sum-dist (bin2nlist b₁) (bin2nlist b₂)
rewrite sum-universal b₁
rewrite sum-universal b₂ = refl
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment