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