Cours 1 : đ›œ-rĂ©duction et đ›Œ-renommage

$\sim$ 1930 : Alonzo Church.

$𝜆$-termes :

$s,t,u, v \ldots :=$

  • variables : $x,y,z, \ldots$
  • applications : $uv$
  • $𝜆$-abstractions : $𝜆x.u$

Intro historique : crise des fondements mathématiques.

  • Hilbert, Church, Cantor

Cantor : a dĂ©couvert que tout ensemble $A$ s’injecte strictement dans $đ’«(A)$ ⟶ cardinalitĂ©s non comparables.

⟶ a Ă©crit une lettre au pape pour s’excuser car “l’infini c’est Dieu, et Dieu est unique” (l’a beaucoup troublĂ©).

Infini de $ℝ$ : $2^{\aleph_0} > \aleph_0$

$\aleph_1$ : plus petit cardinal strictement plus grand que $\aleph_0$.

Question :

\[\aleph_1 \overset{?}{=} 2^{\aleph_0}\]

⟶ Proposition indĂ©pendante de ZFC (on peut la rajouter ou rajouter sa nĂ©gation).

NB : Beaucoup de logiciens sont morts fous.

ThéroÚme de Zermello :

Tout ensemble peut ĂȘtre bien ordonnĂ©.

⟶ Pour le dĂ©montrer : part d’un certain ensemble d’axiomes (mais oublie l’axiome du choix).

Peano avait dĂ©couvert 30 ans avant le caractĂšre fondamental de l’axiome du choix ⟶ avait “tout inventĂ© avant tout le monde” (thĂ©orie de l’intĂ©gration Borel/Lebesgue, PainlevĂ©, 
), mais on l’a oubliĂ©.

Church : “La thĂ©orie des ensembles, c’est nul” ⟶ ça ne parle que d’ensembles, les fonctions sont dĂ©finies Ă  partir des ensembles, etc


NB : En maths, on fait des preuves qui pourraient se traduire en th des ensembles, mais dans les faits : on ne l’utilise pas en pratique.

âŸč Church invente le $𝜆$-calcul en 1940 pour remĂ©dier Ă  ça (et fonder les maths).

Mais Kleene, son Ă©lĂšve, dĂ©couvrira plus tard ça n’exprime que les fonctions calculables ⟶ grosse dĂ©ception pour Church.

Mais au dĂ©but : tout le monde s’en fiche.

NB : Renommage des variables muettes ⟶ trivialitĂ© Ă  formaliser.

Mais de maniĂšre “amusante” : Church s’était trompĂ© la premiĂšre fois lĂ -dessus.

$đ›œ$-rĂ©duction :
\[(đ›œ) : \underbrace{(𝜆x.u)v}_{\text{un redex (Reduction Expression)}} ⟶ \underbrace{u[x:=v]}_{\text{contractum (du redex)}}\]

Quel Ă©tait le bug de Church ?

RedĂ©couvert par McCarthy en 53, avec Lisp, et l’a nommĂ© “le problĂšme du fun arg ascendant/descendant”

\[(𝜆x.x)v ⟶ v\]

ex :

\[(𝜆x.+x1)4 ⟶ +41\]

NB : le $𝜆$-calcul est non typĂ©

Ex impossible Ă  comprendre avec un esprit “bien typĂ©â€ :

\[𝛿 ≝ 𝜆x.(xx)\]

Puis :

\[đ›ș ≝ 𝛿𝛿\]

Donc, par la $đ›œ$-rĂ©duction :

\[đ›ș ≝ (𝜆x.xx)𝛿 ⟶ 𝛿𝛿 = đ›ș\]

⟶ programme qui boucle : Ă©quivalent du

while (1) ;;

NB : pourquoi on dĂ©finit une relation binaire de “rĂ©duction”, si on voudrait plutĂŽt une relation d’équivalence ?

⟶ d’un point de vue informatique, on va parler du “nombre d’étapes de rĂ©duction”, etc
 (pas d’intĂ©rĂȘt a priori en logique, mais on verra par la suite que si)


NB : Pour les parenthĂšses, on utilisera la mĂȘme convention que OCamL :

\[xyz ≝ (xy)z ≠ x(yz)\]

L’application n’est PAS associative !

\[𝜆 x_1 ⋯ x_n.u = 𝜆 x_1 (𝜆x_2 ⋯ (𝜆x_n.u))))\]
\[(𝜆x.x)[x := yz] = 𝜆x.yz\]

car $𝜆yz.yz$ n’a pas de sens (pas un $𝜆$-terme).

