Введение

Twelf — это реализация логической структуры LF, разработанная Фрэнком Пфеннингом и Карстеном Шюрманном в Университете Карнеги — Меллона. Она используется для логического программирования и формализации теории языков программирования.

Введение

В самом простом виде программа Twelf (называемая "подписью") представляет собой коллекцию деклараций семейств типов (отношений) и констант, которые принадлежат этим семействам типов. Например, ниже приведено стандартное определение натуральных чисел, где `z` обозначает ноль, а `s` – оператор следования. `nat : type. z : nat. s : nat > nat`. Здесь `nat` – это тип, а `z` и `s` – константные термы. Поскольку Twelf – зависимо типизированная система, типы могут быть индексированы термами, что позволяет определять более интересные семейства типов. Вот определение сложения:

`plus : nat > nat > nat > type. plus zero : {M:nat} plus M z M.`

`plus succ : {M:nat} {N:nat} {P:nat} plus M (s N) (s P) < plus M N P.`

Семейство типов `plus` рассматривается как отношение между тремя натуральными числами `M`, `N` и `P`, такое что `M + N = P`. Затем мы задаем константы, определяющие это отношение: константа `plus zero` указывает, что `M + 0 = M`. Квантор `{M:nat}` можно прочитать как "для всех `M` типа `nat`". Константа `plus succ` определяет случай, когда второй аргумент является следующим за некоторым числом `N` (см. сопоставление с образцом). Результатом является следующий за `P`, где `P` – сумма `M` и `N`. Этот рекурсивный вызов осуществляется через подцель, вводимую с помощью `<`. Стрелка `>` может быть понята оперативно как `:-` в Prolog, или как логическое следование ("если `M + N = P`, то `M + (s N) = (s P)`"), или, наиболее точно с точки зрения теории типов, как тип константы `plus` ("при задании терма типа `nat > nat > nat`, возвращает терм типа `type`"). Twelf поддерживает реконструкцию типов и неявные параметры, поэтому на практике обычно не нужно явно указывать `{M:nat}` (и т.д.) над определением. Эти простые примеры не демонстрируют возможности LF высшего порядка и не показывают его возможности проверки теорем. Обратитесь к дистрибутиву Twelf для ознакомления с включенными примерами.

Применение

Двенадцать используется несколькими различными способами.

Логическое программирование

Двенадцать подписей могут быть выполнены посредством процедуры поиска. Его ядро сложнее, чем у Prolog, поскольку оно является языком высшего порядка с зависимой типизацией, но ограничено чистыми операторами: в нем отсутствует оператор "cut" и другие экстралогические операторы (например, для выполнения операций ввода-вывода), которые часто встречаются в реализациях Prolog, что может снизить его пригодность для практических задач логического программирования. Некоторые применения правила "cut" в Prolog можно реализовать, объявив определенные операторы принадлежащими к детерминированным семействам типов, что позволяет избежать повторных вычислений. Кроме того, как и в λProlog, Twelf обобщает предложения Хорна до наследственных формул Харропа, что обеспечивает логически обоснованные операционные концепции генерации новых имен и расширения базы данных предложений с учетом области видимости.

Формализация математики

Сегодня Twelf используется главным образом как система для формализации математики, особенно метатеории языков программирования. В связи с этим, он тесно связан с Coq и Isabelle/HOL/HOL Light. Однако, в отличие от этих систем, доказательства в Twelf обычно разрабатываются вручную. Несмотря на это, для тех областей задач, в которых Twelf особенно силен, доказательства часто получаются короче и проще в разработке, чем в автоматизированных системах общего назначения. Встроенное в Twelf понятие связывания и подстановки облегчает кодирование языков программирования и логик, большинство из которых используют связывание и подстановку, которые часто можно непосредственно закодировать с помощью синтаксиса высшего порядка (HOAS), где связующие мета-языка представляют связующие объектного уровня. Таким образом, стандартные теоремы, такие как сохраняющая тип подстановка и альфа-преобразование, предоставляются "из коробки". Twelf использовался для формализации многих различных логик и языков программирования (примеры включены в дистрибутив). Среди крупных проектов — доказательство безопасности для Standard ML, фундаментальная типизированная система ассемблера от CMU и фундаментальная система доказательства корректности кода от Принстона.

Реализация

Twelf написан на Standard ML, и бинарные файлы доступны для Linux и Windows. Он активно разрабатывается, преимущественно в Университете Карнеги — Меллона.