{-# OPTIONS --cubical --safe --postfix-projections #-}
module Demos.Binary where
open import Data.Nat
open import Testers
open import Prelude
infixl 5 _1đ _2đ
data đš : Type where
0đ : đš
_1đ : đš â đš
_2đ : đš â đš
âŚ_ââ§ : đš â â
⌠0đ ââ§ = 0
⌠n 1đ ââ§ = 1 + ⌠n ââ§ * 2
⌠n 2đ ââ§ = 2 + ⌠n ââ§ * 2
inc : đš â đš
inc 0đ = 0đ 1đ
inc (xs 1đ) = xs 2đ
inc (xs 2đ) = inc xs 1đ
âŚ_ââ§ : â â đš
⌠zero ââ§ = 0đ
⌠suc n ââ§ = inc ⌠n ââ§
inc-suc : â x â ⌠inc x â⧠⥠suc ⌠x ââ§
inc-suc 0đ i = 1
inc-suc (x 1đ) i = 2 + ⌠x ââ§ * 2
inc-suc (x 2đ) i = suc (inc-suc x i * 2)
inc-2*-1đ : â n â inc ⌠n * 2 â⧠⥠⌠n ââ§ 1đ
inc-2*-1đ zero i = 0đ 1đ
inc-2*-1đ (suc n) i = inc (inc (inc-2*-1đ n i))
đš-rightInv : â x â ⌠⌠x ââ§ â⧠⥠x
đš-rightInv zero = refl
đš-rightInv (suc x) = inc-suc ⌠x ââ§ Íž cong suc (đš-rightInv x)
đš-leftInv : â x â ⌠⌠x ââ§ â⧠⥠x
đš-leftInv 0đ = refl
đš-leftInv (x 1đ) = inc-2*-1đ ⌠x ââ§ Íž cong _1đ (đš-leftInv x)
đš-leftInv (x 2đ) = cong inc (inc-2*-1đ ⌠x ââ§) Íž cong _2đ (đš-leftInv x)
ââđš : đš â â
ââđš .fun = âŚ_ââ§
ââđš .inv = âŚ_ââ§
ââđš .rightInv = đš-rightInv
ââđš .leftInv = đš-leftInv