在“5. Full OTT”部分末尾,作者展示了如何在OTT中定义构造器中的强制转换索引数据类型。这个想法基本上是把索引的数据类型为参数如下:观测类型理论中的模式匹配
data IFin : ℕ -> Set where
zero : ∀ {n} -> IFin (suc n)
suc : ∀ {n} -> IFin n -> IFin (suc n)
data PFin (m : ℕ) : Set where
zero : ∀ {n} -> suc n ≡ m -> PFin m
suc : ∀ {n} -> suc n ≡ m -> PFin n -> PFin m
康纳尔还提到在observational type theory (delivery)底部这项技术:
的修复,当然是做什么的GADT人们做了,并明确定义归纳的家庭直至命题平等。然后 当然你可以运输他们,通过transisitivity。
但是,Haskell中的类型检查器知道范围中的等式约束,并在类型检查时实际使用它们。例如。我们可以写
f :: a ~ b => a -> b
f x = x
它不会在类型理论这样的工作,因为它是不够的,有范围a ~ b
证明能够通过这个公式改写:该证明还必须refl
,因为在由于终止问题(例如this),虚假设定类型检查变得不可判定。因此,当你在Haskell中的Fin m
模式匹配时,m
会在每个分支中被重写为suc n
,但在类型理论中不会发生这种情况,相反,您将得到明确的suc n ~ m
证明。在OTT中,根本不可能根据样本进行模式匹配,因此您既不能伪装refl
也不需要实际证明。只能向coerce
提供证明或者忽略它。
这使得编写涉及索引数据类型的任何事情变得非常困难。例如。通常的三线(包括类型签名)lookup
为矢量成为该兽:
vlookupₑ : ∀ {n m a} {α : Level a} {A : Univ α} -> ⟦ n ≅ m ⇒ fin n ⇒ vec A m ⇒ A ⟧
vlookupₑ p (fzeroₑ q) (vconsₑ r x xs) = x
vlookupₑ {n} {m} p (fsucₑ {n′} q i) (vconsₑ {m′} r x xs) =
vlookupₑ (left (suc n′) {m} {suc m′} (trans (suc n′) {n} {m} q p) r) i xs
vlookupₑ {n} {m} p (fzeroₑ {n′} q) (vnilₑ r) =
⊥-elim $ left (suc n′) {m} {0} (trans (suc n′) {n} {m} q p) r
vlookupₑ {n} {m} p (fsucₑ {n′} q i) (vnilₑ r) =
⊥-elim $ left (suc n′) {m} {0} (trans (suc n′) {n} {m} q p) r
vlookup : ∀ {n a} {α : Level a} {A : Univ α} -> Fin n -> Vec A n -> ⟦ A ⟧
vlookup {n} = vlookupₑ (refl n)
它可能是一个比特简化,因为如果具有可判定平等数据类型的两个元件是可观察地相等,则它们在通常的内涵意义上也是平等的,自然数确实具有可判定的相等性,所以我们可以强制所有方程到它们的内涵对应和模式匹配,但是这会破坏vlookup
的一些计算属性,并且无论如何都是冗长的。用不能确定平等的指数处理更复杂的案例几乎是不可能的。
我的推理是否正确? OTT中的模式匹配是如何工作的?如果这确实是一个问题,有什么方法可以缓解它吗?
谢谢。我想我现在明白了我的困惑的根源:我写了一个小的[图书馆](https://github.com/effectfully/OTT)在Agda编写OTT,我遇到的问题是Agda的统一被钉在定义上的平等并不能处理幻想的命题平等,所以我试图做一些“内涵化”,这是一个详细和[简单](https://github.com/effectfully/OTT/blob/4b3966d9cce2324bce132243ce167ed932fccfa7/Property/Eq.agda# L107)当数据类型具有可判定的相等性时。但是,当然,还不能完全做到。这很伤心。 – user3237465