携带样张的功能是否比没有样张的功能更好?

时间:2015-12-15 22:03:16

标签: specifications agda dependent-type

携带样张的功能是否比没有样张的功能更好? 特别是,设置:

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

但是,我们可以定义toFinfromFin的更多约束版本:

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

现在的问题是哪种方法更好,为什么?

第一个在设置方面是直截了当的,但是声音证明有点冗长。而第二种方法需要更多的设置,通过健忘的仿函数等等,但随后的健全性证明相当短。

赞赏任何见解: - )

0 个答案:

没有答案