ProblÚme : ne préserve pas la sémantique

Plusieurs solutions :

  • Le meilleure : Solution de De Bruijn

On va faire autrement : si on “oublie” toutes les occurrences de $x$ aprùs $𝜆x.$

\[(𝜆x.𝜆y.y)[y:=x]\\ = (𝜆x.𝜆y.y)\]

(fonction de projection sur la deuxiÚme coordonnée)

\[(𝜆x.𝜆y.z)[z:=x]\\ = (𝜆x.𝜆y.x)\]

encore une fois : viole la sémantique intuitive.


Solution ? Remplacement des variables :

\[(𝜆x'.𝜆y'.z)[z:=x]\\ (𝜆x'.𝜆y'.x)\]

MAIS on ne peut pas faire ça, car on n’a pas de notion de substitution de variables : on est en train d’essayer de le faire !


NB : $𝜋$-calcul ⟶ il y a des variables liĂ©es qui deviennent libres !


Un patch qui marche : substitution partielle

Donnera :

  • soit le rĂ©sultat attendu
  • soit sera non dĂ©fini

Notion de variables libres / liées : définies par récurrence sur les termes de maniÚre naturelle.

  • $fv(x)$ : “free variables” : ensemble des variables libres de $x$
  • $bv(x)$ : “bound variables” : ensemble des variables liĂ©es de $x$

NB : Il n’y a aucun rapport entre le fait d’ĂȘtre libre ou liĂ© :

Ex :

\[𝜆z.\underbrace{(𝜆x.xy)}_{x \text{ liĂ©}}\underbrace{(zx)}_{x \text{ libre}}\] \[fv = \lbrace x, y \rbrace \\ bv = \lbrace x, z \rbrace\]
Substitution partielle :
  • $u[x := v]$ dĂ©fini lorsque $x∉bv(u)$
  • Puis, par rĂ©currence sur $u$ lorsque $fv(u)∩bv(u) = ∅$

$đ›Œ$-Ă©quivalence

\[(đ›Œ) : 𝜆x.u \, đ›Œ \, 𝜆y.(u[x:=y])\]

si

  • $x≠y$
  • $x, y∉bv(u)$

MAIS : ces conditions sont vérifiées dans ce cas :

\[𝜆x.y \, đ›Œ \, 𝜆x.x\]

mais on ne pas qu’il y ait Ă©galitĂ©, donc on rajoute la condition :

  • $y∉fv(u)$
Congruence $=_đ›Œ$ :

c’est une relation d’équivalence qui est une congruence, i.e :

\[u =_đ›Œ v âŸč uw =_đ›Œ vw \\ u =_đ›Œ v âŸč wu =_đ›Œ wv \\ u =_đ›Œ v âŸč 𝜆x.u =_đ›Œ 𝜆x.v \\\]

et c’est la plus petite congruence qui contient $đ›Œ$, avec $u=_đ›Œv ≝ u \, đ›Œ \, v$

⟶ Convention de Barendregt :

  • on refuse d’avoir des variables libres et liĂ©es
  • on ne peut pas avoir deux variables liĂ©es de mĂȘme nom (du type $𝜆x.𝜆y.𝜆x. \ldots$)

Mais problĂšme ici :

\[(𝜆x.yxx)(𝜆z.z) ⟶ y (𝜆z.z) (𝜆z.z)\]

âŸč on le remplace, icognito, par :

\[(𝜆x.yxx)(𝜆z.z) ⟶ y (𝜆z.z) (𝜆z'.z')\]

Morale : On peut considĂ©rer tous les termes modulo $đ›Œ$-renommage et tout se passe bien.


\[\begin{align*} (𝜆x.x(𝜆y.yyx)(𝜆z.xz))(𝜆x',y',z'.x'y'z') & = (𝜆x',y',z'.x'y'z')(𝜆y.yy(𝜆x',y',z'.x'y'z'))(𝜆z.(𝜆x',y',z'.x'y'z')z) \\ & \\ \end{align*}\]

$u$ se $đ›œ$-contracte en $v$, notĂ© $u ⟶_đ›œ v$

NB : pas de rĂ©duction parallĂšle : contraction de plusieurs redex identiques en mĂȘme temps de la mĂȘme maniĂšre.

  digraph {
    rankdir=TB;
    A[label="(𝜆y.(𝜆x.x)y)z"];
    B[label="(𝜆x.x)z"];
    C[label="(𝜆y.y)z"];
    D[label="z"];
    A -> {B,C};
    B -> D;
    C -> D;

  }
