{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Lambda-calcul implémenté en OCaml\n", "\n", "Ce notebook est inspiré de [ce post de blog du Professeur Matt Might](http://matt.might.net/articles/python-church-y-combinator/), qui implémente un mini langage de programmation en $\\lambda$-calcul, en Python.\n", "Je vais faire la même chose en OCaml.\n", "\n", "## Expressions\n", "On rappelle que les expressions du [Lambda calcul](https://fr.wikipedia.org/wiki/Lambda-calcul), ou $\\lambda$-calcul, sont les suivantes :\n", "$$ \\begin{cases}\n", "x, y, z & \\text{(des variables)} \\\\\n", "u v & \\text{(application de deux termes}\\, u, v\\; \\text{)} \\\\\n", "\\lambda x. v & \\text{(lambda-function prenant la variable}\\; x \\;\\text{et le terme}\\; v \\;\\text{)}\n", "\\end{cases} $$\n", "\n", "## But ?\n", "Le but ne va pas être de les représenter comme ça avec des types formels en Caml, mais plutôt d'utiliser les constructions de Caml, respectivement `u(v)` et `fun x -> v` pour l'application et les fonctions anonymes, et encoder des fonctionnalités de plus haut niveau dans ce langage réduit.\n", "\n", "## Grammaire\n", "Avec une grammaire BNF, si `` désigne un nom d'expression valide (on se limitera à des noms en miniscules consistitués des 26 lettres `a,b,..,z`) :\n", "\n", "