Barendregt의 람다 큐브에서 순수한 유형 시스템, 특히 가장 강력한 시스템 인 Calculus of Constructions를 사용하여 실험하고 있습니다. 이 시스템은 종류가 *
와 BOX
. 기록을 위해 아래 에서 고전적인 람다 미적분에 가까운 https://github.com/Gabriel439/Haskell-Morte-LibraryMorte
도구 의 구체적인 구문을 사용하고 있습니다.
우리는 일종의 교회와 같은 인코딩 (일명 대수 데이터 유형에 대한 Boehm-Berarducci isomorphism)으로 유도 유형을 모방 할 수 있습니다. 간단한 예제 Bool = ∀(t : *) -> t -> t -> t
에서는 생성자 True = λ(t : *) -> λ(x : t) -> λ(y : t) -> x
와 and와 type 을 사용합니다 False = λ(t : *) -> λ(x : t) -> λ(y : t) -> y
.
용어 수준 함수 Bool -> T
의 유형 Product T T
이 실제로 동일인 Product = λ(A : *) -> λ(B : *) -> ∀(t : *) -> (A -> B -> t) -> t
기능 if : Bool -> λ(t : *) -> t -> t -> t
을 통해 고전적인 모듈로 파라 메트릭을 가진 유형 쌍에 대해 동형임을 알 수 있습니다.
아래의 모든 질문은 종속 유형의 표현에 관한 것 Bool -> *
입니다.
나는 나눌 수
D : Bool -> *
의 쌍으로D True
와D False
.D
다시 만들 수있는 정식 방법이 있습니까? 형식 수준에서Bool -> T = Product T T
함수의 아날로그로 동형 이성 현상을 재현하고 싶지만 유형과 같은 인수로 종류를 전달할 수 없으므로이 함수if
를 원래처럼 간단하게 작성할if
수 없습니다.나는 질문을 해결하기 위해 두 개의 구성 요소가있는 일종의 유도 성 유형을 사용합니다 (1). 고급 설명 (Agda 스타일)은 다음 유형입니다 (type-level 대신 사용됨
if
).data BoolDep (T : *) (F : *) : Bool -> * where DepTrue : T -> BoolDep T F True DepFalse : F -> BoolDep T F False
PTS / CoC에서 다음 인코딩으로 :
λ(T : *) -> λ(F : *) -> λ(bool : Bool ) -> ∀(P : Bool -> *) -> ∀(DepTrue : T -> P True ) -> ∀(DepFalse : F -> P False ) -> P bool
인코딩이 올바른가요?
BoolDep
이 코드와 같은 생성자를 작성할 수 있습니다DepTrue : ∀(T : *) -> ∀(F : *) -> T -> BoolDep T F True
.λ(T : *) -> λ(F : *) -> λ(arg : T ) -> λ(P : Bool -> *) -> λ(DepTrue : T -> P True ) -> λ(DepFalse : F -> P False ) -> DepTrue arg
그러나 역 기능 (또는 역 방향의 기능)을 적을 수는 없습니다. 가능합니까? 아니면 BoolDep
동형을 만들기 위해 다른 표현을 사용해야 BoolDep T F True = T
합니까?