의존 타입(Dependent types)
값에 따라 달라지는 타입(type). '길이가 n인 벡터(vector)'처럼 타입 안에 값을 넣을 수 있게 되면, 타입으로 수학의 명제를, 프로그램으로 그 증명을 적을 수 있다.
리스트의 첫 원소(element)를 꺼내는 함수(function) head는 빈 리스트를 받으면 줄 것이 없습니다. 보통의 타입
의존 타입(dependent type)에는 두 가지 기본 구성이 있습니다. Π 타입
그림의 Fin n은 원소가 0, 1, …, n − 1의 n개인 타입입니다. 섬유는
섬유의 크기가 모두 |B|로 같으면 곱은
명제가 타입이 된다. 커리–하워드 대응(Curry–Howard correspondence)에서 A → B가 'A이면 B'였다면, 의존 타입에서는 Π가 '모든 x에 대해 B(x)'가, Σ가 'B(x)인 x가 있다'가 됩니다. Σ의 원소는 증인 x와 그 x가 조건을 만족한다는 증명의 쌍이므로, 이 '있다'는 증인을 내놓아야 하는 직관주의 논리(intuitionistic logic)의 '있다'입니다. 여기에 같음을 뜻하는 타입
귀납법은 되부름이다. 자연수를 0과 succ(다음 수)로 짓고(페아노의 방식), 덧셈을 첫째 인자에 대한 되부름으로 정의합니다:
첫째 줄에서 필요한 타입은 0 + 0 = 0인데, 0 + 0은 정의로 0이 되므로 refl이 맞습니다. 둘째 줄에서 필요한 타입은 succ k + 0 = succ k이고, 왼쪽은 덧셈 정의의 둘째 줄로 succ (k + 0)이 됩니다. 되부른 pz k는 k + 0 = k의 증명이고, 같은 것에 succ를 씌우면 같다는
n =
정의로 같음(definitional equality)과 증명해야 같음. 방금 본 비대칭은 우연이 아닙니다. 타입 검사기는 식을 계산해서 같아지는 것(정의로 같음)은 스스로 알아보고, 그렇지 않은 것(증명해야 같음)은 증명을 요구합니다. 두 벡터를 잇는 함수
역사. 네덜란드의 N. G. 더 브라위언은 1967년 무렵부터 수학 증명을 기계로 검사하는 언어 Automath를 만들며 의존 타입을 썼고, 윌리엄 하워드는 1969년 원고에서 ∀와 ∃까지 대응시키려면 의존 타입이 필요함을 보였습니다. 스웨덴의 페르 마르틴뢰프가 1971년 내놓은 첫 체계에는 모든 타입의 타입 Type이 있었고 Type : Type이 허용되었는데, 지라르가 1972년 이 체계에서 모순을 끌어냈습니다(지라르의 역설, Girard's paradox). '너무 큰 모임'이 모순을 낳는 러셀의 역설(Russell's paradox) 계열의 역설(정확히는 순서수(ordinal number) 전체에 관한 부랄리포르티 역설(Burali-Forti paradox))이 타입의 모습으로 되돌아온 것입니다. 해결책도 러셀의 유형 이론(type theory)을 닮았습니다. 타입의 모임을 층층의 우주
흔한 오해. '타입이 값에 의존한다'는 말은 실행 중에 값을 확인한다는 뜻이 아닙니다. head의 타입 안의 n은 변수 그대로 다뤄지고, 모든 검사는 실행 전에 끝납니다. 실행 중에 들어온 리스트의 길이를 미리 모를 때는 Σ 타입으로 '어떤 길이 n과 그 길이의 벡터'를 받은 뒤 n이 0인 경우와 아닌 경우를 나누어 다루면, 검사기가 두 경우 모두 올바른지 확인합니다. 또 의존 타입을 쓴다고 모든 것을 증명해야 하는 것도 아닙니다. 타입을 얼마나 자세히 적을지는 쓰는 사람이 고릅니다. List A라고만 적으면 보통의 언어와 같고, Vec A n이라 적으면 길이까지, '정렬된 벡터'라고 적으면 정렬까지 보증받는 대신 그만큼 증명을 해야 합니다.
이어지는 곳. Π와 Σ가 명제의 '모든'과 '있다'가 되는 것은 커리–하워드 대응을 1차 논리(first-order logic)까지 넓힌 것이고, Σ의 '있다'가 증인을 요구한다는 점은 직관주의 논리의 태도 그대로입니다. 되부르는 증명 pz는 수학적 귀납법이 프로그램으로 모습을 바꾼 것이고, 자연수를 0과 succ로 짓는 방식은 페아노의 공리(axiom)에서 왔습니다. 동일성 타입 a = b의 원소가 정말 refl뿐인지 묻는 데서 호모토피 타입 이론(homotopy type theory)이 시작되고, 이런 체계를 실제로 돌려 증명을 검사하는 도구가 증명 보조기(proof assistant)입니다. 섬유를 세는 그림은 대수적 자료형의 셈을 넓힌 것입니다. 우주를 층으로 나누는 방법은 러셀의 역설을 피하려던 러셀의 유형 이론을 닮았고, 그 흐름 전체는 타입 이론에서 볼 수 있습니다. 모든 함수가 끝나야 한다는 조건은 정지 문제 때문에 보수적으로만 검사할 수 있고, 이런 체계가 스스로의 무모순성(consistency)을 증명할 수 없다는 것은 괴델의 불완전성 정리(Gödel's incompleteness theorems)가 말해 줍니다. 명세를 타입에 적는 대신 프로그램 옆에 전조건(precondition)과 후조건(postcondition)을 적어 증명하는 길은 호어 논리(Hoare logic)이고, 귀납적으로 정의한 타입마다 생기는 재귀자(recursor)가 결과의 타입이 입력에 따라 달라지도록 fold를 넓힌 것이라는 점은 시작 대수에서 볼 수 있습니다.
이 개념이 나오는 긴 글
이 개념 위에 세워진 것
이 개념을 언급하는 페이지
- 타입 이론
… List처럼, 타입 연산자), 항을 받는 타입(수 n을 받아 '길이가 n인 벡터' 타입을 만드는 것처럼,의존 타입)입니다. 네덜란드 논리학자 헹크 바렌드레흐트는 1991년 이 세 방향을 정육면체의 세 축으로 그렸습니다. …
- 커리–하워드 대응
… 함수'로 정의합니다. 마지막 두 줄에서 명제 P(x)는 x에 따라 달라지는 타입이 되는데, 이런 타입이의존 타입입니다. '모든 x에 대해 P(x)'의 증명은 x를 받아 P(x)의 증명을 돌려주는 함수이고, 'P(x)인 …
- 직관주의 논리
… 브라우어 페이지에서 볼 수 있습니다. 모든 x에 대해 증명을 주는 '방법'을 실제 프로그램으로 쓰려면의존 타입이 필요하고, 거기서 수학적 귀납법은 되부름 함수가 됩니다. 크립키 모형과 열린 집합 모형은 둘 다 …
- 타입 추론: 힌들리–밀너
… 잡았기 때문입니다. 연산자 하나가 타입마다 다르게 일하는 오버로딩, 하위 타입, 인자까지 다형적인 함수,의존 타입이 들어오면 추론은 일부만 되거나 판정 불가능해지고, 프로그래머가 곳곳에 타입을 적어 주어야 합니다. …
- 다형성과 시스템 F
… X × L처럼 세는 방법은 대수적 자료형에서 다룹니다. ∀가 타입뿐 아니라 값까지 받을 수 있게 하면의존 타입이 되고, 거기서 ∀는 명제의 '모든'이 됩니다. 지라르는 타입의 타입을 허용하면(Type : …
- 호모토피 타입 이론
프로그래밍 언어에서 타입은 대략 '자료의 종류'입니다. 정수, 참·거짓, 문자열 같은 것이지요.의존 타입이론에서는 명제도 타입으로 쓰고, 그 타입의 원소를 그 명제의 증명으로 봅니다. 그래서 a = b 도 …
- 증명 보조기
… Coq(1989년 첫 공개, 2025년 Rocq로 이름을 바꿈), Agda, Lean(2013년 시작)은의존 타입이론 위에 서 있습니다. HOL 계열(HOL Light, Isabelle/HOL)은 처치의 단순 타입 …
- 수반 함자
… 커링의 수반은 데카르트 닫힌 범주와 람다 계산을 잇습니다. ∃와 ∀가 대입의 수반이라는 사실은의존 타입에서 Σ 타입과 Π 타입으로 다시 나타나고, '그리고'와 '이면'의 수반 a\wedge x\le b\iff …
- 데카르트 닫힌 범주
… 고정점 정리는 대각선 논법, 고정점, 자기 참조를 한 줄로 잇습니다. 타입이 값에 따라 달라지는의존 타입은 지수 대상을 Π 타입으로 넓힌 것이고, 그 위에서 증명을 검사하는 도구가 증명 보조기입니다. 함수 …
- 호어 논리와 프로그램 검증
… 분리 논리는 선형 논리와 닮았고, 명세를 타입에 적어 증명과 프로그램을 한 몸으로 만드는 다른 길은의존 타입과 증명 보조기에 있습니다.
- F-대수와 fold: 재귀와 귀납의 범주론
… 모노이드 준동형이 되는 경우는 모노이드의 foldMap에서, 재귀자의 타입이 귀납법이라는 것은의존 타입과 증명 보조기에서 이어집니다.