Оригинальный автор(ы) | Тьерри Коканд , Жерар Юэ , Кристин Полен-Морен , Брюно Баррас, Жан-Кристоф Филлиатр, Уго Эрбелен, Четан Мюрти, Ив Берто, Пьер Кастеран |
---|---|
Разработчик(и) | INRIA , Политехническая школа , Университет Париж-Юг , Парижский университет Дидро , CNRS , ENS Lyon |
Первоначальный выпуск | 1 мая 1989 г ( 1989-05-01 ) | (версия 4.10)
Стабильный релиз | 8.20.0 [1] / 3 сентября 2024 г. ( 3 сентября 2024 г. ) |
Репозиторий | github.com/coq/coq |
Написано в | OCaml |
Операционная система | Кроссплатформенный |
Доступно в | Английский |
Тип | Помощник по проверке |
Лицензия | LGPLv2.1 |
Веб-сайт | coq.inria.fr |
Coq — интерактивный доказатель теорем, впервые выпущенный в 1989 году. Он позволяет выражать математические утверждения, механически проверять доказательства этих утверждений, помогает находить формальные доказательства и извлекать сертифицированную программу из конструктивного доказательства ее формальной спецификации . Coq работает в рамках теории исчисления индуктивных конструкций , производной от исчисления конструкций . Coq не является автоматизированным доказательством теорем , но включает в себя тактики ( процедуры ) автоматического доказательства теорем и различные процедуры принятия решений .
Ассоциация вычислительной техники наградила Тьерри Коканда , Жерара Юэ , Кристин Полен-Моринг , Бруно Барраса, Жана-Кристофа Филлиатра, Уго Эрбелена, Шетана Мурти, Ива Берто и Пьера Кастерана премией ACM Software System Award 2013 за Coq.
Название Coq представляет собой игру слов на основе имени Тьерри Коканда, исчисления конструкций или CoC , и следует французской традиции в области компьютерных наук называть программное обеспечение в честь животных ( coq по-французски означает «петух»). [2] 11 октября 2023 года команда разработчиков объявила, что в ближайшие месяцы Coq будет переименован в The Rocq Prover , и начала обновлять кодовую базу, веб-сайт и связанные с ними инструменты. [3]
Если рассматривать Coq как язык программирования , он реализует зависимо типизированную функциональную модель программирования ; [4] если рассматривать его как логическую систему, он реализует теорию типов более высокого порядка . Разработка Coq поддерживалась с 1984 года Французским институтом исследований в области компьютерных наук и автоматизации (INRIA), в настоящее время в сотрудничестве с École Polytechnique , Университетом Париж-Юг , Университетом Париж Дидро и Французским национальным центром научных исследований (CNRS). В 1990-х годах École normale supérieure de Lyon (ENS Lyon) также была частью проекта. Разработка Coq была инициирована Жераром Юэ и Тьерри Коканом, и более 40 человек, в основном исследователей, внесли свой вклад в основную систему с момента ее создания. Группу внедрения последовательно координировали Жерар Юэ, Кристин Полен-Моринг, Хьюго Эрбелен и Матье Созо. Coq в основном реализован на OCaml с небольшим добавлением C. Базовая система может быть расширена с помощью механизма подключаемых модулей . [5]
Название coq означает « петух » на французском языке и происходит от французской традиции называть инструменты для разработки исследований в честь животных. [6] До 1991 года Coquand реализовывал язык, называемый исчислением конструкций , и тогда он назывался просто CoC . В 1991 году была начата новая реализация, основанная на расширенном исчислении индуктивных конструкций , и название было изменено с CoC на Coq в косвенной ссылке на Coquand, который разработал исчисление конструкций вместе с Жераром Юэ и внес вклад в исчисление индуктивных конструкций вместе с Кристиной Полин-Мёринг. [7]
Coq предоставляет язык спецификаций, называемый Gallina [8] (« hen » на латыни, испанском, итальянском и каталонском). Программы, написанные на Gallina, обладают свойством слабой нормализации , подразумевающим, что они всегда завершаются. Это отличительное свойство языка, поскольку бесконечные циклы (незавершающиеся программы) распространены в других языках программирования [9] и являются одним из способов избежать проблемы остановки .
В качестве примера рассмотрим доказательство леммы о том, что взятие следующего элемента натурального числа меняет его четность. Тактика сворачивания-разворачивания, введенная Дэнви [10], используется для упрощения доказательства.
Ltac fold_unfold_tactic имя := вступления ; имя разворачивания ; имя сворачивания ; рефлексивность . Требуется импорт Arith Nat Bool .Fixpoint is_even ( n : nat ) : bool := match n with | 0 => true | S n' => eqb ( is_even n' ) false end .Лемма fold_unfold_is_even_0 : is_even 0 = true .Доказательство . Тактика_сложения_раскрытия является_четной . Вопрос .Лемма fold_unfold_is_even_S : forall n' : nat , is_even ( S n' ) = eqb ( is_even n' ) false .Доказательство . Тактика_сложения_раскрытия является_четной . Вопрос .Лемма successor_flips_evenness : forall n : nat , is_even n = negb ( is_even ( S n )).Доказательство . Введение . Переписать -> ( fold_unfold_is_even_S n ). Разрушить ( is_even n ) . * простая рефлексивность . * просто рефлексивность . Вопрос .
Жорж Гонтье из Microsoft Research в Кембридже , Англия , и Бенджамин Вернер из INRIA использовали Coq для создания обзорного доказательства теоремы о четырех цветах , которое было завершено в 2002 году. [11] Их работа привела к разработке пакета SSReflect («Small Scale Reflection»), который стал значительным расширением Coq. [12] Несмотря на свое название, большинство функций, добавленных в Coq с помощью SSReflect, являются функциями общего назначения и не ограничиваются вычислительно- рефлексивным стилем программирования доказательства. Эти функции включают в себя:
set
тактика с более мощным подборомSSReflect 1.11 распространяется бесплатно, имеет двойную лицензию с открытым исходным кодом CeCILL-B или CeCILL-2.0 и совместим с Coq 8.11. [13]
В дополнение к явному построению терминов Gallina, Coq поддерживает использование тактик, написанных на встроенном языке Ltac или OCaml. Эти тактики автоматизируют построение доказательств, выполняя тривиальные или очевидные шаги в доказательствах. [18] Несколько тактик реализуют процедуры принятия решений для различных теорий. Например, тактика «кольцо» решает теорию равенства по модулю аксиом кольца или полукольца с помощью ассоциативно - коммутативной перезаписи. [19] Например, следующее доказательство устанавливает сложное равенство в кольце целых чисел всего за одну строку доказательства: [20]
Требуется импорт ZArith . Открыть область действия Z_scope . Цель для всех a b c : Z , ( a + b + c ) ^ 2 = a * a + b ^ 2 + c * c + 2 * a * b + 2 * a * c + 2 * b * c . вступления ; кольцо . Вопрос .
Встроенные процедуры принятия решений также доступны для пустой теории («конгруэнтность»), пропозициональной логики («тауто»), линейной целочисленной арифметики без кванторов («lia») и линейной рациональной/вещественной арифметики («lra»). [21] [22] Дальнейшие процедуры принятия решений были разработаны в виде библиотек, включая одну для алгебр Клини [23] и другую для определенных геометрических целей. [24]