"전체 OTT"섹션의 끝 부분 인 Towards Observational Type Theory에서 저자는 OTT에서 coercible-under-constructors 색인 데이터 유형을 정의하는 방법을 보여줍니다. 코너는 observational type theory (delivery)의 하단에이 기술을 언급 관측 유형 이론의 패턴 일치
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
가
: 다음과 같은 파라미터에 아이디어는 인덱스 데이터 유형을 설정하는 기본적수정, 물론,이해야 할 무엇 GADT 사람들은 명시 적 평등에 대해 명시 적으로 유도 가정을 정의합니다. 그리고 나서 물론 transisitivity에 의해 그들을 수송 할 수 있습니다.
그러나 Haskell의 유형 검사기는 범위의 동일성 제약 조건을 인식하고 실제로 유형 검사 중에이를 사용합니다. 예 : 그것은 유형 이론에 그렇게 작동하지 않습니다
f :: a ~ b => a -> b
f x = x
는이 방정식에 의해 재 작성 할 수있는 범위 내에서 a ~ b
의 증거가 충분하지이기 때문에 우리가 쓸 수 있습니다 : 그 증거는, refl
해야합니다에 있기 때문에 거짓 가설 유형 검사의 종료는 종료 문제 (this과 같은 것)로 인해 결정 불가능 해집니다. 따라서 Haskell에서 Fin m
의 패턴 일치를 m
이 각 분기에서 으로 다시 작성하지만 형식 이론에서는 발생할 수 없으며 대신 suc n ~ m
이라는 확실한 증거가 남습니다. OTT에서는 교정본에 패턴 매칭을 할 수 없으므로 증명이 refl
인 것처럼 할 수도없고 실제로 요구할 수도 없습니다. 증거를 coerce
에 제공하거나 무시할 수 있습니다.
이렇게하면 인덱싱 된 데이터 형식과 관련된 모든 것을 작성하기가 매우 어렵습니다. 예 : (타입 시그니처 포함) 보통 세 라인 벡터의 lookup
이 짐승된다 : decidable 동등성을 가지는 데이터 유형의 두 요소가 observably 같으면 보낸 후,
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)
그것은 다소 단순화 될 수 그들이 는 일반적인 intensional sense와 동일하고 자연수는 결정할 수있는 평등을 갖기 때문에 모든 방정식을 intensional counterparts와 pattern match로 강요 할 수 있습니다. 그러나 이는 vlookup
의 일부 계산 속성을 깨고 어쨌든 장황합니다. 평등을 결정할 수없는 지표로 더 복잡한 사례를 다루는 것은 거의 불가능합니다.
제 생각은 정확합니까? OTT의 패턴 매칭은 어떻게 작동합니까? 이것이 실제로 문제가된다면 그것을 완화 할 수있는 방법이 있습니까?
감사합니다. 나는 이제 나의 혼란의 근원을 이해한다고 생각한다. 나는 Agda에 OTT를 작성하기위한 작은 [library] (https://github.com/effectfully/OTT)를 썼다. 문제는 Agda의 통일이 정의 평등에 못 박혔다는 것이다. 공상적인 명제 평등을 다룰 수는 없으므로 나는 좀 더 장황하고 더 단순한 "intensionalization"을하려고 노력하고있다. (https://github.com/effectfully/OTT/blob/4b3966d9cce2324bce132243ce167ed932fccfa7/Property/Eq.agda# L107) 데이터 유형이 결정할 수있는 평등을 가질 때. 물론 아직도 완전히 끝낼 수는 없습니다. 그거 슬프다. – user3237465