nom-0.1.0.0: src/Language/Nominal.hs
{-|
Module : Nominal
Description : Implementation of nominal techniques as a Haskell package
Copyright : (c) Murdoch J. Gabbay, 2020
License : GPL-3
Maintainer : murdoch.gabbay@gmail.com
Stability : experimental
Portability : POSIX
Nominal-flavoured implementation of data in a context of local names, designed following the ideas in <https://link.springer.com/article/10.1007/s001650200016 a new approach to abstract syntax with variable binding> (see also <http://www.gabbay.org.uk/papers.html#newaas-jv author's pdfs>).
-}
{-# LANGUAGE CPP #-}
module Language.Nominal
(
-- * Introduction
-- $blurb
-- * Quick links
-- $quicklinks
-- * Type(class) overview
-- $quickref
module Language.Nominal.Name
, module Language.Nominal.NameSet
, module Language.Nominal.Sub
, module Language.Nominal.Nom
, module Language.Nominal.Binder
, module Language.Nominal.Abs
, module Language.Nominal.Equivar
, module Language.Nominal.Unify
)
where
import Language.Nominal.Name
import Language.Nominal.NameSet
import Language.Nominal.Sub
import Language.Nominal.Nom
import Language.Nominal.Binder
import Language.Nominal.Abs
import Language.Nominal.Equivar
import Language.Nominal.Unify
#include "Nominal/Blurb.txt"
{- $quicklinks
== Worked examples
* "Language.Nominal.Examples.Tutorial": We explore some basic concepts.
* "Language.Nominal.Examples.UntypedLambda": Untyped lambda-calculus syntax and reductions (short example).
* "Language.Nominal.Examples.Assembly1": A simple assembly language, with binding (short example).
* "Language.Nominal.Examples.Assembly2": A simple assembly language, with binding and a swap-variable primitive (short example).
* "Language.Nominal.Examples.Style": Some basic comments on recommended programming style using this package.
* "Language.Nominal.Examples.SystemF": System F syntax and reductions (longer example).
* "Language.Nominal.Examples.IdealisedEUTxO": A EUTxO-style blockchain system, following the ideas in <https://arxiv.org/abs/2003.14271 mathematical idealisation of the Extended UTxO model> (longer example).
== Links and references
* This package's <https://github.com/bellissimogiorno/nominal GitHub page>.
* The underlying mathematical model is described in <https://link.springer.com/article/10.1007/s001650200016 a new approach to abstract syntax with variable binding> (<http://www.gabbay.org.uk/papers.html#newaas-jv author's pdfs>).
* The paper on <https://arxiv.org/abs/1009.2791v1 closed nominal rewriting> (<http://www.gabbay.org.uk/papers.html#clonre author's pdfs>) is pertinent to the design of "Language.Nominal.Unify".
* The paper on the <https://arxiv.org/abs/2003.14271 mathematical idealisation of the Extended UTxO model> is pertinent "Language.Nominal.Examples.IdealisedEUTxO".
* This draft book on <https://www.mimuw.edu.pl/~bojan/upload/main-10.pdf orbit-finite sets> may be of interest.
* The <https://hackage.haskell.org/package/bound Bound package>, from which the worked examples "Language.Nominal.Examples.Assembly1" and "Language.Nominal.Examples.Assembly2" are adapted.
== Related work
* <https://hackage.haskell.org/package/bound bound: Making de Bruijn Succ less>
* <https://hackage.haskell.org/package/unbound unbound: Generic support for programming with names and binders>
* <https://hackage.haskell.org/package/unbound-generics unbound-generics: Support for programming with names and binders using GHC Generics>
* <https://hackage.haskell.org/package/nominal nominal: Binders and alpha-equivalence made easy>
* <https://www.mimuw.edu.pl/~szynwelski/nlambda/doc/ NLambda: computations over infinite structures using logical formulas and SMT solving>
/(Something I should put on this list? Let me know.)/
-}
{- $quickref
Here is an overview of some core typeclasses:
* 'Language.Nominal.Name.KAtom' and 'Language.Nominal.Name.Atom':
Types of atomic freshly generatable identifiers.
* 'Language.Nominal.Name.KName' and 'Language.Nominal.Name.Name':
Types of labelled atoms.
* 'Language.Nominal.Name.KSwappable' and 'Language.Nominal.Name.Swappable':
Typeclasses of types with a /swapping action/ by atoms and names.
* 'Language.Nominal.Name.KSupport' and 'Language.Nominal.Name.Support':
Typeclasses of types with a structural notion of /the atoms in this object/. In the mathematics, "support" coincides with "atoms for which the object may be asymmetric under swappings", but in this package support means something much stricter: that it is possible to traverse the data and pick out the atoms in its support.
/Note:/ "having empty support" does /not/ mean "having no atoms". It means "symmetric under swapping atoms", which is not at all the same idea.
* 'Language.Nominal.Name.Nameless': types like @Int@, @String@, and @()@ that are guaranteed atoms-free.
* 'Language.Nominal.Nom.KNom' and 'Language.Nominal.Nom.Nom': An atoms-binding monad.
* 'Language.Nominal.Nom.Binder': A typeclass for functions acting on binding types.
* 'Language.Nominal.Abs.KAbs' and 'Language.Nominal.Abs.Abs': A name-abstracting functor.
* 'Language.Nominal.Name.KRestrict' and 'Language.Nominal.Name.Restrict': A typeclass of types with an inherent notion of atoms-binding.
* 'Language.Nominal.Unify.KUnifyPerm' and 'Language.Nominal.Unify.UnifyPerm': Typeclasses of types with a notion of unification by injective partial functions on atoms.
-}