PTS / CoC에서 교회 인코딩 유형에 대한 종속 유형


11

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 -> *입니다.

  1. 나는 나눌 수 D : Bool -> *의 쌍으로 D TrueD False. D다시 만들 수있는 정식 방법이 있습니까? 형식 수준에서 Bool -> T = Product T T함수의 아날로그로 동형 이성 현상을 재현하고 싶지만 유형과 같은 인수로 종류를 전달할 수 없으므로이 함수 if를 원래처럼 간단하게 작성할 if수 없습니다.

  2. 나는 질문을 해결하기 위해 두 개의 구성 요소가있는 일종의 유도 성 유형을 사용합니다 (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
    

    인코딩이 올바른가요?

  3. 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합니까?


제품 TT부울부울((:)())생성물(:)(())

@Giorgio Mossa는 cstheory.stackexchange.com/questions/30923/…를 참조하십시오 -만약 당신이 모든 모델이 아니라 초기 (구문 적) 모델에서 파라 메트릭 성을 가지고 있다면 당신은 동형이됩니다.
ZeitRaffer

답변:


9

다음에 대한 전통적인 교회 인코딩을 사용하여이 작업을 수행 할 수 없습니다 Bool.

#Bool = ∀(Bool : *) → ∀(True : Bool) → ∀(False : Bool) → Bool

... 유용한 유형의 함수를 작성할 수 없기 때문에 :

#Bool → *

앞서 언급했듯이,에 *대한 첫 번째 인수로 전달할 수 없기 #Bool때문에 TrueFalse인수가 유형이 아닐 수 있습니다.

이 문제를 해결할 수있는 방법은 최소한 세 가지가 있습니다.

  1. 유도 구조물의 미적분학을 사용하십시오. 그런 다음 유형을 일반화 할 수 있습니다 #Bool.

    #Bool = ∀(n : Nat) → ∀(Bool : *ₙ) → ∀(True : Bool) → ∀(False : Bool) → Bool
    

    ... 그리고 당신은 인스턴스화 것 n1당신이 전달할 수있는 수단, *₀때문에 두 번째 유형 검사 것 인수로 :

    *₀ : *₁
    

    ... 그래서 #Bool두 가지 유형 중에서 선택할 수 있습니다.

  2. 하나 더 정렬 추가 :

    * : □ : △
    

    그런 다음 다음 #Bool₂과 같이 별도의 유형을 정의합니다 .

    #Bool₂ = ∀(Bool : □) → ∀(True : Bool) → ∀(False : Bool) → Bool
    

    이것은 본질적으로 귀납적 계산법의 특별한 경우이지만 재사용 할 수있는 코드를 생성하지 않기 때문에 이제는 #Bool지원하고자하는 각 종류마다 하나씩 두 개의 별도 정의를 유지해야합니다 .

  3. #Bool₂건축 미적분학에서 다음과 같이 직접 인코딩 하십시오.

    #Bool₂ = ∀(True : *) → ∀(False : *) → *
    

목표가 수정되지 않은 상태에서 이것을 직접 사용하는 morte것이라면 접근법 # 3 만 작동합니다.


보시다시피 # Bool₁-> # Bool₂로 변환 할 수 없습니까?
ZeitRaffer

@ZeitRaffer 맞습니다. 당신은에서 변환 할 수 없습니다 #Bool₁#Bool₂
가브리엘 곤잘레스

1
흠 ... IIUC 당신은 "유도 구조의 계산법"이라고 부르는 유형의 무한 계층 구조를 가진 미적분학이지만, 원래의 CIC에는 AFAIK가 없었습니다 (유도 성 유형 만 CoC에 추가했습니다). 루오의 ECC (확장 건축 미적분학)를 생각하고 계십니까?
Stefan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.