Fortement normalisable ( = terminant) :

toutes les branches terminent

Normalisable ( = faiblement trerminant) :

il existe une branche qui termine

Ex :

  • l’ex prĂ©cĂ©dent est fortement normalisable, donc a fortiori normalisable.
  • $đ›ș$ n’est pas normalisable
  • Normalisable mais pas fortement normalisable :
  digraph {
    rankdir=TB;
    A[label="(𝜆x.y)đ›ș"];
    B[label="y"];
    C[label="(𝜆x.y)đ›ș"];
    D[label="(𝜆x.y)đ›ș"];
    E[label="⋯"];
    A -> {B,C};
    C -> D;
    C -> B;
    D -> E;
    E -> B;
    D -> B;
  }

Si on prend deux stratĂ©gies diffĂ©rentes qui arrivent Ă  une forme normale, c’est nĂ©cessairement la mĂȘme.


Relations binaires

Soit $⟶$ une relation binaire sur $A$.

Prop de Church-Rosser (CR) :

ssi \(\overset{\ast}{\longleftrightarrow} = \overset{\ast}{⟶}\overset{\ast}{⟔}\)

NB :

  • c’est la plus petite relation d’équivalence qui contient $⟶$.
  • Dans la thĂ©orie des groupes $1\cdot x$ n’est pas un redex, $x$ non plus, donc on ne peut pas les rĂ©duire pour obtenir la mĂȘme chose. Mais ils sont Ă©gaux ⟶ pas de Church-Rosser
Confluence :

si $u ⟶^\ast v_1$ et $u⟶^\ast v_2$, alors il existe $w$ tel que $v_1 ⟶^\ast w$ et $v_2 ⟶^\ast w$

Th : La confluence Ă©quivaut Ă  CR


Le $𝜆$-calcul est confluent.

Confluence locale :

si $u ⟶ v_1$ et $u⟶ v_2$, alors il existe $w$ tel que $v_1 ⟶^\ast w$ et $v_2 ⟶^\ast w$

Évidemment : Confluence âŸč Confluence locale, mais la rĂ©ciproque n’est pas vraie :

Contre-exemple de Curry

  digraph {
    A -> B;
    B -> A;
    A -> C;
    B -> D;
  }

C’est localement confluent

\[A ⟶ C \\ A ⟶ B\]

puis $B ⟶ C$

mais pas confluent :

\[A ⟶ C \\ A ⟶ B ⟶ D\]
Confluence forte :

si $u ⟶ v_1$ et $u⟶ v_2$, alors il existe $w$ tel que $v_1 ⟶^{≀1} w$ et $v_2 ⟶^{≀1} w$

Confluence forte + rĂ©duction parallĂšle âŸč confluence


Th de Neumann :

Si $⟶$ est localement confluente, fortement normalisante, alors elle est confluente.

HypothĂšse superflue :

$⟶$ finiment branchante :

tous les sommets du diagramme sont d’aritĂ© finie.


Lemme de König :

Tout arbre $T$ tq :

  • (a) $T$ est Ă  branchement fini
  • (b) toutes les branches de $T$ sont finies

(c) est fini.


NB :

  digraph {
    rankdir=TB;
    A -> A11;
    A -> A21;
    A21 -> A22;
    A -> A31;
    A31 -> A32;
    A32 -> A33;
    A -> ⋯;
  }

Toutes les branches sont finies, mais il n’existe pas de plus grande branche.


On montre

\[ÂŹ(c)∧ (a) âŸč ÂŹ(b)\]
Arbre :

Ensemble ordonnĂ© (par la relation “ĂȘtre ancĂȘtre de”) bien fondĂ©, dont les segments initiaux sont des chaĂźnes (totalement ordonnĂ©s).


NB : Le lemme de König est une forme faible de l’axiome du choix ⟶

axiome des choix dépendants :

si j’ai une fonction qui a toute suite de choix finis associe un nouveau choix, il existe une fonction de choix.

MAIS :

Gödel : l’axiome du choix est indĂ©pendant de la thĂ©orie ZF

⟶ avec ensembles constructibles :

la plus petite famille d’ensembles qu’on peut former avec les constructions classiques de ZF.

Gödel montre que le sous-modĂšle des ensembles constructibles vĂ©rifie immĂ©diatement l’AC dĂšs qu’il existe un modĂšle des ensembles le vĂ©rifiant.

âŸč Il y a une hiĂ©rarchie d’axiomes, plus ou moins forts : AC > Axiome des choix dĂ©pendants, etc



