1 TDs de λ-calcul Je recommande en lecture parallèle du TD, le polycopié de cours sur le λ-calcul. 2 Grammaire N ={S } atomes X ={ λ , ,}∪{variales }∪{ constantes } S→x S → (S S) S → (λxS) x ∈ (atomes) application abstraction x ∈ (variables) variables : x,y,z,a,b,c … constantes : S,K,I,... λ-termes : A,B, … M,N,P,... X,Y,Z 3 Règles de déparenthésage (1) l'application associe à gauche XYZ=(XY)Z ≠ X(YZ) (2) l'abstraction associe à droite λx λy Z = λx ( λy Z ) (3) application prioritaire sur l'abstraction λx Y Z = λx ( Y Z ) ≠ ( λx Y ) Z (4) suppression des parenthèses externes Remarque (3) → la portée (ou champ) d'une abstraction s'étend ✔ ✔ jusqu'à la fin de l'expression en l'absence de parenthèses jusqu'à la parenthèse fermant l'expression contenant le λ sinon exemples de portées : λx λy ((λz z) x) y x λx x (λu λy y x (λz z)) x y 4 Variables libres et liées Une occurrence x est liée dans un terme si elle est dans le champ de λx. sinon elle dite libre Liée par le λy le plus immédiatement à gauche Libre en vert y (λy λx λy y x) x z occurrence liée occurrence libre Variable libre : au moins 1 occurrence libre de x, y, z Variable liée : au moins une occurrence de liée : x, y 5 exercice 1 ------------- application associe à gauche abstraction associe à droite application prioritaire sur abstraction parenthèse externe 5.1 Question 1 a) ( λx ( x (λy ( y x ) ) ) ) b) ( (λx x) (λy ( y x ) ) ) c) ( λx ( ( x (λy y) ) x ) ) d) ( ( (λx x) (λy y) ) x ) e) ( λx ( x ((λy y) x ) ) ) f) ( (λx x) ((λy y) x ) ) g) ( λx ( x ( λy y)) ) x ) h) ( λx ( λy ( λz ((x y) z) ) ) ) 5.2 Question 2 h( ( (λx (λy (y x))) (λx x) ) ( λx (x x)) ) ( (λx (λy (y x))) (λx x) ) ( λx (x x)) ( (λx (λy y x)) (λx x) ) ( λx x x ) ( (λx λy y x ) (λx x) ) ( λx x x ) (λx λy y x ) (λx x) ( λx x x ) N.B : dès qu'une parenthèse limite la porté d'un λ alors on ne peut pas l'enlever i( λx ( ( λy (x y)) (λy (y x)) ) ) λx ( ( λy (x y)) (λy (y x)) ) λx ( ( λy x y ) (λy y x ) ) λx ( λy x y ) ( λy y x ) 6 Substitution [ N/x ] M ≡ substituer les termes N aux occurrences libres de x dans M variable : [N/x] x = N [N/x] y = y si x≠ y application : [N/x] (M P) = ( [N/x] M ) ( [N/x] P ) abstraction : [N/x] (λx M) = λx M [N/x] (λy M) = λy( [N/x] M ) puisqu'il n'y a pas d'occurrences libres de x dans λx M si x ≠ y et y non libre dans N: soit y n'apparait pas dans N soit toutes les occurrences de y dans N sont liées N.B : Si y est libre dans N, on ne peut pas faire directement la substitution [N/x] (λy M) [ y z /x ] ( λy x ) ≠ λ y ( [ y z / x ] x ) = λy y z Capture de la variable y ! Elle n'est plus libre alors qu'elle le devrait. 7 contractions Introduction : j'ai une expression : 2 + 3 . Si je la calcul je réduit en 5. Il y a une différence syntaxique entre : 5 et 2 + 3 mais égalité sémantique (sens). En λ-calcul on peut réduire des expressions ainsi tout en conservant le sens … 7.1 α-contraction : renommage des variables liées α L' α-contraction est noté ⇒ c'est un renommage des variables liées. α: α ⇒ λy ( [y/x] M ) λx M est une α-contraction avec y étant une variable non utilisé Exemple : λx x z α ⇒ λy [y/x] x z = λy y z capture α ⇒ λz [z/x] x z = λz z z 7.2 β-contraction paramètre formel corps β β : λx M N ⇒ [ N / x ] M fonction arguments L'argument (ou paramètre réel) est substitué au paramètre formel dans le corps de la fonction On peut faire le parallèle avec un appel de fonction. Les paramètres lors de l'appel remplace les arguments. 7.3 η-contraction η: λx M x η M si x non libre dans M ⇒ ça ressemble à une β-contraction : λx M x → [x/x] M ≡ M car x ∉ M Exemple 1 : λx y x η ⇒ y car x non libre dans y M On vérifie : β ⇒ [A/x] yx = yA η (λx y x) A ⇒ y A (λx y x) A yA=yA les termes λx y x et y, considérés comme fonctions, produisent le même résultat lorsqu'on les applique à un argument quelconque. Exemple 2 : η λx x x ⇒ x car x libre dans x M (λx x x) A xA=xA β ⇒ AA α ⇒ est réflexive, symétrique et transitive. λx x α ⇒ λx ([x/x] x) = λx x λx x α α ⇒ λy y ⇒ λx x β ⇒ et (λx x) a a η ⇒ ne sont ni réflexive, ni symétriques et ni transitives. β ⇒ a β ⇒ (λx x) a Ces propriétés sont utiles pour les calculs donc on étend les contractions en réductions en leurs ajoutant ces propriétés : On a 2 extensions utiles : ✔ ✔ réduction (noté →) fermeture contextuelle, réflexive et transitive des α, β, η-contractions On peut travailler sur des sous-expressions ✔ ✔ l'équivalence (ou égalité ou conversion) notée = fermeture symétrique de la réduction Exemple : (λx x) y → y mais y → (λx x) y (λx x) y = y et y = (λx x) y (λx x) y = (λzy) a (λx x) y → y donc (λx x)y = y (λz y) a → y donc (λz y)a = y donc y = (λz y)a (λx x)y = (λz y)a Remarque : substitution et α-conversion [y/x] λz z x = λz z y car z non libre dans y [y/x] λy y x ≠ λy [y/x] y x = λy y y = [y/x] λz [z/y] y x = [ y/x] λ z z x = λz [y/x] z x on a α-convertit en renommant la variable liée y =λzzy Forme normale : β λx x λy y x ⇒ [ λy y x/ x]= λy y x M N En gros la forme normale c'est quand peut plus faire de β-contraction La Fn de (λx x ) (λy y x) est λy y x 7.4 Exercice 2 a) λx x λy y x est en forme normale (f.n). Pas de contraction possible, car si on parenthèse complétement : ( λx ( x (λy (y x)) ) ) on ne trouve pas de redex : (λx M) N. β b) λx x λy y x ⇒ λy y x M N On pourrait être tenté de faire une β-contraction sur (λy y x) en premier mais non! Entièrement parenthésé cela donne : (λy (y x)) qui n'est pas un β-radical : (λx M) N c) λx x λy y x est en forme normale. On ne trouve pas de redex dans sa forme entièrement parenthésé : λx ((x (λy y)) x) β β d) λx x λy y x ⇒ [ λy y/ x] x x = λy y x ⇒ x M N forme entièrement parenthésé : (((λx x) (λy y)) x) l'application associe à gauche. β e) λx x λy y x ⇒ λx x x M N On s'arrête car λx x x n'est pas un redex. En effet si on reparenthésé avec les bonnes priorités on a : λx (x x) β β λx xλy y x ⇒ λx x x⇒ x f) M N ou encore un autre chemin est possible : β λx x λy y x →[λy y x/ x] x= λy y x ⇒ x M N On obtient bien le même résultat. Ceci est une propriété très importante du λ-calcul on sait que pour deux β-réduction différentes on pourra trouver par contraction successives le même résultat à une α-conversion près. g) λx x λy y x →[ x/ x] x λy y= x λy y M 2) N λx λy y x λx x λx x x h) β M N ⇒ [ λx x / x ] λy y x λx x x = λy y λx x λx x x M β ⇒ [ λx x x/ y] y λx x=λx x x λx x M N N β ⇒ λx x λx x β ⇒ λx x β i) λx [λy x y λy y x ] ⇒ λx x λy y x M N Réduire : λ x1 … λ xn M A1 … Am n paramètres m arguments β La portée de la substitution va jusqu'à la fin de l'expression ou des parenthèses ( λx 1 ( λx 2 … λx n M ) A1 ) A2 … Am ⇒ M N β ([ A1 / x1 ] λx 2 … λ x n M ) A2 … Am = ( λx 2 ( … λ x n [ A1 / x1 ] M ) A2 ) … Am ⇒ β ([ A2 / x 2 ] λx 3 … λ xn [ A1 / x 1 ] M ) A3 … Am = ( λx 3 … λ x n [ A1 / x1 , A2 / x2 ] M ) A3 … Am ⇒ 1er cas: n = m Même nombres de parenthèses et d'arguments * λx 1 … λx n M A1 … An ⇒ [ A1 / x1 … Am / x n ] M 2eme cas : n < m Moins de paramètres que d'arguments * λx 1 … λx n M A1 … An An1 … Am ⇒ [ A1 / x 1 … An / x n ] An1 ... Am Il reste donc des arguments 3eme cas: n > m Plus de paramètres que d'arguments * λx 1 … λx m λx m1 … λx n M A1 … Am ⇒ λx m1 … λx n [ A1 / x 1 … Am / x n ] M Il reste donc des paramètres 7.5 Exercice 3 Théorème de Church : X Si X → Y et X → Z alors il existe U tel que Y → U et Z → U. Y Autrement dit les β-contractions mènent à la même forme normale, à une α-conversion près. U On appelle aussi cette propriété confluence. L'exercice : λy (λx (λy x) (λx x) x ) y β (1) β (3) η (2) λy (λz y) (λx x) y λx (λy x) (λx x) x λy (λx x x) y β α (4) λy y y β M N λz y λx x α-conv pour ne pas capturer y | pas de substitution x est liée β y λy λz λx x x α α (1) η λy y y λy ( λx λy xλx x x y )⇒ λy ( λx x y ⇒ λy y y pas d'occurrences de z η N λy λz yλx x y ⇒ car y libre dans M M η (2) λy λx λz x λx x x y ⇒ λx λy x λx x x car y non libre dans M M β (3) λy λx λy x λx x x y ⇒ λy λx x x y M (4) N α | x/y λy λz yλx x y ⇒ α | y/z Z λxλz x λx x x ⇒ λx λy x λx x x y) (λt (λx t x) t ) x β (1) η (3) β (2) (λz x z) x (λt ( t t ) ) x β η β xx xx xx η (λt t t) x α xx t libre dans t β x/ t ] λz t z x = λz x z x (1) ( λt λx t xt x ) ⇒ [ x/ t ] λx t x [ x /t ]t = [ évite la capture (2) β λt ( λx t xt ) x ⇒ λt ( t t ) x η ( λt λx t x t ) x ⇒ car t libre dans M M (λx λy x y) (λx y y x) β λy (λx λy y x) y η β λy λz z y λx λy y x α(1) x/y z/y (1) λy λz z y ⇒ λx λz z x ⇒ λx λy y x η (λx x) (λx λy y x) β λx λy y x 8 Parallèle avec Ocaml λ-calcul : Ocaml : ou encore : FONC ≡ λf1 λf2 f1 f2 let fonc f1 f2= f1 f2 let fonc= fun f1-> fun f2-> f1 f2 Les abstractions sont les définitions de fonctions et les applications, les applications de fonctions... L'application associe à gauche tout comme l'application de fonction caml : ( ((fonc a) b) c ) ici la fonction est appliqué aux arguments a b c. Idem pour l'association à droite. 9 Complétude combinatoire Soient X 1 … X n , M , des termes clos (pas de variables libres) quelconques. On peut toujours trouver au moins une fonction qui appliqué aux arguments X 1 , … résultat M . Cette fonction peut utiliser ou non ses arguments. minuscule: variables majuscules: termes clos (pas de variables libres) 9.1 Exercice 4 Regarder la dernière page du polycopié de cours sur le λ-calcul. Fichier : "poly cours lambda calcul.pdf" 9.1.1 Question 1 trouver P /P X Y Z → Y X Y inconnue: P X,Y,Z : termes clos quelconques 1ere solution : P = λx λy λz y x y on vérifie : P X Y Z= λx λy λz y x y X Y Z β ⇒ λy λz y X yY Z β ⇒Y X Y 2nd solution : P' = λx λy λz Y X Y P' X Y Z = (λx λy λz X Y Z) X Y Z = Y X Y 3éme solution : p'' = λx λy λz Y x y X n , renvoie le Les autres solutions : Q/QXY→A Q = λx λy A R/ R XY Z → Z R = λx λy λz z R' = λx λy λz Z S/S X → λt X A t S = λx λt x A t S' = λx λt X A t T/ T X Y → X ( λz Y X ) T = λx λy x (λz y x) ... U / U X → X (λz z) A U = λx x (λz z) A U' = λx X (λz z) A 9.2 Exercice 5 T = λx λy x y F = λx λy y x Not = .. IF = … clos ∧ B T F NOT IF OR AND → True False ¬ … if or and imp On aura une bonne représentation de B si les λ-termes se comportent comme les opérateurs booléens (normalement on souligne les opérateurs du λ-calcul dans le cours) 9.2.1 Not : Dans B: ¬True = False ¬False = True Dans ∧ : NOT T =λv v λx F λx T T M N =T λx F λx T =λx λy x y λx F λx T =λx F λx T =F ( pas de var libre dans F ) A rajouter : un parallèle avec caml 9.2.2 IF Dans B: if TRUE A B = A if FALSE A B = B Dans ∧ : IF T A B = ( λv λa λb v (λx a) (λx b ) T A B = T(λx A) (λx B) =(λx λy x y) (λx A) (λx B) =(λx A) (λx B) =A 9.2.3 Représentation du OR Dans B : A ∨ B = if A True B Dans ∧ : OR A B = IF A T B OR = λa λb IF a T b OR T T = IF T T T = T OR T F = IF T T F = T 9.2.4 AND Dans B: a and b = if A B False = ¬¬ A∨¬B Dans ∧ : AND A B = IF A B F = NOT(OR (NOT A) (NOT B)) AND = λa λb IF a b F = λa λb NOT ( OR ( NOT a) (NOT b)) 9.2.5 Implique Dans B : A → B = ¬ A∨B Dans ∧ : IMP A B = OR (NOT A) B IMP = λa λb OR (NOT a) b 9.3 Exercice 6 9.3.1 Termes solvables Donner un sens aux termes du λ-calcul : représenter les fonctions calculables. ℕ , ℕ → ℕ , ℕ x ℕ , ℕ x ℕ → ℕ … 1ére idée : ✔ Forme normale (on rappel qu'elle est unique) Si le terme a une F.N, elle représente le résultat du calcul sinon le terme ne représente pas une fonction calculable. ✔ Trop restrictif : l'opérateur de point fixe Y = λF (λx F(xx)) (λx F(xx)) n'a pas de F.N, et cependant il permet d'exprimer la récursivité, les boucles 2nd idée fonction : Un terme M représente une fonction si, appliqué à des arguments il produit un résultat en F.N. Dans un 1er temps, on impose résultat = λx x = I cette contrainte n'est pas restrictive , car on montre : M solvable ≡ ∀ P ∃ p et Y 1 …Y p tel que M Y 1 …Y p =P Démonstration : ✔ M solvable ⇒ ? ∃ p ,Y 1 …Y p tel que M Y 1 …Y p =P ✔ M solvable ⇒ ∃n X 1 … X n tel que M X 1 … X n = I → M X 1 … X n P=I P=P → ∃ p =n1 , X 1 =Y 1 , … X n =Y n , X p = p tel que M X 1 … X p =P ∀ P ( ∃ p ,Y 1 …Y p tel que M Y 1 …Y p =P ) ? ⇒ M' solvable Prenons P = I dans ∃ p ,Y 1 …Y p tel que M Y 1 …Y p =I donc M solvable 3éme idée : Fnt close (forme normale de tête) tête: pas une sous expr M est en F.n.t s'il s' écrit pas necessairement en F.n ou F.n.t λ x1 … λ x n x A1 … A p peut être ou non un des x i Traduction Ocaml : fun x 1 ->… -> fun xn -> x A1 … A p n∈ℕ , p∈ℕ La variable x est appelé variable de tête. Un terme clos ne contient pas de variables libres. Une F.n.t close ne contient pas de variables libre donc elle commence forcement par un lambda, et x appartient forcement à un λx i . Exemple : (n=3, p=0 ) fun x -> fun y -> fun z -> z λx λy λz z en F.n.t x x((λx y)a) (λx y) a λx y a est en F.n.t (n=0, p=0 ) en F.n.t (n=0,p=1 ) n'est pas en F.n.t ((fun x → y) a) on aurais voulue (fun x → y a) par exemple en F.n.t pas d'arguments A Y n'a pas de F.n Y a une infinité de F.n.t. Y =λ F ( λx F ( x x ) λx F x x ) M N β ⇒ λ F F λx F xxλx F x x en F.n.t close tête β ⇒ λ F F F λx F xx λx F x x en F.n.t close tête On montre : M est en F.n.t close → M solvable M en F.n.t close → M =λ x1 … λ xn xi A1 … A p i∈1… n Traduisons M en caml : let fonc x1 x2 … xn = xi a1 … ap On veut que fonc renvoie la fonction identité (par exemple let id x = x) Pour cela il faut que la fonction xi renvoi id d'où : let xi a1 … ap = id maintenant pour être sur que fonc renvoie id il faut lui donner xi à tous ses arguments fonc xi … xi Formellement : M =λ x1 … λ xn xi A1 … A p i∈1… n → M λ y1 … λ y p I ... λ y 1 … λ y p I → fonc xi prend p argument n arguments de fonc =λ x 1 … λ x n x i A1 … A p λ y1 … λ y p I ... λ y 1 … λ y p I =λ y 1 … λ y p I A' 1 … A ' p =I n fois Car I est clos. 9.4 Termes séparables On a 2 λ- termes ayant un fnt clos Ces 2 termes représentent-ils la même fonction ? ✔ ✔ s'ils ont une F.n close il suffit de calculer leur F.n et de les composer ( à une α-conversion près ) s'ils ont seulement un F.n.t close, mais pas de f.n ils peuvent avoir une propriété de F.n.t , et il n'est donc pas possible en général de comparer les F.n.t Intuitivement M et N sont séparables si on peut trouver des arguments X 1 … X n tels que M et N appliqués à ces arguments produisent des résultats différents. Pour la définition on prendra : T = λx λy x F = λx λy y 1er exemple : M = T, N = F ∃n=0 tel que T =T , F =F 2nd exemple : M = λx λy x y N = λx λy y x ✔ ✔ n=0? non car M ≠T , N ≠F n=1? Trouver un terme clos X tel que M X = T et N X = F Résoudre le système : { { λx λy x y X =T λx λy y x X =F ≡ ?X MX =T NX =F ≡ ?X { λy X y=T (1) λy y X =F (2) ?X On résout (1) : λy X y = λx λy x α-conv possible car X clos : λx X x = λx λy x X x = λy x 2 solutions : X = λz λy x X = λz λy z non clos donc on l'élimine ok On remplace X par λz λy z dans (2) : ? λx λy y x λz λy z= λx λy y ? λy y λz λy z = λx λy y ≠en fn en fn ✔ n=2? MXY = T VXY = F ?X,Y ≡ (λx λy xy) X Y = T (λx λy yx) XY = F { XY =T 1 YX =F 2 ? X ,Y on résout (1) : XY = T 2 solutions simples : X = λz T X = λz z avec Y quelconque (a priori plus intéressant car Y non instancié) avec Y = T on remplace X par λz T dans (2) Y( λzT) = F 1 solution évidente : Y = λz F Donc on a trouvé n = 2, X 1=λz T , X 2= λz F Donc M et N sont séparables tel que M X 1 X 2 =T et N X 1 X 2 =F 10 Feuille 2 Représentation "personnelle" des booléens B ∧ Deux éléments distincts : TRUE et FALSE Deux termes clos séparables quelconques : T F NOT et IF : sera -t-il toujours possible de trouver NOT et IF ∀ T et F séparable ? opérateurs : ¬ si alors sinon termes separables quelconques M et N séparables alors ∃ X 1 … X n tel que M X 1 … X n= F et N X 1 X n =T On sait M X 1 … X n= λx λy y N X 1 … X n= λx λy x On veut NOT T = F NOT F = T Donc il suffit de prendre NOT V =V X 1 … X n il reste à trouver n , X 1 … X n en résolvant un système d'équations 10.1 Exercice 1 T = λx x et F = λx λy y On prend ✔ NOT V =V X 1 … X n n=0? NOT V = V NOT T = F NOT F = T ✔ ↔ n= 1 ? NOT T = F NOT F = T NOT ? insoluble NOT V = VX TX=F FX=T ?X (1) à une solution : (2) est résolue donc T=F F=T X =F λy y = T ?X X=F (1) (2) λx λy x NOT V = V F NOT = λv v F On cherche IF ( représentation de si alors sinon) On veut IF T A B = A IF F A B = B IF? On prend ✔ IF V A B=V X 1 … X n A B n=1? IF V A B = V X A B (1) ↔ T X A B = A FXAB=B ↔ ?X ✔ XAB=A A B = B → insoluble ?X n=2? IF V A B = V X Y A B (1) ↔ TXYAB=A FXYAB=B ↔ ?X,Y XYAB=A YAB =B ? X,Y X = λy λa λb a 1 solution évidente : Y = λa λb b donc IF V A B=V λy λa λb a λa λb b A B IF V =V λy λa λb a λa λb b F IF =λv v λy λa λb a λa λb b IF =λv λa λb v λy λa λb a F a b λv λa λb ( v λy λa λb a F a ) b forme etat-reduite forme etat-expensée M 10.2 Exercice 2 T = λx λy x y x F = λx λy y y y Remarque : en position de fonction TXY=XYX FXY=YYY fonction Donc on doit pouvoir construire tous les opérateurs avec n = 2 On cherche NOT (1) NOT T = F NOT F = T ?NOT on définit NOT V = V X Y (1) ↔ TXY=F FXY=T ? X,Y ↔ XYX=F YYY=T ? X,X 1 sol évidente X = λy λx F Y = λy λz T Donc NOT = λv v ( λy λx F) (λy λz T) Résolution d'équations en λ-calcul A≠ B X A = B → 1 solution X = λx B ?X X A = A → 2 solutions X = λx A ?X X = λx x X Y = A → 2 solutions "simples" ?X,Y X = λx A et Y non instancié X = λx x et Y = A → 1 infinité d'autres solutions : X = λy Z y T et résoudre Z Y T = A ? Z,Y,T Donc résoudre une équation → très simple en général 1 système d'équations → trouver une solution commune heuristique : commencer par l'équation qui impose le plus de contraintes sur ses solutions, ou par l'équation la plus complexe. 0 : ℕ succ : ℕ → ℕ n → suc(n) pred : ℕ → ℕ 0→0 succ(n) → n zero : ℕ → B n → ( n=0 ?) Système numérique = représentation de ℕ { 0 , succ, pred, zero } ∀ n∈ℕ succ(n) = succ bar n pred 0 = 0 pred (suc(n)) = n zero 0 = π (0) (1) (2) (3) zero (succ(n)) = F (4) Donc 3 4 sont une représentation de B bar π noté T = λx λy x bar F noté F = λxλy y 1er exemple : Le système de Church vu en cours noté { 0, succ, pred, zero } 2eme exemple : { 0, succ, pred, zero } 0 = λx x succ = λn λx x F n pred = ? zero = ? 1 représentation n de tout entier n cette représentation doit vérifier (0) ✔ 0 = Recherche de la solution 0 0 fois Tout les trucs soulignés en double reste souligné en double même si pas noté : ℕ 1 = succ(0) pour vérifier (0) = def β succ 0 = (λn λx x Fn) 0 = λx x F 0 1 fois 2= succ1=succ 1= λn λx x F n1=λx x F 1= λx x F ( λx x F 0 ) 2 fois Attention ya des n qui devraient souligné reprendre le td de quelqu'un Introduisons une notation pour pouvoir représenter l'itérateur n : n W x=( W ( W ... (W x ) ) ) n fois On propose donc : n =λx x F n 0 On prouve que cette représentation vérifie (0) c-a-d : suc(n) = succ n succ(n) =λx x F succ n 0= λx x F n1 0 pas de β-radical succ n= λn λx x F nn définition de succ β-réduction =λx x F n n définition de n =λx x F λx x F 0 n1 = λx x F ( λx x F ( …( λx x F 0 ) ... ) )= λx x F 0 nfois Donc n+1 fois On recherche une représentation zero de zero qui vérifie zero 0 =T zero succ(n) = F (3) (4) Dans ℕ : 0≠succ n Dans ∧ : 0 et succ(n) sont des représentants de 0 et de succ(n) donc ils sont séparables donc il existe n , X 1 … X n tels que : 0 X 1 … X n =T et succn X 1 … X n =F Donc il suffit que zero applique son argument aux bons X 1 … X n pour produire T et F On définit donc zero N =N X 1 … X n reste à trouver n , X 1 … X n { zero 0=T zero succ n=F ↔ ? zero ✔ { 0 X 1 … X n=T 5 succ n= X 1 … X n =F 6 ?n, X 1… X n n=1? (5) ≡ 0 X = T ≡ (λx x) X = T ≡ X=T On remplace X par T dans (6) succ(n) T = F ≡ succ n T = F ≡ (λn λx x F n) n T = F ≡ T F n = F ≡ (λx λy x) F n = F ≡ F = F Donc (6) résolue avec : zero N = N T zero = λn nT= λn n (λx λy x) 10.3 Question 3 On cherche une représentation pred de pred qui vérifie pred 0 = 0 pred succ(n) = n (1) (2) Soit pred N =N X 1 … X n On cherche ✔ n , X 1… X n n=1? pred N = N X On résout (1) (1) pred 0=0 X = λx x X = X =0 On remplace X par 0 dans (2) pred suc(n) = suc(n) 0 = succ n 0 = (λn λx x F n) n 0 = 0 F n = F n (2) impossible =λx λy yn=λy y= n ✔ n=2? pred N =N X Y (1) pred 0=0 XY = X Y = 0 (4) (2) pred suc n=suc n X Y =succ n X Y = X F n Y = n (5) On résout (5) X F n Y = n → 1 solution X F = T → 1 solution X = λx T non solution de (4) → 1 solution "sémantique"; X = NOT, Y non instanciée On remplace X par NOT dans (4) NOT Y = 0 (λv v F T )Y = 0 Y F T = 0 → 1 solution simple : Y = λx λy 0 donc zero N = N T zero = λn n T = λn n (λx λy x) Donc pred = N NOT (λx λy 0) pred = λn n NOT (λx λy 0) Vérification : pred 0 = (λn n NOT ( λx λy 0)) 0 = 0 NOT (λx λy 0) = NOT (λx λy 0 ) = (λv v F T ) (λx λy 0) = (λx λy 0) F T = 0 10.4 Exercice 2 : le système numérique de Church Axiomes : 0 = λ F λx x succ = λn λF λx F(nFx) théorèmes { n n=λF λx F x n n est un itérateur n F x= F x *= λF λx λy F x , y 10.4.1 Question 1 On montre que P = λn λm n m est une représentation de puissance dans ℕ ℕ m^n est noté puis n m , x*y noté * x y définition récursive puis 0 n = 1 puis (suc n) m = * m (puis n m) Cette définition utilise n,succ et * 1 On doit contrôler que P vérifie (1) et (2) On a besoin des représentations n, suc et * Ok, puisqu'on les connait dans Church ✔ thm P0n=1? n η 1 = λF λx F x= λ F λ x F x ⇒ λF F thm 0 = λF λx x α P 0 n=0 n= λ F λx xn= λx x ⇒ λF F On vérifie bien le première axiome n0 =1 N.B : la multiplication dans Church : mult a b=λx a bx . P suc n m=* m P n m ? ∀ n ,∀ m∈ℕ P suc n m = suc n m = suc n m = ( λn λF λx F(nFx)) n m = λx m (n m x) n ( P n m ) = (λF λx λy F(x,y)) m (P n m) = λy m (P n m y) = λy m (n m y) = csup α λx m (n m x) 10.4.2 Question 2 On montre que D = λn λm n pred n est une représentation de diff. Dans N diff x y = si x y alors x - y sinon 0 la définition utilise : si , , - , 0 , n Dans ∧ : la définition utilise n, pred Il faut transformer une des deux définitions, la transformation est plus facile dans ℕ Dans ℕ : diff n m = si m alors n - m sinon 0 n - m = si nm alors (1) m pred n sinon indéfini pred(0) = 0 pred( suc n) = n (2) (3) (4) d'après (1) nm alors n - m sinon 0 m (2) nm alors pred n sinon 0 m m = si nm alors pred n sinon pred n (3) m = pred n diff n m = si = si ∧ : D = λn λm m pred n ℕ : diff x y = si x y alors x - y sinon 0 m = pred n on doit montrer N.B : D n m = dif n m n n F x=F x D n m = ( λn λm m pred n ) n m = m pred n = pred m n définition de D β-réduction théorème vu dans Church = pred ( pred ( …( pred n )… ) m fois = pred( pred ( … ( pred n ) … ) = pred( pred ( … ( pred n ) … ) m = pred n = diff n m Donc D = diff D est une représentation de la fonction diff. car pred est une représentation de pred 11 FEUILLE 3 Opérateur de point fixe : Y' opérateur de point fixe ≡ ∀F Y ' F =F Y ' F Ici = désigne une β-conversion et pas nécessairement une β-réduction. 11.1 Exercice 1 11.1.1 Question 1 Y = λf ( λx f( x x ) ) ( λx f( x x ) ) Y F = ( λf ( λx f( x x )) ( λx f( x x )) ) F (Y est appelé combinateur paradoxal de Curry) définition de Y β(1) β-réduction par nom β(2) β-réduction (λx F( x x )) (λx F( x x )) ⇒ ⇒ F ( (λx F( x x )) (λx F( x x )) ) ≡ YF mais YF se réduit en cette expression YF F( YF) (1) (2) (1) F( ( λx F( x x ) ) ( λx F(x x))) Donc YF = F( YF) 11.1.2 Question 2 Y b =λx λy y x x y λx λy y x x y Y b F =( λx λy y x x y λx λy y x x y ) F M N Y b F =( λy y ( ( λx λy y ( x x y ) ) ( λx λy y ( x x y ) ) y ) F M N Y b F =F ( λx λy y x x y λx λy y x x y ) F = F Y b F ≡ Yb β-réduction β-réduction par nom Pour tout opérateur de point fixe Y YF = F(YF) = F ( F(YF)) = … F( F( … F( YF) … ) ) = … Y représente un mécanisme qui permet de ré appliquer indéfiniment la fonction f sur elle même. → boucles récursivité problème de l'arrêt : Y n'a pas de forme normale Y F peut avoir ou non une f.n ✔ F = I = λx x YF= YI = I( YI ) = YI = … pas de f.n ✔ F = λx λy y YF = F YF = λx λy y Y F M β-reduc par nom = λy y f.n N Donc Y représente le mécanisme de la récursivité mais c'est F qui décide de l'arrêt Y 0 F=(W S B W B F ) = = = = W = λx λy x y y S (B W B) (B W B) F (B W B F) (B W B F) W (B F) (B W B F) BF (B W B F) (B W B F) S = λx λy λz x z ( y z ) B = λx λy λz x (y z) =F BWBF B W B F Y 0 se réduit en ce terme donc Y 0 F= F Y 0 F donc Y 0 opérateur du point fixe 11.1.3 Question 3 Y 0 =WS BWB Y i 1 =Y i SI On montre : ∀i ✔ Y i =S I Y i par récurrence i = 0 vérifier Y 0 =SI Y 0 S I Y 0 X =I X Y 0 X = X Y 0 X =Y 0 X Donc S I Y 0 =Y 0 car on à montré ∀ X X Y 0 X =Y 0 X ✔ On suppose Y i =SI Y i (hypothèse de récurrence) on montre Y i 1 =SI Y i 1 Y i 1 =Y i SI =SI Y i SI =I SI Y i SI =SI Y i SI =SI Y i 1 définition de Y i hypothèse de récurrence réduction de S réduction de I définition de Y i 1 Pour tout i Y i F=S I Y i F =IF Y F =F Y F d'après question précédente réduction de S réduction de I Donc Y i est un opérateur de point fixe. 11.2 Exercice 2 ge : greater equal Dans ℕ : ge x y = si y = 0 alors T sinon si x = 0 alors F sinon ge (pred x) (pred y) ge est une fonction récursive, qui utilise zero?, pred, si alors sinon, et ge Dans ∧ : ge = λx λy … ge …. Problème : ge n'est pas encore défini. Si on essai de remplacer ge par sa définition, on obtient un un λterme infini ! Le λ-calcul n'est pas un langage récursif mais on peut l'implémenter. On va abstraire le représentant de ge ( c'est à dire le mettre en paramètre) : ge= λg λx λy …. g …. ge F ge : fonctionnelle Fonctionnelle : fonction de fonction. Ici appliqué à ge, elle produit ge. ge= F ge ge on peut voir ceci comme une équation d'inconnue ge ✔ ✔ ge est solution de l'équation d'inconnue X : X =F ge X ge est un point fixe de la fonctionnelle F ge (1) On a montré que ∀ F on a Y F = F (Y F) Donc, avec F =F ge on a Y F ge=F Y F ge Donc Y F ge est solution de (1) Donc on prend ge=Y F ge La solution ✔ ✔ définition de la récursivité de ge ge = λx λy IF( zero x) T [ IF( zero y) F [ ge ( pred x ) ( pred y ) ] ] définition de la fonctionnelle non récursive F ge ge= λg λx λy IF zero xT IF zero y F g pred x pred yge F ge= λg λx λy IF zero xT IF zero y F g pred x pred y ✔ équation de point fixe ge=F ge ge ✔ une solution de cette équation ge=Y F ge donne une définition non récursive de ge Exemple : ( on abandonne le soulignement ) F = λg λx λy IF( zero x ) T ( IF(zero y) F ( g ( pred x) (pred y))) ge = YG ge 2 1 = Y G 2 1 définition de ge = G( Y G ) 2 1 = IF( zero 2) F ( IF ( zero 1) T ( Y G ( pred 2) (pred 1)) = YG ( pred 2 ) ( pred 1 ) β-réduction de YG définition de F et β-réduction par nom β-réduction de (zero 2) et ( zero 1) par valeur. et β-réduction des 2 IF = YG 1 0 β-réduction de pred par valeur, car elle se termine = G(YG) 1 0 = IF ( zero 1) F ( IF ( zero 0 ) T ( … ) ) β-réduction de YG définition de F, β-réduction par nom =T β-réduction de zero par valeur et des deux IF Dans ℕ : définition récursive de x over y x over y = si x geslant y alors succ( { x-y} over y) sinon 0 En préfixé : div x y = si ge x y alors succ ( div (moins x y ) y ) sinon 0 Dans ∧ : ✔ définition récursive div = λx λy IF ( ge x y ) ( suc ( div ( moins x y ) y )) 0 ✔ Fonctionnelle récursive G_"div" = color red {λg} λx λy IF ( ge x y ) ( succ ( colore red {g} ( moins x y ) y)) 0 ✔ définition non récursive div = YG_"div" représentation de Church {0 , suc , zero, pred } autre représentation quelconque {0 , suc , zero, pred } Chercher ∅ / ∅ n = n forall n in setN n = succ^n 0 calcul dans = succ^n 0 car ℕ est une représentation de ℕ = n succ 0 ( on a forall F forall n F^n x = n F x; n est un itérateur) = ( λn n succ 0 ) n On veut n = ∅ n ; donc on prend ∅ = λn n suc 0 Chercher Ψ / Ψ n = n On essaiela mèthode précédente : n = succ^n 0 = suc^n 0 = n suc 0 Impossible de faire apparaître car on ne sait rien du système → n n'a pas de propriétés particuliére à part le fait qu'il représente n On examine les premiers entiers Ψ0=0 trouver une expression ou apparaît 1 Ψ 1 = 1 = suc 0 = suc 0 = suc( Ψ 0 ) = suc( Ψ (pred 1)) = suc ( Ψ ( pred 1 ) N | Church |cas precedent | N | 2nd représentaton Ψ 2 = 2 = suc 1 = suc 1 = suc ( Ψ 1) = suc ( Ψ (pred2 )) = suc ( Ψ ( pred 2 ) Donc n = 0 n>0 Ψ0=0 Ψ n = suc ( Ψ ( pred n ) On prouve par récurrence que Ψ n = n n=0 Ψ0=0 donc OK on suppose Ψ n = n on vérifie Ψ suc n = suc n Ψ suc n = suc ( Ψ ( pred ( suc n))) = suc ( Ψ ( pred ( succ n ))) = suc ( Ψ n ) = suc n suc n hypothèse de récurence ✔ Définition récursive de Ψ Ψ = λn IF (zero n) 0 ( suc ( Ψ ( pred n))) ✔ Fonctionnelle non récursive G_Ψ = color red {λg} λn IF ( zero n ) 0 ( suc ( color red {g} ( pred n ))) ✔ définition non récursive de Ψ Ψ = Y G_Ψ 1) On cherche feuille tel que feuille (var n) = T forall n , feuille (paire a b) = F forall a, b On remarque var n = λ v v n paire a b = λv λp p a (v b) On essaie donc Feuille a = a X Y (1) ↔ { var n X Y =T paire a b X Y = F equiv ? X ,Y Une solution simple { X n Y =T Y a X b= F { X = λx λy T Y =λx λy F Donc Feuille a = a (λx λy T) (λx λy F) Feuille = λa a (λa λy T) (λχ λy F) var = λn λv v n paire = λa λb λv λp p a (v b) Feuille = λa a (λx λy T) (λx λy F) Valeur = λa a (λx x) On cherche Valeur tel que Valeur ( var n ) = n (1) pas d'équation pour valeur ( paire a b ) On essaie valeur a = a X (1) ↔ var n X = n Xn=n X = λx x donc valeur a = a (λx x) donc valeur = λa a (λx x) On cherche gauche tel que gauche( paire a b ) = a On essaie gauche a = a X Y paire a b X Y = a Ya(Xb)=a solution Y = λx λy x X quelconque ( par exemple λx x ) donc gauche = λa a (λx x) (λx λy x) On cherche droit tel que droit ( paire a b ) = b on essaie droit a = a X Y paire a b X Y = b Y a (X b) = b solution : X = λx x Y = λx λy y ✔ Définition par cas : arbre2 ( var n ) = var ( * 2 n ) arbre2 ( paire a b ) = paire ( arbre2 a ) ( arbre2 b ) Définition récursive sans filtrage arbre2 a = IF ( feuille a ) ( var ( * 2 ( valeur a ))) ( paire ( arbre2 ( gauche a) ) ( arbre2 (droit a) ) ) En λ-calcul G_arbre2 = λg λa IF ( feuile a ) ( var ( * 2 ( valeur a))) ( paire ( color red g ( gauche a )) ( color red g ( droit a )) ) arbre2 = YG_arbre2 miroir ( var n ) = var n miroir ( paire a b ) = paire ( miroir b ) ( miroir a ) miroir a = IF ( feuillek a ) a ( paire ( miroir ( droit a)) ( miroir ( gauche a) ) ) G_miroir = λg λa IF ( feuille a ) a ( paire ( color red g ( droit a ) ) ( color red g ( gauche a ))) miroir = Y G_miroir