Coq
| The Rocq Prover | |
|---|---|
Uma sessão de prova interativa no CoqIDE, mostrando o script de prova à esquerda e o estado da prova à direita. | |
| Autores | Thierry Coquand, Gérard Huet, Christine Paulin-Mohring, Bruno Barras, Jean-Christophe Filliâtre, Hugo Herbelin, Chetan Murthy, Yves Bertot, Pierre Castéran |
| Desenvolvedores | INRIA, École Polytechnique, University of Paris-Sud, Paris Diderot University, CNRS, ENS Lyon |
| Lançamento inicial | 1 maio 1989 (versão 4.10) |
| Lançamento estável | 9.2.0[1] |
| Repositório | github |
| Escrito em | OCaml |
| Sistema operacional | Multiplataforma |
| Tipo | Assistente de prova |
| Licença | LGPLv2.1 |
| Website | rocq-prover |
O Rocq Prover (anteriormente chamado de Coq) é um provador de teoremas interativo lançado pela primeira vez em 1989. Ele permite a expressão de afirmações matemáticas, a verificação mecânica de provas dessas afirmações, auxilia na localização de provas formais usando rotinas de automação de prova e na extração de um programa certificado a partir da prova construtiva de sua especificação formal.
Rocq trabalha dentro da teoria do cálculo das construções indutivas, uma derivada do cálculo das construções. Rocq não é um provador automatizado de teoremas, mas inclui táticas de automação de prova (procedimentos) e vários procedimentos de decisão.
A Association for Computing Machinery concedeu a Thierry Coquand, Gérard Huet, Christine Paulin-Mohring, Bruno Barras, Jean-Christophe Filliâtre, Hugo Herbelin, Chetan Murthy, Yves Bertot e Pierre Castéran o ACM Software System Award de 2013 pelo Rocq (quando ainda era chamado de Coq).
Visão geral
Quando visto como uma linguagem de programação, o Rocq implementa um modelo de programação funcional tipada dependentemente;[2] quando visto como um sistema lógico, ele implementa uma teoria de tipos de ordem superior. O desenvolvimento do Rocq tem sido apoiado desde 1984 pelo French Institute for Research in Computer Science and Automation (INRIA), em colaboração com muitas outras instituições de pesquisa francesas e internacionais. O desenvolvimento do Rocq foi iniciado por Gérard Huet e Thierry Coquand, e mais de 200 pessoas,[3] principalmente pesquisadores, contribuíram com funcionalidades para o sistema central desde seu início. A equipe de implementação foi sucessivamente coordenada por Gérard Huet, Christine Paulin-Mohring, Hugo Herbelin e Matthieu Sozeau. Rocq é implementado principalmente em OCaml com um pouco de C. O sistema central pode ser estendido por meio de um mecanismo de plug-in.[4]
Rocq fornece uma linguagem de especificação chamada Gallina.[5] Programas escritos em Gallina têm a propriedade de normalização fraca, implicando que eles sempre terminam. Esta é uma propriedade distintiva da linguagem, já que loops infinitos (programas que não terminam) são comuns em outras linguagens de programação.[6]
Como exemplo de uma prova escrita em Rocq, considere uma prova de um lema que afirma que tomar o sucessor de um número natural inverte sua paridade. A tática fold-unfold introduzida por Danvy[7] é usada para ajudar a manter a prova simples.
From Stdlib Require Import Arith Nat Bool.
Fixpoint is_even (n : nat) : bool :=
match n with
| 0 => true
| S n' => negb (is_even n')
end.
Lemma is_even_0 :
is_even 0 = true.
Proof. reflexivity. Qed.
Lemma is_even_S n :
is_even (S n) = negb (is_even n).
Proof. reflexivity. Qed.
Lemma successor_flips_evenness n :
is_even n = negb (is_even (S n)).
Proof.
rewrite is_even_S.
destruct (is_even n).
* simpl. reflexivity.
* simpl. reflexivity.
Qed.
Esta prova primeiro importa a definição de booleanos e números naturais da biblioteca padrão e então define uma função `is_even` que retorna se um número é par. Em seguida, três lemas são provados sobre esta função. O primeiro apenas reafirma as equações definidoras de `is_even` e, como o Rocq conhece as equações, sua prova é muito curta. O último lema é provado com uma distinção de caso após primeiro aplicar o segundo lema; o asterisco `*` demarca que um novo subcaso começa ali.
Usos notáveis
Teorema das quatro cores e extensão SSReflect
Georges Gonthier da Microsoft Research em Cambridge, Inglaterra e Benjamin Werner do INRIA usaram o Rocq para criar uma prova verificável do teorema das quatro cores, que foi concluída em 2002.[8] Seu trabalho levou ao desenvolvimento do pacote SSReflect ("Small Scale Reflection"), que foi uma extensão significativa para o Rocq.[9] Apesar do nome, a maioria das funcionalidades adicionadas ao Rocq pelo SSReflect são de propósito geral e não se limitam ao estilo de prova computacional reflexiva. Estas funcionalidades incluem:
- Adição de notações convenientes para pattern matching irrefutável e refutável, em tipos indutivos com um ou dois construtores
- Argumentos implícitos para funções aplicadas a zero argumentos, o que é útil ao programar com funções de ordem superior
- Argumentos anônimos concisos
- Uma tática `set` melhorada com casamento mais poderoso
- Suporte para reflexão
SSReflect é distribuído como parte da distribuição principal do Rocq desde o Coq 8.7.[10]
Outras aplicações
- CompCert: um compilador otimizador para quase toda a linguagem de programação C que é amplamente programado e provado correto em Rocq.
- Estrutura de dados de conjuntos disjuntos: prova de correção em Rocq foi publicada em 2007.[11]
- Teorema de Feit–Thompson: prova formal usando Rocq foi concluída em setembro de 2012.[12]
- Busy beaver: O valor do vencedor busy beaver de 5 estados foi descoberto por Heiner Marxen e Jürgen Buntrock em 1989, mas só foi provado ser o quinto busy beaver vencedor — estilizado como BB(5) — em 2024 usando uma prova em Rocq.[13][14]
Linguagem de táticas
Além de construir termos Gallina explicitamente, Rocq suporta o uso de táticas escritas na linguagem embutida Ltac ou em OCaml. Essas táticas automatizam a construção de provas, realizando etapas triviais ou óbvias nas provas.[15] Várias táticas implementam procedimentos de decisão para várias teorias. Por exemplo, a tática "ring" decide a teoria da igualdade módulo anel ou semianel axiomas via reescrita associativa-comutativa.[16] Por exemplo, a seguinte prova estabelece uma igualdade complexa no anel dos inteiros em apenas uma linha de prova:[17]
Require Import ZArith.
Open Scope Z_scope.
Goal forall a b c:Z,
(a + b + c) ^ 2 =
a * a + b ^ 2 + c * c + 2 * a * b + 2 * a * c + 2 * b * c.
intros; ring.
Qed.
Procedimentos de decisão embutidos também estão disponíveis para a teoria vazia ("congruence"), lógica proposicional ("tauto"), aritmética linear de inteiros sem quantificadores ("lia") e aritmética linear racional/real ("lra").[18][19] Outros procedimentos de decisão foram desenvolvidos como bibliotecas, incluindo um para álgebra de Kleene[20] e outro para certos objetivos geométricos.[21]
Nome