NB : Peano, 30 ans avant Zermello, avait eu ce problĂšme, dans König, et avait dĂ©jĂ  pris des prĂ©cautions dans la dĂ©finition des arbres pour ne pas avoir Ă  recourir Ă  l’AC.


\[𝜈(u) = \max \lbrace \text{ longueur d'une branches } u ≝ u_0 ⟶ ⋯ ⟶ u_n \rbrace\]
  digraph {
    rankdir=TB;
    A[label = "Confluence locale"];
    B[label = "Confluence"];
    C[label = "Confluence forte"];
    D[label = "Church-Rosser"];
    A -> B[label="si ft normalisant (Neumann)"];
    B -> A;
    C -> B;
    B -> D;
    D -> B;

  }

Confluence âŸč PropriĂ©tĂ© de la forme normale unique


$𝜂$-rùgle

\[(𝜂) : 𝜆x.ux ⟶ u\]

uniquement si

\[x∉fv(u)\]

NB :

  • Aucun langage de programmation n’implĂ©mente $𝜂$ : ni OCamL, ni Coq, 

  • Il y a $đ›œ$-Ă©quivalence si $u$ est une abstraction : $u ≝ 𝜆y.t$

  • MAIS : il existe des termes $u$ (par ex: les variables : $u≝y$) tels que

    \[𝜆x.yx ≠_{đ›œ} y\]

    En effet : par l’absurde, sinon : il seraient rĂ©ductibles, par confluence, en un mĂȘme terme $w$ : mais ils sont dĂ©jĂ  en forme normale !


NB : cf. Procédure de Knuth et Bendix


$𝜆^\ast$-calcul

On rajoute des termes de la forme

let x=u in v

let x=u in v ⟶ $v[x:=u]$

Prop : le $𝜆^\ast$-calcul est fortement confluent

NB : Barendregt en a inventĂ© une preuve utilisant une “mesure entiĂšre”.

\[SN ≝ \lbrace u \mid u \text{ termine } \rbrace\] \[\overline{SN} ≝ \lbrace 𝜃≝ [x_1 := w_1, ⋯, x_n := w_n ], \text{ oĂč } w_i∈SN \rbrace\]
Substitution parallùle $𝜃 ≝ [x_1 := w_1, ⋯, x_n := w_n ]$ :

une fonction qui Ă  chaque $x_i$ associe $w_i$ (modulo $đ›Œ$-renommage, toujours)

DĂ©m :

Démontrons, apr réc sur la structure de $u$ :

\[u∈ SN\]
  • Si $u = x$ : OK

  • Si $u = st$, $u ⟶ s_1 t_1 ⟶ ⋯$ : oĂč on rĂ©duit Ă  gauche ou Ă  droite Ă  chaque Ă©tape. Si la rĂ©duction est infinie, il y a une rĂ©duction infinie Ă  gauche ou Ă  droite : impossible, car $⟶$ est fortement normalisante par HR.

  • $u = 𝜆x. s$, $𝜆x. s_1 ⟶ 𝜆x. s_2 ⟶ ⋯$ est finie.

  • $u = $ let x=s in t ⟶ $u = $ let x=s' in t'

⟶ Il “faut” renforcer l’hypothĂšse de rĂ©currence

Pouvoir expressif du $𝜆$-calcul

On va coder toutes les fonctions calculables, grùce aux fonctions récursives de Gödel : la plus petite classe de fonctions contenant les fonctions constantes, la fonction successeur, les projections, la récurrence primitive (cf. le cours de calculabilité).

BUT : Pour chaque $f$ rĂ©cursive, on veut trouver un $𝜆$-terme $\lceil f \rceil$ tq :

\[∀n_1, ⋯, n_k ∈ℕ, \text{ si } f(n_1, ⋯, n_k) \text{ dĂ©fini, alors } \lceil f \rceil \lceil n_1 \rceil ⋯ \lceil n_k \rceil ⟶^\ast \lceil f(n_1, ⋯, n_k) \rceil\]
let rec f x  = u f x in f

Le terme $f$ cherché est tq

\[∀v, fv =_{đ›œ} u f v\]

On cherche un $f$ tq :

\[f =_{đ›œ} uf\]

⟶ un point fixe de $u$

⟶

Th : Tous les termes du $𝜆$-calcul ont un point fixe, et mĂȘme MIEUX :

Il existe un terme clos (appelé combinateur, souvent noté $y$) tq :

\[∀u, yu \text{ est un point fixe de } u\]

Corollaire : $yu =_{đ›œ} u (yu)$

Combinateur de pts fixes de Church

\[Y ≝ 𝜆f.(𝜆x.f(xx))(𝜆x.f(xx))\]

NB : aucun combinateur de point fixe ne peut normaliser.

\[Yu ⟶_đ›œ (𝜆x. u(xx)) (𝜆y. u(y)) \\ ⟶_đ›œ u (𝜆y. u(y)) (𝜆y. u(y)) \\ ⟔_đ›œ u(Yu)\]

Combinateur de pts fixes de Turing :

\[𝛳 ≝ AA\]

oĂč

\[A ≝ 𝜆g,h.h(ggh)\]

⟶

\[𝛳u ⟶_đ›œ (𝜆g,h.h(ggh))Au \\ ⟶_đ›œ u(AAu) ⟔_đ›œ u(𝛳u)\]

Donc let rec f x = u f x in f $≝ Yu$


DĂ©f : $u ⟶_1 v$ ssi il existe un $𝜆^\ast$-terme $u’$ tel que $u’$

  • est obtenu Ă  partir de $u$ en ajoutant des $\ast$ Ă  certains rĂ©dex.
  • $u’ ⟶^\ast v$ en $𝜆^\ast$-calcul

NB : $v$ est un $𝜆$-terme, mais aussi en particulier un $𝜆^\ast$-terme.

Effacement des Ă©toiles :
\[E(u')=u\]
\[match = 𝜆m \underbrace{x}_{\text{si } m=0} \underbrace{y}_{\text{si } m≠0}. m \, (𝜆z. y (pred \, \, m)) \, x \\ âŸč match 0 \, u \, v ⟶^\ast u \\ match (m+1) \, u \, v ⟶^\ast v m\]

Th : Pour toute fonction rĂ©cursive $f: ℕ^k⟶ℕ$, il existe un $𝜆$-terme $f$ tq

  • Si $f(n_1, ⋯, n_k)$ est dĂ©finie, alors $\lceil f \rceil \lceil n_1 \rceil ⋯ \lceil n_k \rceil ⟶^\ast \lceil f(n_1, ⋯, n_k) \rceil$
  • Si $f(n_1, ⋯, n_k)$ n’est pas dĂ©finie, alors $\lceil f \rceil \lceil n_1 \rceil ⋯ \lceil n_k \rceil$ ne termine pas

ThéorÚme de standardisation

Forme de tĂȘte :

tout terme $u$ s’écrit de façon unique \(𝜆 x_1 ⋯ x_n. h u_1 ⋯ u_n\) oĂč

  • $h$ (la tĂȘte) est

    • soit une variable $x$ : la variable de tĂȘte ⟶ alors de $u$ est en forme “normale de tĂȘte” (ce n’est pas nĂ©cessairement une forme normale par contre).
    • soit une $𝜆$-abstraction $𝜆x.t$ (et alors $n≄1$), et $(𝜆x.t)u_1$ est appelĂ© rĂ©dex de tĂȘte
RĂ©duction de tĂȘte :

$u⟶_t v$ ssi $u = 𝜆x_1 ⋯ x_m. (𝜆x.t) u_1 ⋯ u_n$ ($n≄1$) et $v=𝜆x_1 ⋯ x_m.t[x:=u_1] u_2 ⋯ u_n$

NB : elle est dite faible si $m=0$ : c’est une rĂ©duction de tĂȘte faible qu’implĂ©mentent les langages qui font de l’appel par nom.

Ex $𝜆x. x((𝜆y.y)z)$ est en forme normale de tĂȘte, mais pas en forme normale.

  digraph {
    rankdir=TB;
    App2[label="App"];
    𝜆x -> App;
    App -> {x, App2};
    App2 -> {𝜆y, z};
    𝜆y -> y;
  }

⇓

  digraph {
    rankdir=TB;
    h[label="𝜆x_1⋯x_n.h"]
    h -> {u_1, u_2, ⋯, u_n};
  }

R. David : RĂ©duction standard ⟶ on descend dans l’arbre pour rĂ©duire, en s’interdisant de remonter.

\(u âŸč_s v\) ssi

  • soit $v$ n’est pas une variable ($m≄1$ ou $n≄ 1$) : \(u ⟶ ^\ast_t 𝜆 x_1 ⋯ x_m. u_0 ⋯ u_n \\ âŸč_s 𝜆 x_1 ⋯ x_m. v_0 ⋯ v_n = v\)

  • sinon : $u ⟶^\ast_t v$

Th : \(⟶^\ast = âŸč_s\)

Leave a comment