携带样张的功能是否比没有样张的功能更好? 特别是,设置:
data Fin : ℕ → Set where
zero : ∀ {n} → Fin (suc n)
succ : ∀ {n} → Fin n → Fin (suc n)
Fin′ : ℕ → Set
Fin′ n = Σ m ∶ ℕ • m < n -- Σ∶• = Data.Product.Σ
两种类型之间存在同构,可以通过
直接实现toFin : ∀{n} → Fin′ n → Fin n
fromFin : ∀{n} → Fin n → Fin′ n
只是将一个嵌入另一个,然后我们有
fin-sound : ∀ {n} {m : Fin′ n} → fromFin(toFin m) ≡ m
fin-sound˘ : ∀ {n} {m : Fin n} → toFin(fromFin m) ≡ m
但是,我们可以定义toFin
和fromFin
的更多约束版本:
fin : ∀{n} → (m′ : Fin′ n) → Σ m ∶ Fin n • (m′ ′) ≡ (` m)
fin˘ : ∀{n} → (m : Fin n) → Σ m′ ∶ Fin′ n • (` m) ≡ (m′ ′)
其中前后引用是显而易见的遗忘函子:
_′ : ∀{n} → Fin′ n → ℕ
`_ : ∀{n} → Fin n → ℕ
和以前一样,或多或少,我们可以展示
fin-soundness : ∀{n}{m′ : Fin′ n} → proj₁(fin˘(proj₁ (fin m′))) ≡ m′
fin-soundness˘ : ∀ {n} {m : Fin n} → proj₁(fin(proj₁ (fin˘ m))) ≡ m
现在的问题是哪种方法更好,为什么?
第一个在设置方面是直截了当的,但是声音证明有点冗长。而第二种方法需要更多的设置,通过健忘的仿函数等等,但随后的健全性证明相当短。
赞赏任何见解: - )