Dans cet article, nous allons explorer le sujet de Rocq (logiciel) en profondeur, en analysant ses différents aspects et ses implications possibles. Rocq (logiciel) est un sujet débattu depuis longtemps et pertinent dans divers contextes, de la sphère personnelle à la sphère professionnelle. Tout au long de cet article, nous examinerons les différentes perspectives qui existent sur Rocq (logiciel), ainsi que son évolution dans le temps. De même, nous tenterons de faire la lumière sur les éventuelles implications futures de Rocq (logiciel) et son impact sur notre société. Nous espérons que cet article pourra fournir un aperçu large et complet de Rocq (logiciel), aidant les lecteurs à mieux comprendre ce sujet et ses implications.
Développé par | INRIA, Université Paris-Diderot, École polytechnique, Université Paris-Sud, École normale supérieure de Lyon |
---|---|
Première version | |
Dernière version | 9.0.0 ()[1] |
Dépôt | Rocq sur GitHub |
État du projet |
![]() |
Écrit en | OCaml et C |
Système d'exploitation | Multiplateforme (en) |
Langues | Anglais |
Type | Assistant de preuve |
Politique de distribution | Gratuit et open source |
Licence | GNU LGPL 2.1 |
Site web | rocq-prover.org |
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).
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].
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) :
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].
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 :
C'est un logiciel libre distribué selon les termes de la licence GNU LGPL.
Parmi les grands succès de Rocq, on peut citer :
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 :
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.
Require Import Nat.
Fixpoint factorielle n :=
match n with
| 0 => 1
| S p => n * factorielle p
end.
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.
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 | ].
+ (* 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.