MetaRocq

MetaRocq

Build status MetaRocq Chat Open in Visual Studio Code

MetaRocq is a project formalizing Rocq in Rocq and providing tools for manipulating Rocq terms and developing certified plugins (i.e. translations, compilers or tactics) in Rocq.

Quick jump

Getting started

Installation instructions

See INSTALL.md

Documentation

See DOC.md

Overview of the project

At the center of this project is the Template-Rocq quoting library for Rocq. The project currently has a single repository extending Template-Rocq with additional features. Each extension is in a dedicated folder. The dependency graph might be useful to navigate the project. Statistics: ~300kLoC of Rocq, ~30kLoC of OCaml.

Template-Rocq

Template-Rocq is a quoting library for Rocq. It takes Rocq terms and constructs a representation of their syntax tree as an inductive data type. The representation is based on the kernel’s term representation.

After importing MetaRocq.Template.Loader there are commands MetaRocq Test Quote t., MetaRocq Quote Definition name := (t). and MetaRocq Quote Recursively Definition name := (t). as well as a tactic quote_term t k, where in all cases t is a term and k a continuation tactic.

In addition to this representation of terms, Template Rocq includes:

PCUIC

PCUIC, the Polymorphic Cumulative Calculus of Inductive Constructions is a cleaned up version of the term language of Rocq and its associated type system, shown equivalent to the one of Rocq. This version of the calculus has proofs of standard metatheoretical results:

See the PCUIC README for a detailed view of the development.

Safe Checker

Implementation of a fuel-free and verified reduction machine, conversion checker and type checker for PCUIC. This relies on a postulate of strong normalization of the reduction relation of PCUIC on well-typed terms. The checker is shown to be correct and complete w.r.t. the PCUIC specification. The extracted safe checker is available in Rocq through a new vernacular command:

MetaRocq SafeCheck <term>

After importing MetaRocq.SafeChecker.Loader.

To roughly compare the time used to check a definition with Rocq’s vanilla type-checker, one can use:

MetaRocq RocqCheck <term>

This also includes a verified, efficient re-typing procedure (useful in tactics) in MetaRocq.SafeChecker.PCUICSafeRetyping.

See the SafeChecker README for a detailed view of the development.

Erasure

An erasure procedure to untyped lambda-calculus accomplishing the same as the type and proof erasure phase of the Extraction plugin of Rocq. The extracted safe erasure is available in Rocq through a new vernacular command:

MetaRocq Erase <term>

After importing MetaRocq.Erasure.Loader.

The erasure pipeline includes verified optimizations to remove lets in constructors, remove cases on propositional terms, switch to an unguarded fixpoint reduction rule and transform the higher-order constructor applications to first-order blocks for easier translation to usual programming languages. See the erasure README for a detailed view of the development.

Translations

Examples of translations built on top of this:

Quotation

The Quotation module is geared at providing functions □T → □□T for □T := Ast.term (currently implemented) and for □T := { t : Ast.term & Σ ;;; [] |- t : T } (still in the works).

Ultimately the goal of this development is to prove that is a lax monoidal semicomonad (a functor with cojoin : □T → □□T that codistributes over unit and ×), which is sufficient for proving Löb’s theorem.

The public-facing interface of this development is provided in MetaRocq.Quotation.ToTemplate.All and MetaRocq.Quotation.ToPCUIC.All.

See the Quotation README for a more detailed view of the development.

Examples

Papers

Team & Credits

Abhishek Anand Danil Annenkov Simon Boulier
Cyril Cohen Yannick Forster Jason Gross
Meven Lennon-Bertrand Kenji Maillard Gregory Malecha
Jakob Botsch Nielsen Matthieu Sozeau Nicolas Tabareau
Théo Winterhalter
MetaRocq is developed by (left to right) Abhishek Anand, Danil Annenkov, Simon Boulier, Cyril Cohen, Yannick Forster, Jason Gross, Meven Lennon-Bertrand, Kenji Maillard, Gregory Malecha, Jakob Botsch Nielsen, Matthieu Sozeau, Nicolas Tabareau and Théo Winterhalter.

Copyright (c) 2014-2023 Gregory Malecha
Copyright (c) 2015-2025 Abhishek Anand, Matthieu Sozeau
Copyright (c) 2017-2023 Simon Boulier, Cyril Cohen
Copyright (c) 2017-2025 Nicolas Tabareau, Yannick Forster, Théo Winterhalter
Copyright (c) 2018-2023 Danil Annenkov
Copyright (c) 2020-2023 Jakob Botsch Nielsen, Meven Lennon-Bertrand
Copyright (c) 2022-2025 Kenji Maillard
Copyright (c) 2023      Jason Gross

This software is distributed under the terms of the MIT license. See LICENSE for details.

Bugs

Please report any bugs or feature requests on the github issue tracker.