ZKA4IYXCTK6QCBUQPQ3N5AVNEM5O7OZTNF2JY2GG3GNHP6GTVTGAC open Data.Nat.Base using (_*_)open Data.Nat.Properties using (*-comm;+-assoc)data Bin : Set where⟨⟩ : Bin_O : Bin → Bin_I : Bin → Bininc : Bin → Bininc ⟨⟩ = ⟨⟩ Iinc (rest O) = rest Iinc (rest I) = (inc rest) Otoᴮ : ℕ → Bintoᴮ zero = ⟨⟩ Otoᴮ (suc n) = inc (toᴮ n)fromᴮ : Bin → ℕfromᴮ ⟨⟩ = 0fromᴮ (rest O) = 2 * (fromᴮ rest)fromᴮ (rest I) = 1 + 2 * (fromᴮ rest)*-distrib-+ : ∀ (m n p : ℕ) → (m + n) * p ≡ m * p + n * p*-distrib-+ zero n p = refl*-distrib-+ (suc m) n p rewrite *-distrib-+ m n p | +-assoc p (m * p) (n * p) = refl
from-inc-suc-from : ∀ (b : Bin) → fromᴮ (inc b) ≡ suc (fromᴮ b)from-inc-suc-from ⟨⟩ = reflfrom-inc-suc-from (b O) = reflfrom-inc-suc-from (b I) =beginfromᴮ (inc (b I))≡⟨⟩fromᴮ ((inc b) O)≡⟨⟩2 * (fromᴮ (inc b))≡⟨ cong (\x → 2 * x) (from-inc-suc-from b) ⟩2 * suc (fromᴮ b)≡⟨⟩2 * (1 + (fromᴮ b))≡⟨ *-comm 2 (1 + (fromᴮ b)) ⟩(1 + (fromᴮ b)) * 2≡⟨ *-distrib-+ 1 (fromᴮ b) 2 ⟩2 + (fromᴮ b) * 2≡⟨ cong (\x → 2 + x) (*-comm (fromᴮ b) 2) ⟩2 + 2 * (fromᴮ b)≡⟨⟩suc (1 + 2 * (fromᴮ b))≡⟨⟩suc (fromᴮ (b I))∎fromᴮ∘toᴮ : ∀ (n : ℕ) → (fromᴮ ∘ toᴮ) n ≡ nfromᴮ∘toᴮ zero = reflfromᴮ∘toᴮ (suc n) =begin(fromᴮ ∘ toᴮ) (suc n)≡⟨⟩fromᴮ (toᴮ (suc n))≡⟨⟩fromᴮ (inc (toᴮ n))≡⟨ from-inc-suc-from (toᴮ n) ⟩suc (fromᴮ (toᴮ n))≡⟨ cong suc (fromᴮ∘toᴮ n) ⟩suc n∎
open import plfa.part1.Induction using (Bin)