Dans cette section, nous rappelons la définition de système de réécriture de termes.
Notre définition est un peu plus générale que la définition habituelle. Elle permet de
rendre compte harmonieusement de la réécriture usuelle, de la réécriture conditionnelle
et duλ-calcul. Nous reprenons la terminologie de [Ter03].
Définition 2.4.1 (Systèmes de réécriture de termes) Un système de réécriture de
termes(ou TRS) sur L⊆Λ(Σ) est une relation binaire R sur L telle quelRr implique
l /∈ X et FV(r)⊆FV(l).
Une paire(l, r)∈ R est une règle de réécriture deR, aussi notée l7→
Rr.
À un TRS (L,R) on associe l’ARS (L,→
R) où →
Rest la plus petite relation de
ré-écriture sur L qui contient R.
Remarque 2.4.2
— Comme pour les relations de réécriture (voir remarque.2.2.2), la notion de TRS a
pour cas particulier les TRS surΛ(Σ),Ter(Σ,X) etTer(Σ).
— De même, un TRS sur uneΣ-algèbre libre Ter(Σ
A,X
A)est une relation binaire R
surTer(Σ
A,X
A) telle que {(i(t), i(u)) | tRu} est un TRS sur Ter(Σ,X), où i est
l’isomorphisme canonique deTer(Σ
A,X
A)→Ter(Σ,X).
— Si (Λ(Σ),R) est un système de réécriture où R est stable par substitution, alors
par le lemme2.2.3,(Λ(Σ),R) est une relation de réécriture (oùRest la clôture de
Rpar contexte, définie en 2.2.3).
— On écrit(L,7→
RR′)pour l’union des TRS(L,7→
R)et(L,7→
R′), et(L,→
R∪R′) pour
la relation de réécriture qui en est issue.
2.4 Systèmes de réécriture
— Selon les définitions2.4.1 et2.3.2, les relations de réécriture parallèles ne forment
pas des TRS car ce sont des relations réflexives, qui contiennent donc{(x, x) | x∈
X}.
Exemple 2.4.3
— Si(Λ(Σ),R) est un TRS, alors il en est de même pour(Λ(Σ),→
R).
— La notion de système de réécriture correspond à l’idée de règle de réécriture :R
est vu comme un ensemble de règlesl7→
Rr.
Proposition 2.4.4 (Stabilité par renommage) Un renommage est une bijection sur
X. Si R est un TRS sur L⊆Λ(Σ) et ρ est un renommage tel que ρ(FV(R))⊆L, alors
→
R=→
Rρ, oùRρ=
def{(lρ, rρ) | l7→
Rr}.
Chapitre 3
Réécriture et lambda-calcul
Dans ce chapitre, nous articulons les objets d’étude centraux de cette thèse : la
réécri-ture, leλ-calcul et leur combinaison.
Nous partons de la réécriture du premier ordre sur Ter(Σ,X) et de son extension
aux termes applicatifs Ter(Σ
App,X). Nous en considérons deux variantes : la réécriture
algébrique, qui est l’extension naturelle de la notion de premier ordre « sémantique » aux
termes applicatifs, et la réécriture applicative à droite, qui autorise n’importe quel terme
de Ter(Σ
App,X) dans les membres droits de règles. Nous donnons quelques exemples
de systèmes algébriques, comme les paires surjectives, et de systèmes applicatifs, comme
l’itérateur et le récurseur sur les entiers.
Nous passons ensuite auλ-calcul. Nous commençons par le cas non typé puis présentons
deux calculs typés : le λ-calcul simplement typé et le système F. Ce dernier système
permet de coder certaines des fonctions présentées dans le cadre de la réécriture, par
exemple le schéma d’itération sur les entiers de Church. Cependant, les possibilités de
codage du λ-calcul ne semblent pas suffisantes, en particulier pour les paires surjectives
et pour le schéma de récursion sur les entiers. Il faudrait donc étendre la β-réduction.
Pour mieux comprendre quelles sont les possibilités d’extensions duλ-calcul, un résultat
important est le théorème de Böhm : sur les λ-termes purs et β-normalisants, il n’y a
pas d’extension stricte consistante de la βη-conversion.
Cela suggère d’accompagner les extensions de la β(η)-réduction par des extensions
de la syntaxe du λ-calcul. Une possibilité, à la laquelle est consacrée cette thèse, est
d’étendre la β-réduction par des règles de réécriture opérant sur des λ-termes étendus
avec symboles algébriques, c’est-à-dire sur des termes de Λ(Σ). Nous voyons ensuite
comment adapter le λ-calcul typé à la réécriture, ce qui nous permettra de considérer
brièvement les combinaisons duλ-calcul et de la réécriture pour quelques exemples, dont
les paires surjectives et le schéma de récursion sur les entiers.
3.1 Réécriture au premier ordre
Dans cette section, nous rappelons les définitions concernant la réécritureau premier
ordre : termes algébriques, systèmes de réécriture algébriques et systèmes de réécriture
applicatifs. Nous donnons aussi quelques exemples de tels systèmes. La réécriture du
premier ordre usuelle est la réécriture sur les termes du premier ordre.
Définition 3.1.1 (TRS du premier ordre) Un TRS du premier ordre est un TRS
sur Ter(Σ,X).
Chapitre 3 Réécriture et lambda-calcul
Il est souvent utile d’isoler les symboles qui sont à la tête de règles de réécriture. Ils
sont dits « définis », alors que les autres symboles sont des « constructeurs ».
Définition 3.1.2 (Symboles définis et constructeurs) Soit R un TRS du premier
ordre sur Ter(Σ,X). Un symbole f ∈Σest défini dansR s’il existe une règle f(~l)7→
Rr.
Les symboles qui ne sont pas définis dansR sont desconstructeurs deR.
Voici une définition des booléens et des paires comme TRS du premier ordre.
Exemple 3.1.3 (Booléens) Les booléens sont définis parΣ
Bool=
def{true,false}. Il sont
éliminés par l’itérateuriter
Bool(_,_,_), qui est défini par le système de réécriture
iter
Bool(x, y,true) 7→
iterBoolx iter
Bool(x, y,false) 7→
iterBooly .
Le termeiter
Bool(u, v, b) correspond à la construction « ifbthenuelse v» des langages
de programmation. On peut la définir par les règles suivantes :
ite(true, x, y) 7→
itex et ite(false, x, y) 7→
itey .
Exemple 3.1.4 (Paires) Les paires sont construites par le symbole binaire(_,_) et
éliminées par les symboles unairesπ
1_ etπ
2_ définis par le système de réécriture
π
1(x, y) 7→
πx π
2(x, y) 7→
πy .
Parfois, il est aussi intéressant d’ajouter la règle suivante, dite de surjectivité, qui implante
une forme d’extensionalité pour le constructeur(_,_) :
(π
1t, π
2t) 7→
SPt .
Les termes du premier ordre contiennent aussi les termes applicatifs. Ainsi, un TRS sur
Ter(Σ
App,X) est aussi un TRS du premier ordre. Rappelons que les termes applicatifs
sur une signatureΣsont générés par la grammaire :
t, u∈ Ter(Σ
App,X) ::= x | f(t
1, . . . , t
n) | t u
oùx∈ X etf ∈Σ
n.
Exemple 3.1.5 (Fonction identité) Voici une définition de la fonction identité sur les
termes applicatifs :
id·x 7→
idx .
On aid·t→
idtpour tout t∈Λ(Σ).
Dans l’exemple3.1.5, on peut voir la variablexcomme étant une variable « du premier
ordre ». Mais avec un symbole d’application, on peut aussi avoir des variables ayant « une
sémantique d’ordre supérieur », c’est-à-dire qui ont « vocation » être substituées par des
« fonctions ».
3.1 Réécriture au premier ordre
Exemple 3.1.6 (Traitement des erreurs) On représente les « erreurs » par un
sym-bole err défini par la règle
err·x 7→
errerr .
On peut lui adjoindre la règle suivante, qui force les fonctions à être « strictes » vis-à-vis
de la propagation d’erreurs :
x·err 7→
stricterr .
Dans ce système, la variablex a une « sémantique d’ordre supérieur » : on peut avoir
err ←
idid·err →
stricterr .
Ainsi, lorsque l’on dispose d’un symbole d’application, les notions « syntaxiques » et
« sémantiques » de premier ordre ne coïncident plus. Dans le termex·err, la variablexa
une « sémantique d’ordre supérieur » (nous disons qu’elle est active), alors que le terme
x·err est syntaxiquement un terme du premier ordre : c’est un élément deTer(Σ
App,X).
La notion « sémantique » naturelle de termesdupremier ordre nous semble être celle
de terme algébrique, c’est-à-dire de terme applicatif sans variable active. Nous parlons de
termes au premier ordre pour désigner les éléments de Ter(Σ
App,X). Ils correspondent
à la notion syntaxique de premier ordre.
Définition 3.1.7 (Termes algébriques)
— Une variable xest activedans un terme t sit a un sous-terme la forme x u.
— Un terme applicatif estalgébrique s’il ne contient pas de variable active.
Les termes algébriques de Λ(Σ) ont une forme très agréable, ils sont construits selon
la grammaire suivante :
t ::= x | f(t
1, . . . , t
n)t
n+1. . . t
n+moù x∈ X,f ∈Σ
net m≥0. Les membres gauches des règles des systèmes de réécriture
que nous utilisons sont très souvent algébriques (bien que ce ne soit pas le cas de7→
strict).Définition 3.1.8 (Systèmes de réécriture applicatifs et algébriques) SoitR un
TRS sur L⊆Λ(Σ).
— On dit que R est algébrique à gauche (resp. à droite) si l (resp. r) est algébrique
pour toutl7→
Rr.
— On dit que R estalgébriques’il est algébrique à gauche et à droite.
— On dit que R est applicatif à gauche (resp. à droite) si l (resp. r) est applicatif
pour toutl7→
Rr.
Par exemple, le système 7→
errde l’exemple 3.1.6 est algébrique alors que le système
7
→
strictne l’est pas.
Un TRS algébrique sur Λ(Σ) est donc un TRS sur Ter(Σ
App,X). Lorsque que l’on
considère la relation de réécriture surΛ(Σ)issue d’un TRS applicatif, on obtient un TRS
qui n’est plus applicatif, mais qui conserve certaines propriétés intéressantes provenant
de sa parenté applicative.
Chapitre 3 Réécriture et lambda-calcul
Définition 3.1.9 Un TRS R est issu d’un TRS R
′si pour tout l 7→
Rr il existe une
substitutionσ et deux termesl
′7→
R′r
′tels quel=l
′σet r=r
′σ.
L’intérêt des TRS issus de TRS applicatifs est qu’ils préservent « l’applicativité » des
termes.
Proposition 3.1.10 Si Rest un TRS issu d’un TRS applicatif à droite, alors
(t∈ Ter(Σ
App,X) ∧ t→
Ru) =⇒ u∈ Ter(Σ
App,X) .
Il est possible d’avoir des fonctions définies en utilisant à la fois le symbole d’application
et des symboles de fonction d’arité non nulle. C’est ainsi que nous définissons les entiers
et les listes.
Exemple 3.1.11 (Entiers) Les entiers unaires de Peano sont construits par le symbole
0et le symbole unaire S(_). On pose Σ
Nat=
def{0,S(_)}.
Par exemple, la fonction « strictement supérieur », des entiers vers les booléens, peut
être représentée par le symbole> et les règles suivantes :
> 0 y 7→
>false
> S(x)0 7→
>true
> S(x)S(y) 7→
>> x y .
On peut définir la soustraction entière sur la signatureΣ
minus=
defΣ
Nat∪{minus}par les
règles suivantes :
minusx 0 7→
minusx
minus0 y 7→
minus0
minus S(x)S(y) 7→
minusminusx y .
Elles peuvent être complétées par les règles non-linéaires suivantes :
minusx x 7→
minus0 minus S(x)x 7→
minusS(0) .
Exemple 3.1.12 (Listes) Les listes que nous utilisons sont construites sur la signature
Σ
List=
def{[ ],(_::_)}, où[ ]représente la liste vide et(x::xs) représente la listexssur
laquelle est empilé l’élémentx. Voici quelques opérations de base :
car(x::l) 7→
carx
car[ ] 7→
carerr
cdr(x::l) 7→
cdrl
cdr[ ] 7→
cdrerr
getl 0 7→
getcarl
getlS(n) 7→
getget(cdrl)n
length[ ] 7→
length0
length(x::l) 7→
lengthS(lengthl)
Cependant, dans beaucoup d’utilisations des termes applicatifs, l’application est le seul
symbole d’arité non nulle. Ce sont des systèmes curryfiés.
3.1 Réécriture au premier ordre
Exemple 3.1.13 (Curryfication) On peut faire correspondre aux termes surΣ
Natet
Σ
Listrespectivement un sous ensemble des termes construits sur les signatures(Σ
NatC)
Appet(Σ
ListC)
App, où
Σ
NatC=
def{0
C,S
C} et Σ
ListC=
def{nil,cons} .
Par exemple,
S(0) correspond à S
C·0
Cet (S(0) :: [ ]) correspond à (cons·(S
C·0
C))·nil
La traduction canonique deTer(Σ
Nat∪Σ
List,X)versTer((Σ
NatC∪Σ
ListC)
App,X)
s’ap-pelle curryfication. Nous l’étudions de façon plus précise au chapitre 8.
Remarque 3.1.14 (Fonctions strictes) Le système7→
err∪strictsemble avoir des
carac-téristiques intéressantes pour les systèmes curryfiés : les fonctions définies par des
sys-tèmes curryfiés confluents dont la combinaison avec 7→
err∪strictreste confluente peuvent
être vues comme des fonctions strictes vis-à-vis de la propagation des erreurs.
C’est le cas, pas exemple, de la version curryfiée du système présenté à l’exemple3.1.3:
ite
C·true·x·y 7→
iteCx ite
C·true·x·y 7→
iteCy .
Un exemple de fonction non stricte est la fonction eatdéfinie par la règle
eat·x 7→
eateat.
On alors un pic injoignable :
err ←
stricteat·err →
eateat.
Une telle caractérisation des fonctions strictes serait plus difficile avec des systèmes du
premier ordre. En effet, les règles prenant en compte err dépendraient de la signature :
on aurait une règle
f(x
1, . . . ,err, . . . , x
n) 7→ err
pour chaque f ∈Σ
net chaque i∈{1, . . . , n}.
Ainsi, le symbole d’application donne aux systèmes curryfiés, ou de manière plus
géné-rale aux systèmes au premier ordre, une forme différente de celle des systèmes du premier
ordre. En particulier, dans le système 7→
idde l’exemple 3.1.5, le symbole d’application
est un symbole défini au sens de la définition 3.1.2, alors que le symbole idne l’est pas.
Une notion plus générale de symbole défini semble nécessaire.
Définition 3.1.15 (Symboles définis et constructeurs algébriques) Soit R un
système algébrique à gauche sur Λ(Σ). Un symbolef∈Σestalgébriquement défini parR
s’il existe une règle de la formef(~l)~l
′7→
Rr. Les symboles qui ne sont pas algébriquement
définis dans R sont desconstructeurs algébriques de R.
Chapitre 3 Réécriture et lambda-calcul
La notion de règle effondrante joue un rôle important dans l’étude de la combinaison
de relations de réécriture.
Définition 3.1.16 (Règle effondrante) Une règle de réécriture l7→ r esteffondrante
sir est une variable.
Voyons enfin un exemple utilisant des variables actives dans les membres droits.
Exemple 3.1.17 (Itérateurs et récurseurs pour les entiers) Il existe des
élimi-nateurs canoniques pour les entiers, ce sont l’itérateur et le récurseur. Ces systèmes de
réécriture sont applicatifs mais pas algébriques : ils ont une « sémantique d’ordre
supé-rieur » tout en étant, syntaxiquement, des systèmes du premier ordre.
(i) L’itérateur iter est défini par les règles suivantes :
iter u v 0 7→
iteru iteru vS(n) 7→
iterv(iteru v n) .
Notons que dans la seconde règle, le terme vn’a pas d’accès direct au termenqui
est en train de se faire éliminer. De ce fait, iter ne permet pas de coder certains
algorithmes, comme par exemple le calcul du prédécesseur en temps constant.
(ii) Lerécurseur recest défini par les règles suivantes :
recu v 0 7→
recu recu vS(n) 7→
recv(recu v n)n .
C’est le système de réécriture sous-jacent au système T de Gödel (voir 3.7.2). Les
fonctions calculées par les systèmes rec et iter sont les mêmes, bien que certains
algorithmes exprimables dans recne le soient pas dans iter, comme par exemple le
calcul du prédécesseur en temps constant.
Dans le document
Définitions par réécriture dans le lambda-calcul : confluence, réductibilité et typage
(Page 60-68)