{-# 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