1. Введение в экосистему Lean 4: установка, синтаксис и основы функционального программирования
Введение в экосистему Lean 4: установка, синтаксис и основы функционального программирования
Добро пожаловать в курс по Lean 4. Если вы читаете эту статью, значит, вас интересует не просто написание кода, который работает, но и создание кода, правильность которого можно доказать математически. Lean 4 — это уникальный инструмент, который объединяет в себе современный язык функционального программирования и интерактивную систему доказательства теорем.
В этой первой статье мы заложим фундамент: разберемся, что такое Lean, настроим рабочее окружение и напишем наши первые программы.
Что такое Lean 4 и зачем он нужен?
Lean 4 — это проект исследовательского подразделения Microsoft Research (в частности, Леонардо де Моуры). Это язык, который стирает грань между программированием и математикой. В большинстве языков (Python, C++, Java) система типов служит для предотвращения базовых ошибок (например, нельзя сложить строку и число). В Lean система типов настолько мощная, что с её помощью можно выразить любую математическую теорему.
!Lean 4 выступает мостом между миром программного кода и миром строгой математической логики.
В основе Lean лежит исчисление конструкций (Calculus of Constructions) и соответствие Карри — Ховарда. Это принцип, который гласит: написание программы определенного типа равносильно доказательству теоремы, соответствующей этому типу.
Ключевые компоненты экосистемы
Перед установкой важно понимать, из чего состоит инструментарий:
rustup в Rust или nvm в Node.js). Он позволяет легко переключаться между версиями Lean.Установка и настройка окружения
Самый надежный способ начать работу — использовать редактор VS Code. Процесс установки максимально упрощен.
Шаг 1: Установка VS Code
Если у вас еще нет Visual Studio Code, скачайте и установите его с официального сайта Microsoft.Шаг 2: Установка расширения Lean 4
Ctrl+Shift+X.Шаг 3: Инициализация Elan
После установки расширения откройте любой файл с расширением.lean или просто создайте новый текстовый файл, сохраните его как test.lean. Расширение автоматически обнаружит отсутствие Lean в системе и предложит установить elan. Следуйте инструкциям во всплывающем окне.Шаг 4: Создание первого проекта
Lean 4 не предназначен для работы с одиночными файлами в долгосрочной перспективе. Нам нужно создать проект с помощью Lake.Ctrl+ ).. или создайте файл в папке HelloLean. Теперь мы готовы писать код.Основы синтаксиса: Определения и Типы
Lean — это строго типизированный функциональный язык. Это значит, что у каждого выражения есть тип, и этот тип проверяется на этапе компиляции.
Команда #check
Чтобы узнать тип любого выражения, используется команда #check. Она не запускает код, а только анализирует его.Здесь мы видим запись вида . В математической нотации это записывается так:
Где — это терм (значение), символ читается как «имеет тип», а — это сам тип.
Определение переменных и функций
Для создания новых определений используется ключевое слово def.Разберем эту строку:
*
def — ключевое слово для определения.
* myNumber — имя нашего определения.
* : Nat — явное указание типа (Natural numbers — натуральные числа произвольной точности).
* := — оператор присваивания определения.
* 42 — тело определения.Функции
Функции в Lean — это «граждане первого класса». Они определяются так же, как и обычные значения, но имеют аргументы.Здесь
(n : Nat) означает, что функция принимает аргумент n типа Nat. После скобки : Nat указывает на тип возвращаемого значения.Мы можем проверить тип самой функции:
Стрелка в типе обозначает отображение. Математически это выглядит так:
Где — функция, — множество натуральных чисел (тип аргумента), а вторая — множество натуральных чисел (тип результата).
Вычисление выражений
Если
#check проверяет типы, то #eval вычисляет значения. Это аналог print или REPL в других языках.Обратите внимание: вызов функции не требует скобок вокруг аргументов, как в C++ или Python. Мы пишем
addOne 5, а не addOne(5). Скобки используются только для группировки сложных выражений.Анонимные функции (Лямбда-выражения)
Иногда нам не нужно давать функции имя. Для этого используется ключевое слово
fun.Синтаксис
fun x => body создает функцию, которая принимает x и возвращает body. В математике это соответствует лямбда-исчислению:Где — символ лямбда-абстракции, — переменная, а — тело функции.
Каррирование и частичное применение
В Lean все функции принимают ровно один аргумент. Как же тогда написать функцию сложения двух чисел?
Посмотрим на её тип:
Тип
Nat -> Nat -> Nat на самом деле читается как Nat -> (Nat -> Nat). Это означает, что add принимает число x и возвращает новую функцию, которая ждет число y и возвращает результат.Это позволяет использовать частичное применение:
Мы передали только первый аргумент и получили новую функцию
addFive.Сопоставление с образцом (Pattern Matching)
Одной из самых мощных возможностей функциональных языков является сопоставление с образцом. Это похоже на
switch-case в других языках, но гораздо мощнее.Рассмотрим логический тип
Bool, который имеет два значения: true и false.Здесь:
*
match n with — начинаем сопоставление переменной n.
* | 0 => true — если n равно 0, возвращаем true.
* | _ => false — символ _ означает «любое другое значение». Для всех остальных чисел возвращаем false.Рекурсия
В функциональном программировании нет циклов
for или while. Вместо них используется рекурсия. Lean требует, чтобы все функции были тотальными, то есть завершались для любого входа. Для рекурсии это значит, что Lean должен видеть, что аргумент уменьшается с каждым шагом.Напишем функцию вычисления факториала. В математике факториал определяется так:
Где — факториал числа, — базовый случай, а — рекурсивный шаг.
В Lean это выглядит так:
Обратите внимание на паттерн
k + 1. Если n не ноль, Lean понимает, что n можно представить как k + 1 (где k — предыдущее число). Рекурсивный вызов factorial k происходит с меньшим числом, поэтому Lean гарантирует, что программа не зациклится.Структуры
Для объединения данных используются структуры. Это аналог
struct в C или class (без методов) в Python.deriving Repr говорит Lean автоматически сгенерировать код для отображения структуры в #eval.Заключение
Мы сделали первые шаги в экосистеме Lean 4:
Установили инструменты (VS Code, Elan, Lake).
Научились определять значения и функции с помощью def.
Познакомились с типами и командой #check`.
Lean 4 — это язык, где типы играют главную роль. В следующих статьях мы увидим, как эти типы превращаются в логические утверждения, и как написание кода превращается в доказательство теорем.