Coder Social home page Coder Social logo

johanneskloos / metacoq Goto Github PK

View Code? Open in Web Editor NEW

This project forked from metacoq/metacoq

0.0 1.0 0.0 4.47 MB

Metaprogramming in Coq

Home Page: https://metacoq.github.io/metacoq

License: MIT License

Makefile 0.27% Coq 90.45% OCaml 7.78% Shell 0.10% CSS 0.28% Verilog 1.13%

metacoq's Introduction

MetaCoq

MetaCoq

Build Status Gitter

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

At the center of this project is the Template-Coq quoting library for Coq. The project currently has a single repository extending Template-Coq with additional features:

Template-Coq

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

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

  • Reification of the environment structures, for constant and inductive declarations.

  • Denotation of terms and global declarations

  • A monad for manipulating global declarations, calling the type checker, and inserting them in the global environment, in the stype of MTac.

Checker

  • A partial type-checker for the Calculus of Inductive Constructions, runable as a plugin.

PCUIC and Extraction

  • A cleaned up version of the term language of Coq and its associated type system, equivalent to the one of Coq.

  • An extraction procedure to untyped lambda-calculus accomplishing the same as the Extraction plugin of Coq

Translations

  • Example of plugin built on top of this.

Branches

The coq-8.9 branch is the active development branch. If possible, it's strongly recommended to use this branch.

The branches coq-8.6, coq-8.7 and coq-8.8 are stable but may not receive new features.

The branch master tracks the current Coq master branch.

Documentation

You may want to start by a demo: demo.v

The 8.7 branch documentation (coqdoc files) and pretty-printed HTML versions of the translations are available.

ident vs. qualid. vs kername

TemplateCoq uses three types convertible to string which have a different intended meaning:

  • ident is the type of identifiers, they should not contains any dot. E.g. nat

  • qualid is the type of partially qualified names. E.g. Datatypes.nat

  • kername is the type of fully qualified names. E.g. Coq.Init.Datatypes.nat

Quoting always produce fully qualified names. On the converse, unquoting allow to have only partially qualified names and rely on Coq to resolve them. The commands of the TemplateMonad also allow partially qualified names.

Options

Set / Unset Strict Unquote Universe Mode. When this mode is on (on by default):

  • the unquoting of a universe level fails if this level does not exists

  • the unquoting of a sort which is an empty list fails

Otherwise:

  • the level is added to the current context

  • or a fresh level is added.

Examples of plugins

Papers

  • "The MetaCoq Project" Matthieu Sozeau, Abhishek Anand, Simon Boulier, Cyril Cohen, Yannick Forster, Fabian Kunze, Gregory Malecha, Nicolas Tabareau, Théo Winterhalter. Extended version of the ITP 2018 paper. Submitted.

    This includes a full documentation of the Template Monad.

  • "Towards Certified Meta-Programming with Typed Template-Coq" Abhishek Anand, Simon Boulier, Cyril Cohen, Matthieu Sozeau and Nicolas Tabareau. ITP 2018.

  • The system was presented at Coq'PL 2018

Credits

Template-Coq was originally developed by Gregory Malecha, and is now developed by Abhishek Anand, Simon Boulier and Matthieu Sozeau.

Contributors include Yannick Forster, Cyril Cohen and Nicolas Tabareau.

Copyright (c) 2014-2018 Gregory Malecha
Copyright (c) 2015-2018 Abhishek Anand, Matthieu Sozeau
Copyright (c) 2017-2018 Simon Boulier, Nicolas Tabareau, Cyril Cohen

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

Installation instructions

Install from GitHub repository

To get the source code:

# git clone https://github.com/MetaCoq/metacoq.git
# git checkout -b coq-8.8 origin/coq-8.8
# git status

Check that you are indeed on the coq-8.8 branch.

Requirements

To compile the library, you need:

  • Coq 8.8.2 (older versions of 8.8 might also work)
  • OCaml (tested with 4.04.1, beware that OCaml 4.06.0 can produce linking errors on some platforms)
  • Equations 1.2

Requirements through opam

The easiest way to get all is through opam:

You might want to create a "switch" (an environment of opam packages) for Coq if you don't have one yet. You need to use opam 2 to obtain the right version of Equations.

# opam switch create coq.8.8.2 4.04.1 
# eval $(opam env)

This creates the coq.8.8.2 switch which initially contains only the basic OCaml 4.04.1 compiler, and puts you in the right environment (check with ocamlc -v).

Once in the right switch, you can install Coq and the Equations package using:

# opam pin add coq 8.8.2
# opam pin add coq-equations 1.2+8.8

Pinning the packages prevents opam from trying to upgrade it afterwards, in this switch. If the commands are successful you should have coq available (check with coqc -v).

Compile

Once in the right environment, Use:

  • make to compile the template-coq plugin, the checker and the extraction plugin.

  • make translations to compile the translation plugins

  • make test-suite to compile the test suite

  • make install to install the plugin in coq's user-contrib local library. Then the Template namespace can be used for Require Import statements, e.g. From Template Require Import All..

Install with OPAM

Alternatively, you can install MetaCoq through Opam.

Add the Coq repository:

opam repo add coq-released https://coq.inria.fr/opam/released

and run:

opam install coq-template-coq

To get beta versions of Coq, you might want to activate the repository:

opam repo add coq-core-dev https://coq.inria.fr/opam/core-dev

Packages 2.1~beta and 2.1~beta3 are for Coq 8.8. Package 2.0~beta is for Coq 8.7.

How to Use

Check test-suite/demo.v for examples.

Unless you installed the library (with make install), you must add the theories directory to your Coq load path with the prefix Template. This can be done on the command line by adding:

coqc ... -R <path-to-theories> -as Template ...

or inside a running Coq session with:

Add LoadPath "<path-to-theories>" as Template.

Because paths are often not portable the later is not recommended.

If you use Emacs and Proof General, you can set up a .dir-locals.el with the following code:

((coq-mode . ((coq-load-path . (
 (nonrec "<absolute-path-to-theories>" "Template")
 )))))

As long as you don't check this file into a repository things should work out well.

Bugs

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

metacoq's People

Contributors

theowinterhalter avatar mattam82 avatar simonboulier avatar aa755 avatar gmalecha avatar yforster avatar annenkov avatar tabareau avatar gasche avatar jasongross avatar skyskimmer avatar maximedenes avatar cohencyril avatar clarus avatar johanneskloos avatar palmskog avatar yurug avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.