• Aucun résultat trouvé

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→

R

r.

À un TRS (L,R) on associe l’ARS (L,→

R

) où

R

est 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→

R

r.

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

=→

, oùRρ=

def

{(lρ, rρ) | l7→

R

r}.

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

R

r.

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→

iterBool

x iter

Bool

(x, y,false) 7→

iterBool

y .

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→

ite

x et ite(false, x, y) 7→

ite

y .

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(_,_) :

1

t, π

2

t) 7→

SP

t .

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→

id

x .

On aid·t→

id

tpour 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→

err

err .

On peut lui adjoindre la règle suivante, qui force les fonctions à être « strictes » vis-à-vis

de la propagation d’erreurs :

x·err 7→

strict

err .

Dans ce système, la variablex a une « sémantique d’ordre supérieur » : on peut avoir

err ←

id

id·err →

strict

err .

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+m

où x∈ X,f ∈Σ

n

et 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→

R

r.

— 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→

R

r.

Par exemple, le système 7→

err

de l’exemple 3.1.6 est algébrique alors que le système

7

strict

ne 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→

R

r 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→

R

u) =⇒ 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→

minus

x

minus0 y 7→

minus

0

minus S(x)S(y) 7→

minus

minusx y .

Elles peuvent être complétées par les règles non-linéaires suivantes :

minusx x 7→

minus

0 minus S(x)x 7→

minus

S(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→

car

x

car[ ] 7→

car

err

cdr(x::l) 7→

cdr

l

cdr[ ] 7→

cdr

err

getl 0 7→

get

carl

getlS(n) 7→

get

get(cdrl)n

length[ ] 7→

length

0

length(x::l) 7→

length

S(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Σ

Nat

et

Σ

List

respectivement un sous ensemble des termes construits sur les signatures(Σ

NatC

)

App

et(Σ

ListC

)

App

, où

Σ

NatC

=

def

{0

C

,S

C

} et Σ

ListC

=

def

{nil,cons} .

Par exemple,

S(0) correspond à S

C

·0

C

et (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∪strict

semble 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∪strict

reste 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→

iteC

x ite

C

·true·x·y 7→

iteC

y .

Un exemple de fonction non stricte est la fonction eatdéfinie par la règle

eat·x 7→

eat

eat.

On alors un pic injoignable :

err ←

strict

eat·err →

eat

eat.

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 ∈Σ

n

et 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→

id

de 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→

R

r. 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→

iter

u iteru vS(n) 7→

iter

v(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→

rec

u recu vS(n) 7→

rec

v(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.