Published March 18, 2024 | Version v1.3.1-8.19
Software Open

MetaCoq/metacoq: MetaCoq 1.3.1 for Coq 8.19

Description

We are happy to announce release 1.3.1 of the MetaCoq project for Coq 8.19, available both as source and through opam. See the website for a detailed overview of the project, introductory material and related articles and presentations.

The main changes in this new version w.r.t. v1.2.1 are:

  • A full integration of the typed erasure phase from the ConCert project in the erasure pipeline, with a complete correctness proof, by @mattam82. Use option MetaCoq Erase -typed to switch it on. It can be configured with the "live" erasure function inside Coq (see erasure_live_test.v)
  • Generalizations of the correctness and simulation lemmas by @yforster @mattam82 and @tabareau, showing in particular that erasure of applications of functions from firstorder types to firstorder types is compiled to applications, justifying separate compilation of functions and their arguments.
  • Using standardization and canonicity, we also show that erased values of programs of firstorder inductive types (non-erasable inductives types for which all constructor argument types are themselves firstorder) are in direct correspondence with their Coq counterparts, allowing sound readback of these values. In other words, evaluating the erased terms under these assumptions faithfully simulates evaluation in Coq. Based on this, CertiCoq and coq-malfunction both implement an Eval variant that reads back Coq values and can be trusted.
  • Support for primitive ints, floats and array literal values. Primitive operations are still treated as axioms to be realized in target languages and the correctness theorems do not apply in their presence yet.
  • Optional passes have been added that replicate the Coq Extraction plugin's functionality, without proof (yet):
    • Inlining of defined constants (e.g. Extract Inline).
    • Reordering of constructors (e.g. part of Extract Inductive). This allows to target different representations in target languages (typically bool in OCaml).
    • Unboxing of singleton unary constructors. For example, exist nat (fun x : nat => x = 1) 1 p : { x : nat | x = 1 } becomes exist 1 after typed erasure and removal of constructor parameters, which can be further unboxed to just 1.
    • CoFixpoints/CoInductives to Lazy/Inductives: cofixpoints and (co)-constructors get translated to fixpoints + lazy/force constructs in lambda-box, allowing efficient evaluation of coinductive terms in target languages (supported only in coq-malfunction/ocaml extraction for now).
    • Beta-reduction. This reduces manifest beta-redexes in the erased terms, especially useful after inlining.

The preprint "Verified Extraction from Coq to OCaml" presents the development of the compilation pipeline from Coq to Malfunction/OCaml, including the correctness proofs mentioned above.

The preprint "Correct and Complete Type Checking and Certified Erasure for Coq, in Coq" presents the development of the sound and complete type checker based on bidirectional typing, the meta-theoretical results (subject reduction, standardization, canonicity and consistency) and the verified erasure procedure of this version of MetaCoq.

MetaCoq integrates Template-Coq, a reification and denotation plugin for Coq terms and global declarations, a Template monad for metaprogramming (including the ability to extract these metaprograms to OCaml for efficiency), a formalisation of Coq's calculus PCUIC in Coq, a relatively efficient, sound and complete type checker for PCUIC, a verified type and proof erasure procedure from PCUIC to untyped lambda calculus and a quotation library. MetaCoq provides a low-level interface to develop certified plugins like translations, compilers or tactics in Coq itself.

You can install MetaCoq directly from sources or using opam install coq-metacoq. This release will be included in an upcoming Coq Platform.

The current release includes several subpackages, which can be compiled and installed separately if desired:

  • the utils library contains extensions to the standard library (notably for reasoning with All/All-n type-valued predicates) (in directory utils, and as coq-metacoq-utils).
  • the common libraries of basic definitions for the abstract syntax trees shared by multiple languages (common, coq-metacoq-common)
  • the Template-Coq quoting library and plugin (template-coq / coq-metacoq-template)
  • a formalisation of meta-theoretical properties of PCUIC, the calculus underlying Coq (pcuic / coq-metacoq-pcuic)
  • a verified equivalence between Template-Coq and PCUIC typing (in directory template-pcuic and as coq-metacoq-template-pcuic)
  • a total verified type-checker for Coq (safechecker / coq-metacoq-safechecker), usable inside Coq.
  • a plugin interfacing with the extracted type-checker in OCaml, providing the MetaCoq SafeCheck <term> command (safechecker-plugin, coq-metacoq-safechecker-plugin)
  • a verified type and proof erasure function for Coq (erasure / coq-metacoq-erasure), usable inside Coq.
  • a plugin interfacing with the extracted erasure pipeline in OCaml, providing the MetaCoq Erase <term> command (erasure-plugin, coq-metacoq-erasure-plugin)
  • a quoting library, allowing the quotation of terms and type derivations along with associated data structures as ASTs/terms (quotation / coq-metacoq-quotation).
  • a set of example translations from Type Theory to Type Theory (translation/ coq-metacoq-translations).

A good place to start are the files demo.v, safechecker_test.v, erasure_test.v in the test-suite directory.

