종속 유형 이론 및 '임의'유형 기능
이 질문에 대한 나의 첫 번째 대답은 개념이 높고 세부 사항이 낮았으며 '무슨 일이 일어나고 있습니까?'라는 하위 질문에 반영되었습니다. 이 답변은 동일하지만 '임의의 유형 함수를 얻을 수 있습니까?'라는 하위 질문에 중점을 둡니다.
합 생성물의 대수 조작을 한 확장 시퀀스 (또는 도메인을 통해 함수보다 일반적으로, 합 및 제품)의 합 생성물을 나타내는 소위 "대규모 사업자의 일반적 기록 Σ
하고 Π
각각을. 시그마 표기법을 참조하십시오 .
그래서 합계
a₀ + a₁X + a₂X² + ...
쓰여질지도 모른다
Σ[i ∈ ℕ]aᵢXⁱ
여기서 a
실수의 일부 순서는, 예를 들면. 제품이 Π
대신 유사하게 표시 됩니다 Σ
.
멀리서 보면 이런 종류의 표현은 '임의'기능과 비슷합니다 X
. 우리는 물론 표현 가능한 시리즈 및 관련 분석 기능으로 제한됩니다. 이것은 유형 이론의 표현에 대한 후보입니까? 명확히!
이러한 표현들을 즉각적으로 표현하는 유형 이론의 종류는 '종속적 인'유형 이론의 종류입니다 : 종속 유형을 가진 이론. 당연히 용어에 따라, 유형 함수 및 유형 수량 화가있는 Haskell과 같은 언어, 유형에 따라 용어 및 유형이 있습니다. 종속 설정에서는 용어에 따라 유형이 추가로 있습니다. Haskell은 종속 유형 언어가 아니지만 , 언어를 약간 고문함으로써 종속 유형의 많은 기능을 시뮬레이션 할 수 있습니다 .
카레 하워드 및 종속 유형
'Curry-Howard isomorphism'은 단순한 유형의 람다 미적분학의 용어와 유형 판단 규칙이 직감적 인 제안 논리에 적용된 자연 공제 (Gentzen에 의해 공식화 된)와 정확히 일치한다는 관찰로 인생을 시작했습니다. , 및 두 가지가 독립적으로 발명 / 발견되었지만 증거를 대신하는 용어. 그 이후로, 그것은 유형 이론가들에게 큰 영감의 원천이었습니다. 고려해야 할 가장 명백한 사항 중 하나는 제안 논리에 대한 이러한 대응 관계를 술어 또는 상위 논리로 확장 할 수 있는지 여부와 방법입니다. 의존적 유형 이론은 처음에이 탐사 길에서 생겨났다.
단순 유형 람다 미적분학에 대한 Curry-Howard 동형에 대한 소개는 여기를 참조 하십시오 . 예를 들어, 증명하고 싶다면 A ∧ B
증명 A
하고 증명 해야합니다 B
. 결합 된 증명은 단순히 한 쌍의 증명입니다 (각 연결마다 하나씩).
자연 공제에서 :
Γ ⊢ A Γ ⊢ B
Γ ⊢ A ∧ B
간단하게 입력 된 람다 미적분학에서 :
Γ ⊢ a : A Γ ⊢ b : B
Γ ⊢ (a, b) : A × B
비슷한 ∨
유형 및 합계 유형, →
함수 유형 및 다양한 제거 규칙이 존재합니다.
입증 할 수없는 (직관적으로 거짓 인) 제안은 무인도 유형에 해당합니다.
논리적 명제와 같은 유형의 유추를 고려하여 유형 세계에서 술어를 모델링하는 방법을 고려할 수 있습니다. 이것이 공식화되는 방법에는 여러 가지가 있지만 (일반적으로 사용되는 표준에 대한 Martin-Löf의 직관적 유형 이론 소개 참조 ) 추상적 인 접근 방식은 일반적으로 술어가 자유 용어 변수의 제안과 같거나, 또는 건의안을 채택하는 기능. 유형 표현식에 용어가 포함되도록 허용하면 람다 미적분학 스타일의 처리가 즉시 가능한 것으로 나타납니다!
건설적인 증거 만 고려하면 다음의 증거는 ∀x ∈ X.P(x)
무엇입니까? 우리는이를 증거 함수로 생각할 수 있으며, x
해당하는 명제 ( P(x)
)의 증거에 용어 ( )를 사용 합니다. 종류 (명제)의 회원 (증명) 그래서 ∀x : X.P(x)
각각의 '종속 함수'이다 x
에서이 X
유형의 용어를 줄은 P(x)
.
무엇에 대해 ∃x ∈ X.P(x)
? 우리의 모든 구성원이 필요합니다 X
, x
함께의 증거로 P(x)
. 종류 (명제)의 회원 (증명) 그래서 ∃x : X.P(x)
고유 용어 : '좌우 쌍'이다 x
에서 X
함께 유형의 용어와 함께 P(x)
.
표기법 : 사용하겠습니다
∀x ∈ X...
클래스 멤버에 대한 실제 진술 X
및
∀x : X...
type에 대한 범용 정량화에 해당하는 유형 표현식의 경우 X
. 마찬가지로 ∃
.
조합 고려 사항 : 제품 및 합계
제안과 유형의 카레 하워드 대응뿐만 아니라, 우리는이 질문의 주요 포인트 인 숫자와 기능을 가진 대수 유형의 조합 대응을 가지고 있습니다. 다행히도 위에서 설명한 종속 유형으로 확장 할 수 있습니다!
모듈러스 표기법을 사용하겠습니다
|A|
유형의 '크기'를 나타 내기 위해 A
유형과 숫자 사이의 질문에 설명 된 대응 관계를 명시 적으로 나타냅니다 . 이것은 이론을 벗어난 개념입니다. 나는 언어 내에 그러한 연산자가 필요하다고 주장하지 않습니다.
유형의 가능한 (완전히 축소 된, 표준적인) 멤버를 계산해 봅시다
∀x : X.P(x)
이것은 type의 용어 x
를 type의 용어 로 취하는 종속 함수 X
의 유형 P(x)
입니다. 이러한 각 함수에는의 모든 항에 대한 X
출력이 있어야하며이 출력은 특정 유형이어야합니다. x
에서의 각각 에 대해 X
, 이것은 |P(x)|
출력의 '선택'을 제공합니다.
펀치 라인은
|∀x : X.P(x)| = Π[x : X]|P(x)|
물론 X
is IO ()
인 경우 큰 의미 가 없지만 대수 유형에 적용 할 수 있습니다.
마찬가지로 유형의 용어
∃x : X.P(x)
쌍 타입 (x, p)
으로 p : P(x)
하므로, 어떠한 주어진 x
에서 X
우리가 임의의 멤버가 적절한 쌍을 만들 수 P(x)
주는 |P(x)|
'선택'.
그 후,
|∃x : X.P(x)| = Σ[x : X]|P(x)|
같은 경고로.
이것은 기호 Π
와를 사용하여 이론에서 종속 유형에 대한 공통 표기법을 정당화 Σ
하며 실제로 많은 이론은 위에서 언급 한 서신으로 인해 '모두'와 '제품', '존재 함'과 '합'사이의 구분을 흐리게합니다.
우리는 점점 가까워지고 있습니다!
벡터 : 종속 튜플을 나타내는
이제 다음과 같은 숫자 표현식을 인코딩 할 수 있습니까?
Σ[n ∈ ℕ]Xⁿ
유형 표현으로?
좀 빠지는. 유형과 자연수가 Xⁿ
있는 Haskell 과 같은 표현의 의미를 비공식적으로 고려할 수 있지만 표기법의 남용입니다. 이것은 숫자를 포함하는 유형 표현식입니다. 분명히 유효한 표현식이 아닙니다 .X
n
반면에 그림에 종속 된 유형의 경우 숫자를 포함하는 유형이 정확하게 포인트입니다. 실제로 종속 튜플 또는 '벡터'는 종속 유형이 목록 액세스와 같은 작업에 실용적인 유형 수준의 안전성을 제공 할 수있는 방법에 대한 매우 일반적인 예입니다 . 벡터는 길이에 관한 타입 레벨 정보와 함께리스트 일뿐 Xⁿ
입니다.
이 답변이 지속되는 동안
Vec X n
-type 값 의 length- n
vector 유형입니다 X
.
기술적으로 n
여기에는 실제 자연수가 아니라 자연수 시스템의 표현이 있습니다. 우리는 (자연수를 나타낼 수 있습니다 Nat
중 하나를 제로 (로 페 아노 스타일) 0
) 또는 후계자 ( S
또 다른 자연수의), 그리고 n ∈ ℕ
내가 쓰기 ˻n˼
에 용어 의미 Nat
나타내는을 n
. 예를 들어 ˻3˼
입니다 S (S (S 0))
.
그럼 우리는
|Vec X ˻n˼| = |X|ⁿ
어떤 n ∈ ℕ
.
Nat 유형 : ℕ 용어를 유형으로 승격
이제 다음과 같은 표현식을 인코딩 할 수 있습니다
Σ[n ∈ ℕ]Xⁿ
유형으로. 이러한 특정 표현은 물론 X
질문에서 식별 된 바와 같이 의 목록 유형에 대해 동형 인 유형을 야기 할 것이다 . (그뿐만 아니라,하지만보기의 카테고리 이론적 관점에서, 유형 기능 - 펑터이다 - 복용 X
위의 유형은 자연적으로 동형 목록 펑터합니다.)
'임의'기능을위한 퍼즐의 마지막 조각은 인코딩하는 방법입니다.
f : ℕ → ℕ
같은 표현
Σ[n ∈ ℕ]f(n)Xⁿ
전력 계수에 임의의 계수를 적용 할 수 있습니다.
우리는 이미 대수 유형과 숫자의 대응 관계를 이해하여 유형에서 숫자로, 유형 함수에서 숫자로 맵핑 할 수 있습니다. 우리는 또한 다른 길로 갈 수 있습니다! -자연수를 취하면 종속 유형이 있는지 여부에 관계없이 많은 수의 멤버와 함께 명백한 대수 유형이 있습니다. 우리는 이것을 유도함으로써 유형 이론 밖에서 쉽게 증명할 수 있습니다 . 우리가 필요한 것은 시스템 내부 에서 자연수에서 유형으로 매핑하는 방법 입니다.
우리가 의존적 유형을 가지면, 재귀에 의한 유도와 구성에 의한 증거는 매우 유사 해집니다. 실제로 많은 이론에서 똑같은 것입니다. 우리는 우리의 요구를 충족시키는 유형이 존재한다는 사실을 귀납하여 증명할 수 있기 때문에이를 구성 할 수 없어야합니까?
용어 레벨에서 유형을 나타내는 여러 가지 방법이 있습니다. 여기서는 *
유형의 우주에 대한 가상의 Haskellish 표기법을 사용할 것입니다 . 그 자체는 일반적으로 종속 설정의 유형으로 간주됩니다. 1
마찬가지로, ℕ
종속 유형 이론이있는 것처럼 ' 제거' 를 표시하는 방법은 최소한 여러 가지 가 있습니다. Haskellish 패턴 일치 표기법을 사용하겠습니다.
우리는 매핑을 필요 α
로 Nat
하는 *
특성과,
∀n ∈ ℕ.|α ˻n˼| = n.
다음 의사 정의가 충분합니다.
data Zero -- empty type
data Successor a = Z | Suc a -- Successor ≅ Maybe
α : Nat -> *
α 0 = Zero
α (S n) = Successor (α n)
그래서 우리는 그 α
행동이 후계자의 행동 을 반영하여 S
일종의 동질성을 만드는 것을 볼 수 있습니다. Successor
유형의 멤버 수에 '1을 추가'하는 유형 함수입니다. 즉, 정의 된 크기의 |Successor a| = 1 + |a|
모든 것 a
입니다.
예를 들어 α ˻4˼
( α (S (S (S (S 0))))
)는
Successor (Successor (Successor (Successor Zero)))
이 유형의 용어는
Z
Suc Z
Suc (Suc Z)
Suc (Suc (Suc Z))
정확히 네 가지 요소를 제공합니다 |α ˻4˼| = 4
.
마찬가지로, n ∈ ℕ
우리는
|α ˻n˼| = n
필요에 따라.
- 많은 이론에 따르면 멤버는
*
유형을 나타내는 대표자 일 뿐이며 유형 용어에서 *
관련 유형 으로의 명시 적 매핑으로 작업이 제공됩니다 . 다른 이론은 리터럴 유형 자체가 용어 수준 엔티티가되도록 허용합니다.
'임의'기능?
이제 우리는 완전한 일반 전력 계열을 유형으로 표현하는 장치를 갖추 었습니다!
시리즈
Σ[n ∈ ℕ]f(n)Xⁿ
유형이된다
∃n : Nat.α (˻f˼ n) × (Vec X n)
˻f˼ : Nat → Nat
함수 언어 내에서 적절한 표현이 어디에 있습니까 f
? 우리는 이것을 다음과 같이 볼 수 있습니다.
|∃n : Nat.α (˻f˼ n) × (Vec X n)|
= Σ[n : Nat]|α (˻f˼ n) × (Vec X n)| (property of ∃ types)
= Σ[n ∈ ℕ]|α (˻f˼ ˻n˼) × (Vec X ˻n˼)| (switching Nat for ℕ)
= Σ[n ∈ ℕ]|α ˻f(n)˼ × (Vec X ˻n˼)| (applying ˻f˼ to ˻n˼)
= Σ[n ∈ ℕ]|α ˻f(n)˼||Vec X ˻n˼| (splitting product)
= Σ[n ∈ ℕ]f(n)|X|ⁿ (properties of α and Vec)
이것이 어떻게 '임의'입니까? 우리는이 방법에 의한 정수 계수뿐만 아니라 자연수로 제한됩니다. 그 외에도 의존 유형이 f
있는 Turing Complete 언어를 고려하면 자연 수 계수로 모든 분석 함수를 나타낼 수 있습니다.
예를 들어, List X ≅ 1/(1 - X)
이러한 부정적 및 비정 수 '유형'유형과 관련하여 어떤 상황에서 어떤 의미가 있는지에 대한 사례와의 상호 작용에 대해서는 조사하지 않았습니다 .
이 답변이 임의의 유형 함수로 얼마나 멀리 갈 수 있는지 탐구하는 데 도움이되기를 바랍니다.