소개
Lean은 의존 타입 이론에 기반한 대화형 정리 증명기입니다. 원래 Microsoft Research에서 개발되었으며, 현재는 Lean FRO에서 개발이 이루어지고 있습니다. 의존 타입 이론은 프로그램의 세계와 증명의 세계를 하나로 묶습니다. 따라서 Lean은 프로그래밍 언어이기도 합니다. Lean은 이러한 이중적 본성을 진지하게 받아들이며, 범용 프로그래밍 언어로 사용하기에 적합하도록 설계되었습니다. 심지어 Lean은 Lean 자체로 구현되어 있습니다. 이 책은 Lean으로 프로그램을 작성하는 방법을 다룹니다.
프로그래밍 언어로서 보면, Lean은 의존 타입을 갖춘 엄격한 순수 함수형 언어입니다. Lean으로 프로그래밍하는 법을 배우는 일의 상당 부분은 이러한 각 특성이 프로그램 작성 방식에 어떤 영향을 미치는지, 그리고 함수형 프로그래머처럼 생각하는 법을 배우는 것입니다. 엄격성은 Lean의 함수 호출이 대부분의 언어에서와 비슷하게 동작한다는 뜻입니다. 즉, 함수 본문이 실행되기 시작하기 전에 인자가 완전히 계산됩니다. 순수성은 프로그램의 타입에 명시되지 않는 한, Lean 프로그램이 메모리 위치 수정, 이메일 전송, 파일 삭제와 같은 부수 효과를 가질 수 없다는 뜻입니다. 함수가 다른 모든 값과 마찬가지로 일급 값이고 실행 모델이 수학적 표현식의 평가에서 영감을 받았다는 의미에서, Lean은 함수형 언어입니다. Lean의 가장 독특한 특징인 의존 타입은 타입을 언어의 일급 구성 요소로 만들어, 타입이 프로그램을 포함하고 프로그램이 타입을 계산할 수 있게 합니다.
이 책은 Lean을 배우고 싶지만 함수형 프로그래밍 언어를 사용해 본 경험은 없을 수도 있는 프로그래머를 대상으로 합니다. Haskell, OCaml, F# 같은 함수형 언어에 익숙할 필요는 없습니다. 반면에 이 책은 대부분의 프로그래밍 언어에 공통적인 반복문, 함수, 자료 구조 같은 개념은 이미 알고 있다고 가정합니다. 이 책은 함수형 프로그래밍에 대한 좋은 첫 책이 되고자 하지만, 프로그래밍 자체를 처음 배우는 사람에게 좋은 첫 책은 아닙니다.
Lean을 증명 보조기로 사용하는 수학자라면 언젠가는 맞춤형 증명 자동화 도구를 작성해야 할 가능성이 높습니다. 이 책은 그러한 수학자를 위한 책이기도 합니다. 이러한 도구는 정교해질수록 함수형 언어로 작성한 프로그램과 비슷해지지만, 현업 수학자 대부분은 Python이나 Mathematica 같은 언어로 훈련받았습니다. 이 책은 그 간극을 메우는 데 도움을 주어, 더 많은 수학자가 유지보수하기 쉽고 이해하기 쉬운 증명 자동화 도구를 작성할 수 있게 합니다.
이 책은 처음부터 끝까지 순서대로 읽도록 구성되어 있습니다. 개념은 한 번에 하나씩 소개되며, 뒤쪽 절에서는 앞쪽 절의 내용을 이미 알고 있다고 가정합니다. 때로는 앞에서 간단히만 다루었던 주제를 뒤쪽 장에서 깊이 있게 다루기도 합니다. 이 책의 일부 절에는 연습 문제가 있습니다. 해당 절의 내용을 확실히 이해하려면 연습 문제를 풀어 보는 것이 좋습니다. 책을 읽으면서 Lean을 직접 탐구하고, 배운 내용을 새롭고 창의적인 방식으로 활용해 보는 것도 도움이 됩니다.
Lean 설치하기
Lean으로 프로그램을 작성하고 실행하려면 먼저 자신의 컴퓨터에 Lean을 설치해야 합니다. Lean 도구 모음은 다음과 같이 구성됩니다.
-
elan은rustup이나ghcup과 비슷하게 Lean 컴파일러 툴체인을 관리합니다. -
lake는cargo,make, Gradle과 마찬가지로 Lean 패키지와 그 의존성을 빌드합니다. -
lean은 개별 Lean 파일을 타입 검사하고 컴파일할 뿐만 아니라, 현재 작성 중인 파일에 대한 정보를 프로그래머 도구에 제공합니다. 일반적으로lean은 사용자가 직접 호출하기보다는 다른 도구가 호출합니다. -
Visual Studio Code나 Emacs 같은 편집기용 플러그인으로,
lean과 통신하여 그 정보를 편리하게 보여 줍니다.
Lean 설치에 관한 최신 안내는 Lean 매뉴얼을 참고하십시오.
표기 규칙
Lean에 입력으로 제공되는 코드 예제는 다음과 같은 형식으로 표시됩니다:
def add1 (n : Nat) : Nat := n + 1#eval add1 7
위의 마지막 줄(#eval로 시작하는 줄)은 Lean에게 답을 계산하도록 지시하는 명령입니다. Lean의 응답은 다음과 같은 형식으로 표시됩니다.
Lean이 반환하는 오류 메시지의 형식은 다음과 같습니다:
경고는 다음과 같은 형식으로 표시됩니다:
유니코드
관용적인 Lean 코드는 ASCII에 속하지 않는 다양한 유니코드 문자를 사용합니다. 예를 들어, α, β 같은 그리스 문자와 화살표 →는 모두 이 책의 첫 번째 장에 등장합니다. 이를 통해 Lean 코드는 일반적인 수학 표기법에 더 가까운 모습을 띨 수 있습니다.
Lean 기본 설정에서는 Visual Studio Code와 Emacs 모두 백슬래시(\) 뒤에 이름을 붙여 이러한 문자를 입력할 수 있습니다. 예를 들어 α를 입력하려면 \alpha를 입력하십시오. Visual Studio Code에서 어떤 문자를 입력하는 방법을 알아보려면 해당 문자에 마우스를 올려 놓고 툴팁을 확인하십시오. Emacs에서는 해당 문자에 포인트(커서)를 둔 상태에서 C-c C-k를 사용하십시오.
릴리스 이력
2025년 10월
이 책은 최신 안정판 Lean 릴리스(버전 4.23.0)에 맞게 업데이트되었으며, 이제 함수적 귀납법과 grind 택틱을 설명합니다.
2025년 8월
이번 릴리스는 책에서 코드를 복사해 붙여 넣을 때 발생하는 문제를 해결하기 위한 유지 보수 릴리스입니다.
2025년 7월
이 책은 Lean 4.21 버전에 맞춰 업데이트되었습니다.
2025년 6월
이 책은 Verso를 사용하여 새로운 형식으로 재구성되었습니다.
2025년 4월
이 책은 대폭 개정되었으며, 이제 Lean 4.18 버전을 다룹니다.
2024년 1월
이번 릴리스는 예제 프로그램의 회귀 문제를 수정하는 소규모 버그 수정 릴리스입니다.
2023년 10월
이번 첫 번째 유지 보수 릴리스에서는 여러 작은 문제를 수정했으며, 본문을 Lean의 최신 릴리스에 맞게 갱신했습니다.
2023년 5월
이제 이 책이 완성되었습니다! 4월 사전 공개판과 비교해 여러 세부 사항이 개선되었고 사소한 오류들이 수정되었습니다.
2023년 4월
이번 릴리스에서는 택틱으로 증명을 작성하는 방법에 관한 막간 장과 함께, 성능 및 비용 모델에 대한 논의를 종료 증명 및 프로그램 동치 증명과 결합한 마지막 장이 추가되었습니다. 이번 릴리스는 최종 릴리스 이전의 마지막 릴리스입니다.
2023년 3월
이번 릴리스에는 의존 타입과 인덱스 족(indexed family)을 이용한 프로그래밍을 다루는 장이 추가되었습니다.
2023년 1월
이번 릴리스에는 모나드 트랜스포머에 관한 장이 추가되었으며, 이 장에서는 do-표기법에서 사용할 수 있는 명령형 기능을 설명합니다.
2022년 12월
이번 릴리스에서는 애플리커티브 펑터에 관한 장이 추가되었으며, 이 장에서는 구조체와 타입 클래스도 더 자세히 설명합니다. 이와 함께 모나드에 대한 설명도 개선되었습니다. 2022년 12월 릴리스는 겨울 휴가로 인해 2023년 1월로 연기되었습니다.
2022년 11월
이번 릴리스에는 모나드를 활용한 프로그래밍을 다루는 장이 추가되었습니다. 또한 강제 변환 절의 JSON 사용 예제가 전체 코드를 포함하도록 갱신되었습니다.
2022년 10월
이번 릴리스로 타입 클래스 장이 완성되었습니다. 또한 타입 클래스 장 바로 앞에 명제, 증명, 택틱을 소개하는 짧은 막간 장을 추가했습니다. 이 개념들에 조금 익숙해 두면 표준 라이브러리의 일부 타입 클래스를 이해하는 데 도움이 되기 때문입니다.
2022년 9월
이번 릴리스에서는 타입 클래스에 관한 장의 전반부를 추가했습니다. 타입 클래스는 Lean에서 연산자를 오버로딩하는 메커니즘이며, 코드를 조직하고 라이브러리를 구조화하는 중요한 수단입니다. 또한 Lean 스트림 API의 변경 사항을 반영하여 2장을 갱신했습니다.
2022년 8월
이번 세 번째 공개 릴리스에는 두 번째 장이 추가되었습니다. 이 장에서는 프로그램을 컴파일하고 실행하는 방법과 함께 부수 효과에 대한 Lean의 모델을 설명합니다.
2022년 7월
두 번째 공개 릴리스로 첫 번째 장이 완성됩니다.
2022년 6월
이것은 서론과 첫 번째 장의 일부로 구성된 최초의 공개 릴리스였습니다.
저자 소개
David Thrane Christiansen은 20년 동안 함수형 언어를, 10년 동안 의존 타입을 사용해 왔습니다. 그는 Daniel P. Friedman과 함께 의존 타입 이론의 핵심 개념을 소개하는 책인 The Little Typer를 썼습니다. 그는 코펜하겐 IT 대학교에서 박사 학위를 받았습니다. 재학 중에는 Idris 언어의 첫 번째 버전 개발에 주요 기여자로 참여했습니다. 학계를 떠난 뒤에는 오리건주 포틀랜드의 Galois와 덴마크 코펜하겐의 Deon Digital에서 소프트웨어 개발자로 일했으며, Haskell Foundation의 상임 이사(Executive Director)를 역임했습니다. 이 글을 쓰는 시점에 그는 Lean Focused Research Organization에 재직하며 Lean 개발에 전념하고 있습니다.
라이선스

This work is licensed under a Creative Commons Attribution 4.0 International License.
이 책의 원본은 David Thrane Christiansen이 Microsoft Corporation과의 계약에 따라 집필하였으며, Microsoft Corporation은 너그럽게도 이 책을 Creative Commons Attribution 4.0 International License로 공개하였습니다. 현재 버전은 새 버전의 Lean에서 달라진 점을 반영하기 위해 저자가 원본을 수정한 것입니다. 변경 사항에 대한 자세한 설명은 이 책의 소스 코드 저장소에서 확인할 수 있습니다.