This version of MetaCoq was developed by Yannick Forster, Jason Gross, Yann Leray, Matthieu Sozeau and Nicolas Tabareau with contributions from Yishuai Li. You are welcome to contribute by opening issues and PRs. A MetaCoq Zulip stream is also available.

The MetaCoq Team

What's Changed

  • Merge 8.16 into 8.17 by @yforster in https://github.com/MetaCoq/metacoq/pull/992
  • Merge 8.16, 8.17 and 8.18 into main by @yforster in https://github.com/MetaCoq/metacoq/pull/993
  • Replace elimtype False by exfalso by @yforster in https://github.com/MetaCoq/metacoq/pull/995
  • use names in EAst.t by @tabareau in https://github.com/MetaCoq/metacoq/pull/997
  • Add a let in front of case in implement_box by @yforster in https://github.com/MetaCoq/metacoq/pull/999
  • Qualify imports to disable race condition for opam builds by @yforster in https://github.com/MetaCoq/metacoq/pull/1001
  • Adapt to coq/coq#17576 (declare_variable takes typing flags argument) by @SkySkimmer in https://github.com/MetaCoq/metacoq/pull/1005
  • Adapt to coq/coq#17836 (sort poly) by @SkySkimmer in https://github.com/MetaCoq/metacoq/pull/984
  • Adapt w.r.t. coq/coq#18294. by @ppedrot in https://github.com/MetaCoq/metacoq/pull/1010
  • Adapt to coq/coq#18280 (case relevance outside case info) by @SkySkimmer in https://github.com/MetaCoq/metacoq/pull/1009
  • Compile pipeline app by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1013
  • Transform extends split by @tabareau in https://github.com/MetaCoq/metacoq/pull/1014
  • Adapt wrt Coq/Coq#18164 by @Villetaneuse in https://github.com/MetaCoq/metacoq/pull/1011
  • Adapt to coq/coq#18331 (mind_kelim -> mind_squashed) by @SkySkimmer in https://github.com/MetaCoq/metacoq/pull/1015
  • Support primitive array terms by @mattam82 in https://github.com/MetaCoq/metacoq/pull/998
  • squash typing hypothesis in precond by @tabareau in https://github.com/MetaCoq/metacoq/pull/1025
  • Fix quotation after primitive array support by @JasonGross in https://github.com/MetaCoq/metacoq/pull/1024
  • LSP Support by @yannl35133 in https://github.com/MetaCoq/metacoq/pull/1006
  • Primitive evaluation by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1027
  • Fix breakage from https://github.com/coq/coq/pull/18374 by @proux01 in https://github.com/MetaCoq/metacoq/pull/1028
  • Typed extraction integration by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1030
  • More unified judgment type and All_local_env by @yannl35133 in https://github.com/MetaCoq/metacoq/pull/1007
  • Primitive flags by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1033
  • Add some debugging suggestions for quotation by @JasonGross in https://github.com/MetaCoq/metacoq/pull/1031
  • Restore compatibility with OCaml < 4.13 by @JasonGross in https://github.com/MetaCoq/metacoq/pull/1023
  • Strengthen In_size lemma by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1043
  • Fix remaining warnings, minor fixups by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1045
  • Generalize lemmas for coq malfunction by @tabareau in https://github.com/MetaCoq/metacoq/pull/1046
  • 8.18 warnings and deprecations fixes by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1047
  • 8.19 warnings deprecations by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1048
  • CI: multiple OCaml versions by @liyishuai in https://github.com/MetaCoq/metacoq/pull/1040
  • erasure_pipeline_extends_app with todo irrel by @tabareau in https://github.com/MetaCoq/metacoq/pull/1050
  • generalize verified_erasure_pipeline_lookup_env_in by @tabareau in https://github.com/MetaCoq/metacoq/pull/1054
  • Fix typed erasure calls by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1052
  • Erase function lemma by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1053
  • Resurrect the cofix transform, adding a new axiom for the admitted pr… by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1056
  • Avoid Ee := EWcbvEval module aliases which result in ugly extraction … by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1057
  • Implement tLazy and tForce in EAst by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1058
  • Reorder constructors by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1059
  • Unsafe inline beta and unboxing transforms by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1061
  • Implement a general Show typeclass in MetaCoq.Utils by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1063
  • Unsafe and ewcbvevalnamed by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1064
  • Fix typo by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1065
  • Fix inlining and reorder constructors which were not translating let … by @mattam82 in https://github.com/MetaCoq/metacoq/pull/1066

New Contributors

  • @liyishuai made their first contribution in https://github.com/MetaCoq/metacoq/pull/1040

Full Changelog: https://github.com/MetaCoq/metacoq/compare/v1.2.1-8.18...v1.3.1-8.19

Files

MetaCoq/metacoq-v1.3.1-8.19.zip

Files (4.4 MB)

Name Size Download all
md5:b5029fe5a9d5fb874db71487a712dd80
4.4 MB Preview Download

Additional details

Related works