Let's play Agda
{-# OPTIONS --cubical-compatible #-}
module Padova2025-zh-TW.ProvingBasics.Termination.BoveCapretta.Digits where

位數,再訪#

open import Padova2025-zh-TW.ProgrammingBasics.Naturals.Base
open import Padova2025-zh-TW.ProgrammingBasics.Naturals.Arithmetic
open import Padova2025-zh-TW.ProvingBasics.Termination.Ordering
open import Padova2025-zh-TW.ProvingBasics.Termination.WellFounded.Base

表示這個函數#

data Def : ℕ → Set
f₀ : (n : ℕ) → Def n → ℕ

data Def where
  base : Def zero
  step : {x : ℕ} → Def (half (succ x)) → Def (succ x)

f₀ zero       base     = zero
f₀ x@(succ _) (step p) = succ (f₀ (half x) p)

用良基歸納驗證全函數性#

習題 1total
total : (x : ℕ) → Def x
total x = go x (ℕ-wf x)
  where
  go : (x : ℕ) (gas : Acc _<'_ x) → Def x
  go zero       gas     = {!!}
  go x@(succ _) (acc f) = {!!}
參考解答用到: base step half <⇒<' half-<
參考解答
total : (x : ℕ) → Def x
total x = go x (ℕ-wf x)
  where
  go : (x : ℕ) (gas : Acc _<'_ x) → Def x
  go zero       gas     = base
  go x@(succ _) (acc f) = step (go (half x) (f (<⇒<' (half-< _))))
digits₅ : ℕ → ℕ
digits₅ x = f₀ x (total x)

驗證定義等式#

open import Padova2025-zh-TW.ProvingBasics.Equality.Base
open import Padova2025-zh-TW.ProvingBasics.Equality.General
習題 2Def-prop
Def-prop : {x : ℕ} (p q : Def x) → p ≡ q
Def-prop = {!!}
參考解答用到: base refl step cong
參考解答
Def-prop : {x : ℕ} (p q : Def x) → p ≡ q
Def-prop base base = refl
Def-prop (step p) (step q) = cong step (Def-prop p q)
習題 3f₀-extensional
f₀-extensional : (x : ℕ) (p q : Def x) → f₀ x p ≡ f₀ x q
f₀-extensional = {!!}
參考解答用到: cong Def-prop
參考解答
f₀-extensional : (x : ℕ) (p q : Def x) → f₀ x p ≡ f₀ x q
f₀-extensional x p q = cong (f₀ x) (Def-prop p q)
習題 4digits₅-eq
digits₅-eq : (x : ℕ) → digits₅ (succ x) ≡ succ (digits₅ (half (succ x)))
digits₅-eq = {!!}
參考解答用到: cong f₀-extensional
參考解答
digits₅-eq : (x : ℕ) → digits₅ (succ x) ≡ succ (digits₅ (half (succ x)))
digits₅-eq x = cong succ (f₀-extensional (half (succ x)) _ _)