Rocq (anciennement appelé Coq) est un assistant de preuve utilisant le langage Gallina, développé par l'équipe PI.R2[2] de l’Inria au sein du laboratoire PPS du CNRS et en partenariat avec l'École polytechnique, le CNAM, l'université Paris-Diderot et l'université Paris-Sud (et antérieurement l'École normale supérieure de Lyon).

Rocq
Description de l'image Rocq logo.svg.
Description de cette image, également commentée ci-après
CoqIde : l'environnement de développement de Rocq.
Informations
Développé par INRIA, Université Paris-Diderot, École polytechnique, Université Paris-Sud, École normale supérieure de Lyon
Première version 1984Voir et modifier les données sur Wikidata
Dernière version 9.2.0 (27 mars 2026)[1]Voir et modifier les données sur Wikidata
Dépôt Rocq sur GitHub
État du projet  En développement actif
Écrit en OCaml et CVoir et modifier les données sur Wikidata
Système d'exploitation Multiplateforme (d)Voir et modifier les données sur Wikidata
Langues Anglais
Type Assistant de preuve
Politique de distribution Gratuit et open source
Licence GNU LGPL 2.1
Site web rocq-prover.orgVoir et modifier les données sur Wikidata

En 2013, Rocq a été récompensé du Programming Languages Software Award par l'ACM SIGPLAN[3]. Rocq a reçu en 2022 le premier prix science ouverte du logiciel libre de la recherche dans la catégorie « scientifique et technique »[4].

Historique du projet

modifier
 
Ancien logo

Au début des années 1980, Gérard Huet lance un projet de fabrication d’un démonstrateur interactif de théorème. Il s'agit d'un assistant de preuve. Thierry Coquand et Gérard Huet conçoivent la logique de Rocq (appelé Coq à l'époque) et le calcul des constructions. Christine Paulin-Mohring étend cette logique avec une nouvelle construction, les types inductifs et un mécanisme d’extraction qui permet d’obtenir automatiquement un programme zéro défaut à partir d’une preuve[5].

L'ancien nom Coq fait à la fois référence au calcul des constructions (CoC abrégé en anglais) développé par Thierry Coquand, au nom de famille Coquand lui-même et au fait qu'il est français (coq gaulois) :

« The name Coq comes from the French word for rooster, CoC (the Calculus of Constructions) and Thierry Coquand, one of the initial authors of Coq. But it is also close to the word "cock" which has a slang meaning that some English speakers consider offensive (it also means a male bird or the firing lever in a gun). This similarity has already led to some women turning away from Coq and others getting harassed when they said they were working on Coq. It also makes some English conversations about Coq with lay persons simply more difficult[6]. » (« Mais il est également proche du mot « cock », dont le sens argotique est jugé offensant par certains anglophones (il désigne aussi un oiseau mâle ou le levier de tir d'un fusil). Cette similitude a déjà conduit certaines femmes à se détourner de Coq, et d'autres à être harcelées lorsqu'elles disaient travailler sur Coq. Cela rend également plus difficiles certaines conversations en anglais sur Coq avec des profanes. »)

Un certain nombre de nouveaux noms ont donc été proposés. Rocq a été retenu, notamment car c'est un diminutif de Rocquencourt qui accueillait un site de l'INRIA où Thierry Coquand a commencé à développer Rocq et qu'il reste proche du nom Coq[6].

Caractéristiques du logiciel

modifier

Rocq est fondé sur le calcul des constructions, une théorie des types d'ordre supérieur, et son langage de spécification est une forme de lambda-calcul typé. Le calcul des constructions utilisé dans Rocq comprend directement les constructions inductives, d'où son nom de calcul des constructions inductives (CIC).

Rocq a été récemment doté de fonctionnalités d'automatisation croissantes. Citons notamment la tactique lia qui décide l'arithmétique de Presburger[7], les tactiques field et ring pour manipuler des expressions polynomiales et rationnelles.

Plus particulièrement, Rocq permet :

  • de manipuler des assertions du calcul ;
  • de vérifier mécaniquement des preuves de ces assertions ;
  • d'aider à la recherche de preuves formelles ;
  • de synthétiser des programmes certifiés à partir de preuves constructives de leurs spécifications.

C'est un logiciel libre distribué selon les termes de la licence GNU LGPL.

Parmi les grands succès de Rocq, on peut citer :

Éléments du langage

modifier

Rocq utilise la correspondance de Curry-Howard. La preuve d'une proposition est vue comme un programme dont le type est cette proposition. Pour définir un programme ou une preuve, il faut :

  • soit l'écrire dans le langage Gallina, proche du langage de programmation fonctionnelle OCaml ;
  • soit déclarer son type (ou la proposition que l'on veut démontrer). Le langage Ltac permet alors de définir cette preuve/programme par chaînage arrière, de façon interactive. Cette méthode est privilégiée pour les preuves mathématiques car Rocq est alors capable de deviner certaines étapes intermédiaires. Des procédures entièrement automatiques existent pour certains fragments de logique ou d'arithmétique.

Diverses fonctionnalités permettent par ailleurs de définir un programme en Gallina en y laissant des trous correspondant à des preuves à fournir, et ensuite compléter ces trous à l'aide de l'assistant de preuve interactif.

Il est aussi possible d'utiliser SSReflect à la place de Ltac. Autrefois développé séparément, il est maintenant inclus par défaut dans Rocq.

Exemples de programmes

modifier
Require Import Nat.

Fixpoint factorielle n :=
  match n with
  | 0 => 1
  | S p => n * factorielle p
  end.
  • La fonction factorielle (avec Ltac) :
Require Import Nat.

Definition factorielle (n : nat) : nat.
  (* On fait une définition par récurrence *)
  induction n.
  - (* Si l'argument est 0, on retourne 1 *)
    exact 1.
  - (* Si l'argument de la forme (S n), on retourne un produit *)
    apply Nat.mul.
    + (* 1er facteur du produit : le successeur de n *)
      exact (S n).
    + (* 2nd facteur du produit : valeur de factorielle en n *)
      exact IHn.
  (* On indique que la définition est terminée et que l'on souhaite pouvoir calculer cette fonction. *)
Defined.

Exemple de démonstration (avec Ltac)

modifier
Require Import Lia.

Lemma odd_or_ind : forall (n : nat),
    (exists (p : nat), n = 2 * p) \/ (exists (p : nat), n = 1 + 2 * p).
Proof.
  intro n.
  induction n.
  - (* Cas 0 *) left. now exists 0.
  - (* Cas (n + 1) *)
    destruct IHn as [[p Hpair] | [p Himpair]].
    + (* n est pair *)
      right. exists p. auto.
    + (* n est impair *)
      left. exists (S p). lia.
  (* On indique que la preuve est terminée et qu'elle ne sera pas utilisée comme un programme. *)
Qed.

Notes et références

modifier
  1. « Rocq 9.2.0 », 27 mars 2026
  2. « Bienvenue », sur univ-paris-diderot.fr (consulté le 19 juillet 2024).
  3. « Programming Languages Software Award » (consulté le 6 février 2022)
  4. « Remise des prix science ouverte du logiciel libre de la recherche », 5 février 2022 (consulté le 6 février 2022)
  5. binaire, « Christine Paulin et les Logiciels Zéro Défaut », sur binaire, 24 septembre 2015 (consulté le 18 mars 2020)
  6. a et b (en) « Alternative names » (consulté le 13 mars 2025)
  7. L'arithmétique de Presburger, contrairement à l'arithmétique usuelle due à Peano, est une théorie complète, c'est-à-dire que pour tout énoncé de son langage on peut décider si c'est un théorème de la théorie ou non (sa négation étant alors théorème). Cette arithmétique de Presburger, qui n'a pas d'axiome pour la multiplication, échappe donc à l'incomplétude énoncée par le théorème d'incomplétude.
  8. (en) « Feit-Thompson theorem has been totally checked in Coq », Msr-inria.inria.fr, 20 septembre 2012 (consulté le 25 septembre 2012).
  9. Patrick Massot, « Pourquoi raconter des maths à un ordinateur », La Recherche (magazine),‎ octobre-décembre 2022 (lire en ligne)
  10. « Le défi du « castor », une conjecture mathématique vieille de plus de 30 ans, résolu par une équipe constituée en partie d’« amateurs » », Le Monde.fr,‎ 17 juillet 2024 (lire en ligne, consulté le 17 juillet 2024)

Voir aussi

modifier

Liens externes

modifier

📚 Artikel Terkait di Wikipedia

Alan Turing

standard programming languages express precisely the class of partial recursive functions is often summarized by the statement that all programming languages

Ada (langage)

Ada Programming Language (en) Site d'information sur Ada 2012 John Barnes (en) (trad. Hugues Fauconnier), Programmer en ADA 95 [« Programming in Ada

Test driven development

Quora  : « The original description of TDD was in an ancient book about programming. It said you take the input tape, manually type in the output tape you

Compréhension du langage naturel

http://aima.cs.berkeley.edu/, p. 19 Computer Science Logo Style: Beyond programming by Brian Harvey 1997 (ISBN 0-262-58150-7) page 278 Weizenbaum, Joseph

Go (langage)

(FAQ) - The Go Programming Language », sur golang.org (consulté le 15 juillet 2019) « Frequently Asked Questions (FAQ) - The Go Programming Language », sur

Combinatoire

l'anecdote suivante : Plutarque rapporte, dans les Propos de table, une assertion de Chrysippe « contredite par tous les mathématiciens, et entre autres

Pi

en ligne), p. 123 (en) Michael Trott, The Mathematica GuideBook for Programming, Springer, 2004, 1028 p. (ISBN 978-0-387-94282-7, lire en ligne), p. 173

Absys

of logic programming » (PDF). Communications de l'ACM 31: 38 DOI 10.1145/35043.35046 "ABSYS: Un compilateur incrémental pour les assertions".., JM Foster