IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages fonctionnels Discussion :

Lambda-calcul typé (système F) : algorithme de substitution


Sujet :

Langages fonctionnels

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Lambda-calcul typé (système F) : algorithme de substitution
    Bonjour à tous,

    quelqu'un peut me donner en détails l'algorithme de substitution qu'on applique dans le système F?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Je connais Système F mais je ne comprends pas ta question. Qu'est-ce qui te pose problème et qu'est-ce que tu attends de nous ?

    gorgonite > ce cours est intéressant mais je ne pense pas que ce soit une bonne source pour Système F, qui y est essentiellement décrit comme un cas particulier de Pure Type System. C'est puissant et abstrait, mais pas le plus intuitif ou clair quand on débute...

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Ton message m'y fait penser: j'ai écris des notes sur les lambda-calculs typés pour un exposé à une groupe de travail de logique, qui présentent le lambda-calcul, Système F et Système Fomega de façon relativement vulgarisée -- mais plutôt pour des logiciens que pour des informaticiens.
    Si ça intéresse quelqu'un, c'est ici :
    http://gdt.ludics.eu/images/5/58/Type_theory_course.pdf

    Bien sûr c'est un document de présentation/vulgarisation, en une dizaine de pages, pas du tout un cours ayant vocation d'être complet sur le sujet. Ça ne peut certainement pas remplacer un document comme le cours de Dowek, mais à mon avis c'est plus accessible pour une première approche.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci à tous pour ces explications.

    Je trouve que ce document est très intéressant.

    Ma question est:

    est ce qu'il y a une différence entre l'algorithme de substitution dans le lambda calcul pure et l'algorithme de substitution dans le système F?

    je sais que dans le système F on doit gérer deux types de substitutions:

    la substitution des termes
    la substitution des types

    Je voudrais savoir est ce que c'est le même algorithme qu'on doit appliquer dans les deux substitutions ou pas?


    Je vous remercie tous.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Je pense que tu peux répondre toi-même à ta question en définissant ces deux algorithmes de substitution pour les comparer. L'idée d'un algorithme de substitution est assez simple: on remplace les variables, et on substitue récursivement les sous-termes d'une expression un peu compliquée, en faisant attention à gérer les conflits de variables au niveau des lieurs (lambda, let, etc.) qui définissent de nouvelles variables (ayant peut-être le même nom que la variable substituée).

    Comment définis-tu ces deux substitutions ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Pour la substitution des termes, je pense qu'il faut appliquer l'algorithme classique, càd:

    -si t est une variable, alors t[x/u]=u si x=t et t sinon

    -si t est une application (vw)alors t[x/u]=v[x/u]w[x/u]

    -si t est une abstraction (lambda y.v) alors t[x/u]=lambda y.(v[x/u]) si x est différent de y sinon t.

    Mais la question se complique au niveau des types.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Ça c'est l'algorithme classique sur le lambda-calcul non typé. Quelle définition de System F utilises-tu ? Je suppose que c'est une définition explicitement typé, et alors tu as des cas supplémentaires à gérer (l'abstraction et l'application de types) dans ta définition de la substitution des termes.

    (Quand je demande "quelle définition", je me demande quelles sont les grammaires que tu utilises pour décrire les termes et les types valides de ton système. Les règles de typage sont aussi importantes mais on peut les deviner à partir des grammaires en général.)

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Vous avez raison, l'algorithme que je viens de citer concerne le lambda calcul simple et pas le système F.

    1)Pour la définition des types dans le système F, on a ceci:

    Les types de base: t, v , les variables et les constantes.


    Les variables de types: si α est une variable de type, alors α est un type.


    Si A et B sont des types alors A ->B est un type.


    Si α est une variable de type, B est un type alors ΠαB est un type.


    En résumé: A,B:= α| A ->B | ΠαB


    2)Les termes du système F sont définis comme suit:

    Les termes de base: variables et constantes.


    Application: si M et N sont des termes alors MN est un terme.


    Abstraction: si x est une variable de terme, A est un type et M est un terme, alors λx:A.M est un terme.


    Application de type: si M est un terme, A un type alors M{A} est un terme.


    Abstraction de type: si α est une variable de type, M un terme, alors Λα.M est un terme.

    Maintenant pour les algorithmes de substitution, on a:

    1)Algorithme de substitution des types:

    T[α:=A]

    a)T est une constante: rien a faire.

    b)T est une variable de type:
    -T=α alors T[α:=A]=A
    -T=B alors T[α:=A]=B

    c)T est une application: T est U->V

    T[α:=A]= U[α:=A]->V[α:=A]

    d)T est une abstraction:ΠB.T[α:=A]

    1)α est différent de B:
    -pas de B dans A alors:

    ΠB.(T[α:=A])


    -B dans A alors il faut renommer B en G avec G n'appartient pas a T[B]A

    2)α=B alors T.

    j'aurais besoin de votre aide pour l'algorithme de substitution des termes.

    Merci d'avance.

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    svp Gasche, est ce que c est possible d avoir un exemple de grammaire contenant la définition des types et des termes du système F
    merci d'avance

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    je ne sais pas si je peux vous aider, mais voici ce que je propose en prolog:

    Pour les termes, mais sans l'application de types et sans l'abstraction de types:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    is_Term(X):-
          var(X);
          atomic(X).
    
    is_Term(app(M,N)):-
                 is_Term(M),
                 is_Term(N).
    
    is_Term(lam(X-A,M)):-
                 var(X),
                 is_Term(M),
                 is_Type(A).


    ce je propose pour les types est comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    cst_type(e).
    var_type(t).
    
    is_Type(X):-
           cst_type(X);
           var_type(X).
           
    is_Type(X->Y):-
              is_Type(X),
              is_Type(Y).
              
    is_type(pi(A,T)):-
                  is_type(T),
                  var_type(A).

    Est ce que cette définition peut être considérée comme une grammaire à utiliser pour l'algorithme de substitution?

  11. #11
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    inutile de faire doublon, mets juste le lien vers ton proto en prolog
    http://www.developpez.net/forums/d12...g/#post6624637
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Citation Envoyé par samou_kh Voir le message
    a)T est une constante: rien a faire.

    b)T est une variable de type:
    -T=α alors T[α:=A]=A
    -T=B alors T[α:=A]=B

    c)T est une application: T est U->V

    T[α:=A]= U[α:=A]->V[α:=A]

    d)T est une abstraction:ΠB.T[α:=A]

    1)α est différent de B:
    -pas de B dans A alors:

    ΠB.(T[α:=A])


    -B dans A alors il faut renommer B en G avec G n'appartient pas a T[B]A

    2)α=B alors T.

    j'aurais besoin de votre aide pour l'algorithme de substitution des termes.
    En gros, l'idée est d'explorer récursivement les sous-termes, jusqu'à rencontrer un type, et là tu appliques l'algorithme de substitution sur les types.

    Donc tu auras par exemple

    (M{T})[α:=A] := M[α:=A]{T[α:=A]}

    (M[α:=A] est une substitution sur les termes, T[α:=A] sur les types)

    Le reste marche à peu près comme ça. La seule subtilité est
    l'abstraction de type (Λβ.M)[α:=A] où il faut raisonner selon qu'il
    y a un conflit de variables (α=β) ou non.

    (Il y a aussi un risque de capture des variables dans A, mais ce
    risque est déjà présent dans la substitution de termes et vous n'en
    avez pas parlé pour l'instant donc j'imagine qu'on raisonne
    avec assez de noms frais, ou modulo α-conversion.)

  13. #13
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Il existe des Prolog étendus spécialement pour la substitution de variables.
    Sur l'instant je pense à Alpha-Prolog mais je sais qu'il y en a d'autres (Qu-Prolog, Lambda Prolog) .
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    merci pour vos réponses.

    Pour l'algorithme de substitution pour les termes, d’après ce que j'ai compris, il n y a pas une grande différence avec les types, donc on peut l’écrire de cette façon:

    a)T est une constante: rien a faire.

    b)T est une variable de type:
    -T=α alors T[α:=A]=A
    -T=B alors T[α:=A]=B

    c)T est une application: T est UV

    T[α:=A]= U[α:=A]V[α:=A]

    d)T est une abstraction:lambda X:C.T[α:=A] (avec C le type de X

    1)α est différent de X:
    -pas de X dans A alors:

    lambda X:C.T[α:=A]


    -X dans A alors il faut renommer X en Y avec Y n'appartient pas a T[X]A

    2)α=X alors T.

    e)T est une application de type

    f)T est une abstraction de type


    et dans le cas e et f qu'il faut gérer plusieurs cas.

    Est ce que c'est bien ça l'algorithme de substitution des termes dans le système F?

    Merci d'avance.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    je pense que j'ai dit quelques bêtises sur l'algorithme de substitution des termes, je corrige ça:

    on veut gérer l'alpha conversion M[alpha:=A]
    1)M est une constante, alors rien a faire

    2)M est une variable de terme alors on a deux cas:

    a) M=alpha alors M[alpha:=A]=A
    b) M est différente de alpha et M=B alors M[alpha:=A]=B

    3)M est une application: M=UV

    M[alpha:=A]= U[alpha:=A] V[alpha:=A]

    4)M est une abstraction: M=lambda x:B.N

    a)alpha=x, alors M[alpha:=A]=M=lambda x:B.N

    b)alpha est différente de x:

    1)x n'appartient pas a N:
    M[alpha:=A]:=lambda x:B.(N[alpha:=A])

    2)x appartient a N:
    a)x ne figure pas dans A alors
    M[alpha:=A]:=lambda x:B.(N[alpha:=A])

    b)x figure dans A alors on renomme x par y dans M (avec y ne figure pas ni dans N ni dans A) et après on fait la substitution.
    M[alpha:=A]:=lambda y:B.(N[alpha:=A]).


    pour les deux derniers cas, l'application de type et l'abstraction de type, d’après la réponse de Mr gasche:

    application de type:
    (M{T})[α:=A] := M[α:=A]{T[α:=A]}

    mais est ce que je peux avoir plus d'explication sur comment on fait réellement cette substitution et aussi celle de l'abstraction de type( des exemples si c'est possible)


    Merci a tous.

    J'attends vos remarques.

Discussions similaires

  1. [Idée]Lambda-calcul non typé 100% graphique
    Par SpiceGuid dans le forum Langages fonctionnels
    Réponses: 4
    Dernier message: 11/05/2013, 17h07
  2. Lambda-calcul simplement typé : terminaison assurée ?
    Par Ekinoks dans le forum Langages fonctionnels
    Réponses: 7
    Dernier message: 11/09/2010, 22h25
  3. Lambda calcul + Ocaml
    Par binous_ dans le forum Caml
    Réponses: 4
    Dernier message: 12/03/2007, 17h04
  4. Parseur de lambda calcul
    Par davcha dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 27/04/2006, 22h05
  5. Réponses: 5
    Dernier message: 30/11/2005, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo