Attention . Il faut bien prendre garde à ne pas changer le sens d’une fonction lors de la substitution.
Par exemple (λy.x y)[x:= z] = λy.z y, mais si l’on applique naïvement la même substitution à
(λz.x z), on obtient λz.z z ce qui n’est plus du tout la même chose ! Pour éviter ce genre de problème,
on renomme λz.x z en λz0.x z0(par exemple) avant d’aller substituer xpar z.
On remarque que le langage est fortement indéterministe. En effet, à chaque pas, on peut
choisir d’appliquer la règle n’importe-où dans le terme.
Exercice 3. Exécutez les programmes suivant pas à pas selon la stratégie de votre choix.
–λx.x
–(λx.x) (λy.y)
–(λf.λx.ffx) (λy.y)
–(λx.λy.x) (λz.z) (λz.z z)
Ces termes ne sont pas très excitants. Church a montré comment on pouvait à proprement
parler programmer avec ce langage, en encodant la plupart des constructions de base des
langages actuels. Voyons deux exemples : (if ... then ... else) et les entiers.
Exercice 4. On décide d’appeller true le terme λx.λy.xet false le terme λx.λy.y. Écrivez une
fonction qui prend trois arguments : c,aet b, et qui se comporte comme if cthen aelse b.
Voyons à présent comment encoder les entiers.
Exercice 5 (Entiers de Church).On encode l’entier npar le terme λo.λs.s(s···(s o)···)où s
apparaît nfois. Écrivez les encodages des entiers 0,1et 2. Écrivez les fonctions successeur, addition et
multiplication pour cet encodage des entiers.
Jusqu’à présent, tout se passe bien, ce qui est surprenant pour un langage aussi puissant.
Voyons un cas problématique.
Exercice 6.
1. Exécutez le terme (λx.x x) (λx.x x)que nous appellerons Ω. Qu’observez-vous ?
2. Exécutez le terme (λx.λy.y)Ω(λz.z)selon la stratégie de votre choix. Que se passe-t-il ? Quelle
est la stratégie adoptée par la plupart des langages de programmation ?
Pour illustrer ce dernier point, voici deux sessions interactives. Une dans l’interpréteur du
langage , l’autre dans celui du langage .
Welcome to MzScheme v4.1.4 [3m], Copyright (c) 2004-2009 PLT Scheme Inc.
R5RS legacy support loaded
> (define (omega) (omega))
> ((lambda (x y) y) (omega) 42)
L’interpréteur boucle sans fin.
GHCi, version 6.10.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> let omega () = omega ()
Prelude> (\x y -> y) (omega ()) 42
42
Prelude>
3