O antigo nome Coq significa 'galo' em francês e é um jogo de palavras com o nome de Thierry Coquand, cálculo das construções ou CoC, e deriva de uma tradição francesa de nomear ferramentas de pesquisa e desenvolvimento com nomes de animais.[22] Até 1991, Coquand estava implementando uma linguagem chamada cálculo das construções e era simplesmente chamada de CoC então. Em 1991, uma nova implementação baseada no cálculo estendido das construções indutivas foi iniciada e o nome mudou de CoC para Coq em referência indireta a Coquand, que desenvolveu o cálculo das construções juntamente com Gérard Huet e contribuiu para o cálculo das construções indutivas com Christine Paulin-Mohring.[23] Em 11 de outubro de 2023, a equipe de desenvolvimento anunciou que o Coq seria renomeado para The Rocq Prover nos meses seguintes, e começou a atualizar a base de código, o site e as ferramentas relacionadas.[24] A renomeação oficial ocorreu com o lançamento do Rocq 9.0 em março de 2025.[25] O novo nome refere-se ao Inria Rocquencourt, onde o sistema foi desenvolvido pela primeira vez, e está relacionado à ave mítica Roc, o que permite manter as referências a aves do nome anterior.[26]
Prêmios
- 2022 Open Science Award for Open Source Research Software na categoria "Científica e Técnica" [27]
Ver também
- Cálculo das construções
- Correspondência de Curry-Howard
- Teoria de tipos intuicionista
- Lista de assistentes de prova
Referências
- ↑ «Rocq 9.2.0». 27 março 2026
- ↑ A Tour of Rocq
- ↑ A Brief History
- ↑ Avigad, Jeremy; Mahboubi, Assia (3 de Julho de 2018). Interactive Theorem Proving: 9th International Conference, ITP 2018, Held as ... [S.l.]: Springer. ISBN 9783319948218. Consultado em 21 de Outubro de 2018
- ↑ Chlipala, Adam (7 de junho de 2022). «Library Universes». Certified Programming with Dependent Types: A Pragmatic Introduction to the Coq Proof Assistant. [S.l.]: MIT Press. ISBN 978-0262026659
- ↑ Adam Chlipala. "Certified Programming with Dependent Types": "Library GeneralRec". "Library InductiveTypes".
- ↑ Danvy, Olivier (2022). «Fold–unfold lemmas for reasoning about recursive programs using the Coq proof assistant». Journal of Functional Programming (em inglês). 32. ISSN 0956-7968. doi:10.1017/S0956796822000107
- ↑ Gonthier, Georges (2008). «Formal Proof—The Four-Color Theorem» (PDF). Notices of the American Mathematical Society. 55 (11): 1382–1393. MR 2463991
- ↑ Gonthier, Georges; Mahboubi, Assia (2010). «An introduction to small scale reflection in Coq». Journal of Formalized Reasoning. 3 (2): 95–152. doi:10.6092/ISSN.1972-5787/1979
- ↑ «Version 8.7 Summary of changes». rocq-prover.org
- ↑ Conchon, Sylvain; Filliâtre, Jean-Christophe (2007). «A persistent union-find data structure». In: Russo, Claudio V.; Dreyer, Derek. Proceedings of the ACM Workshop on ML, 2007, Freiburg, Germany, October 5, 2007. Association for Computing Machinery. pp. 37–46. ISBN 978-1-59593-676-9. doi:10.1145/1292535.1292541
- ↑ «Feit-Thompson theorem has been totally checked in Coq». Msr-inria.inria.fr. 20 de setembro de 2012. Consultado em 25 de setembro de 2012. Cópia arquivada em 19 de novembro de 2016
- ↑ «[July 2nd 2024] We have proved "BB(5) = 47,176,870"». The Busy Beaver Challenge (em inglês). 2 de julho de 2024. Consultado em 2 de julho de 2024
- ↑ «The Busy Beaver Challenge». bbchallenge.org (em inglês). Consultado em 2 de julho de 2024
- ↑ Kaiser, Jan-Oliver; Ziliani, Beta; Krebbers, Robbert; Régis-Gianas, Yann; Dreyer, Derek (30 de julho de 2018). «Mtac2: typed tactics for backward reasoning in Coq». Proceedings of the ACM on Programming Languages. 2 (ICFP): 78:1–78:31. doi:10.1145/3236773
. hdl:21.11116/0000-0003-2E8E-B
- ↑ Grégoire, Benjamin; Mahboubi, Assia (2005). «Proving Equalities in a Commutative Ring Done Right in Coq». In: Hurd, Joe; Melham, Tom. Theorem Proving in Higher Order Logics: 18th International Conference, TPHOLs 2005, Oxford, UK, August 22–25, 2005, Proceedings. Col: Lecture Notes in Computer Science (em inglês). Berlin, Heidelberg: Springer. pp. 98–113. ISBN 978-3-540-31820-0. doi:10.1007/11541868_7
- ↑ «The ring and field tactic families — Rocq Prover 9.0.0 documentation». rocq-prover.org. Consultado em 7 de maio de 2025
- ↑ Besson, Frédéric (2007). «Fast Reflexive Arithmetic Tactics the Linear Case and Beyond». In: Altenkirch, Thorsten; McBride, Conor. Types for Proofs and Programs: International Workshop, TYPES 2006, Nottingham, UK, April 18–21, 2006, Revised Selected Papers. Col: Lecture Notes in Computer Science (em inglês). 4502. Berlin, Heidelberg: Springer. pp. 48–62. ISBN 978-3-540-74464-1. doi:10.1007/978-3-540-74464-1_4
- ↑ «Micromega: solvers for arithmetic goals over ordered rings — Rocq Prover 9.0.0 documentation». rocq-prover.org. Consultado em 7 de maio de 2025
- ↑ Braibant, Thomas; Pous, Damien (2010). Kaufmann, Matt; Paulson, Lawrence C., eds. An Efficient Coq Tactic for Deciding Kleene Algebras. Interactive Theorem Proving: First International Conference, ITP 2010 Edinburgh, UK, July 11-14, 2010, Proceedings. Lecture Notes in Computer Science (em inglês). Berlin, Heidelberg: Springer. pp. 163–178. ISBN 978-3-642-14052-5. doi:10.1007/978-3-642-14052-5_13
- ↑ Narboux, Julien (2004). «A Decision Procedure for Geometry in Coq». In: Slind, Konrad; Bunker, Annette; Gopalakrishnan, Ganesh. Theorem Proving in Higher Order Logics: 17th International Conference, TPHOLS 2004, Park City, Utah, USA, September 14–17, 2004, Proceedings. Col: Lecture Notes in Computer Science (em inglês). 3223. Berlin, Heidelberg: Springer. pp. 225–240. ISBN 978-3-540-30142-4. doi:10.1007/978-3-540-30142-4_17
- ↑ «Frequently Asked Questions». GitHub. Consultado em 8 de maio de 2019
- ↑ «Introduction to the Calculus of Inductive Constructions». Consultado em 21 de Maio de 2019
- ↑ «Coq roadmap 069». GitHub
- ↑ «Version 9.0 Summary of changes». rocq-prover.org
- ↑ «An Overview of the Name's Evolution». rocq-prover.org
- ↑ «Open Science Awards for Open Source Research Software». Ouvrir la Science (em inglês). 7 de fevereiro de 2022. Consultado em 4 de dezembro de 2025
Ligações externas
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.
