의존 타입(Dependent Types)은 타입이 값에 의존할 수 있는 타입 시스템이다. 길이가 정확히 n인 벡터 Vec A n처럼 런타임 값을 타입에 인코딩해 더 강력한 정적 보장을 제공한다.
기본 개념
일반 타입: List Int (임의 길이 리스트)
의존 타입: Vec Int 3 (길이 3인 벡터)
-- Pi 타입 (의존 함수 타입): Πx:A. B(x)
-- 반환 타입이 입력값 x에 의존
replicate : (n : Nat) -> A -> Vec A n
-- Sigma 타입 (의존 쌍 타입): Σx:A. B(x)
-- 두 번째 구성요소의 타입이 첫 번째 값에 의존
NonEmptyList : Σ(n:Nat). n > 0 × Vec A n
Agda로 보는 의존 타입
agda
-- 자연수 정의
data Nat : Set where
zero : Nat
suc : Nat → Nat
-- 길이 인덱스된 벡터
data Vec (A : Set) : Nat → Set where
[] : Vec A zero
_∷_ : A → Vec A n → Vec A (suc n)
-- 안전한 head: 빈 벡터 불가
head : Vec A (suc n) → A
head (x ∷ _) = x
-- 컴파일 타임에 빈 벡터 접근 방지!
-- 타입 레벨 덧셈
_++_ : Vec A m → Vec A n → Vec A (m + n)
[] ++ ys = ys
(x ∷ xs) ++ ys = x ∷ (xs ++ ys)
Coq에서의 의존 타입
coq
(* 정렬된 리스트를 타입으로 표현 *)
Inductive Sorted : list nat -> Prop :=
| sorted_nil : Sorted []
| sorted_one : forall x, Sorted [x]
| sorted_cons : forall x y l,
x <= y -> Sorted (y :: l) ->
Sorted (x :: y :: l).
(* 삽입 정렬이 Sorted를 만족함을 증명 *)
Idris 2 실용 예시
idris
-- 행렬 곱셈: 차원 불일치 컴파일 에러
matMul : Matrix m n -> Matrix n p -> Matrix m p
-- 효과 타입 시스템
readLine : IO String
writeFile : (path : String) -> (content : String) -> IO ()
주요 도구 비교
| 언어/도구 | 특징 | 용도 |
|---|
| Coq | 전술 기반 증명 | 수학, 컴파일러 검증 |
| Agda | 함수형, 패턴 매칭 | 타입 이론 연구 |
| Idris | 실용적 프로그래밍 | 검증된 프로그램 |
| Lean 4 | 빠른 컴파일 | 수학 자동화 |
관련 개념