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

Caml Discussion :

[Problème]Evaluation de Letrec


Sujet :

Caml

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    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
    Par défaut [Problème]Evaluation de Letrec
    Voici le type de mes lambda-expressions et de mes lambda-valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type lambda_expr =
      | Cst of int
      | Var of int
      | Abs of lambda_expr
      | App of lambda_expr * lambda_expr
      | Let of lambda_expr * lambda_expr
      | Letrec of lambda_expr * lambda_expr
    and  lambda_val =
      | Val of int
      | Fun of (lambda_val -> lambda_val)
    ;;
    Et mon évaluateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let rec eval expr env =
      match expr with
      | Cst n    -> Val n
      | Var n    -> List.nth env n
      | Abs body     -> Fun (fun x -> eval body (x::env))
      | App (f,arg)  ->
          ( match eval f env with
          | Fun f -> f (eval arg env)
          | _ -> invalid_arg "Can't apply, not a function")
      | Let (e1,body) -> eval body (eval e1 env::env)
      | Letrec (e1,body) ->
          let rec env1 = (eval e1 env1)::env
          in eval body env1
    ;;
    Tout marche très bien... jusqu'au Letrec.

  2. #2
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    env1 n'est pas censé être une liste... parce que sa définition me fait penser à une fonction

    ça ne pose pas des problèmes de typage ?


    par ailleurs, pourquoi les types sont mutuellement récursifs alors qu'ils ne s'utilisent pas l'un l'autre ?



    EDIT en plus ça compile pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    | Letrec (e1,body) ->
    (*      let rec env1 = (eval e1 env1)::env in  *)
          let env1 = (eval e1 env)::env in  
          eval body env1
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    une question... quelles opérations peux-tu espérer effectuer avec un tel langage
    il n'y a aucune opération sur les constantes, aucune structures de données complexes, etc

    c'est assez déconcertant... perso, je pense qu'il faudrait ajouter :
    + opérations arithmétiques de base
    + type "tuple"
    + système de continuations
    + évaluation paresseuse ?



    par ailleurs, essaies de faire une machine virtuelle, c'est beaucoup plus marrant qu'un interprète
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Membre Expert
    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
    Par défaut
    Pourquoi env1 une fonction? Une fonction aurait la forme suivante:
    Non ça ne pose pas de problème de typage, le message d'erreur n'est pas une erreur de typage.

    Oui env1 est une liste, non ça ne compile pas, d'ailleurs si ça compilait ça marcherait puisque ma définition est bonne, je veux dire que la nouvelle valeur définie vaut bien eval e1 env1 et le nouvel environnement d'évaluation est bien env augmenté de cette nouvelle valeur.

    Je formule ma question (ce que j'avais oublié de faire, désolé): comment dois-je implémenter l'évaluation du Letrec? (j'ai pas dis la compilation car c'est un autre problème qui ne me concerne pas ici ou en tout cas pas encore)

  5. #5
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par SpiceGuid
    Non ça ne pose pas de problème de typage, le message d'erreur n'est pas une erreur de typage.

    juste une erreur de let rec défini à droite d'un -> ; ce qui n'est pas autorisé



    Citation Envoyé par SpiceGuid
    Oui env1 est une liste, non ça ne compile pas, d'ailleurs si ça compilait ça marcherait puisque ma définition est bonne, je veux dire que la nouvelle valeur définie vaut bien eval e1 env1 et le nouvel environnement d'évaluation est bien env augmenté de cette nouvelle valeur.
    même si ça compilait, rien ne t'assure que ça marcherait... et j'ai du mal à cerner la logique de ton Letrec
    avec une meilleure description de ce qu'est censé contenir chacun des deux éléments du doublet Letrec(e1, body), on aurait une chance de t'aider...

    ton letrec est bien censé correspondre à une fonction récursive, donc il faudrait son identifiant pour pouvoir l'appeler dans son corps (body je suppose )
    dans ce cas qu'est e1 ? les arguments ?


    ps: la compilation est un problème... car même un programme conceptuellement juste, mais ne compilant pas, ne vaut "rien" ; sinon c'est qu'on est resté dans le domaine de l'algorithmie, et qu'il serait plus clair d'écrire en "pseudo-code"
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Citation Envoyé par gorgonite
    juste une erreur de let rec défini à droite d'un -> ; ce qui n'est pas autorisé
    Non, c'est autorisé, le problème n'est pas là : le fait est que le let rec pour des valeurs non fonctionnelles possède certaines restrictions qui sont listées dans le Fucking Manual.

  7. #7
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Citation Envoyé par gorgonite
    ps: la compilation est un problème... car même un programme conceptuellement juste, mais ne compilant pas, ne vaut "rien" ; sinon c'est qu'on est resté dans le domaine de l'algorithmie, et qu'il serait plus clair d'écrire en "pseudo-code"
    C'est vrai : un programme ne compilant pas vaut autant que ****mettre ce que l'on veut ici****.

    Mais je ne sais pas si SpiceGuid ne se réferrait finalement pas à la partie compilatoire de son application, car il y a peut-être un langage derrière tout ça ?

    P.S. : si tu as besoin d'un petit lambda-langage et que ça ne constitue pas le coeur de ton application, ne te fait pas chier et essaye de reprendre celui de Daniel de Rauglaudre présent dans le tutoriel de CamlP4 : il est pas mal.

  8. #8
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Citation Envoyé par SpiceGuid
    Voici le type de mes lambda-expressions et de mes lambda-valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          let rec env1 = (eval e1 env1)::env
    Ca compile (je ne peux pas essayer d'où je suis) ? Car si env1 est une liste, alors ce genre de construction récursive est interdite dixit le Fucking Manual, section 7.3...

    http://caml.inria.fr/pub/docs/manual...manual021.html

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/12/2011, 14h56
  2. [XL-2007] Problème avec Evaluate
    Par issoram dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/12/2011, 16h16
  3. [XPATH] Xpath evaluate problème encodage
    Par pjmorce dans le forum Format d'échange (XML, JSON...)
    Réponses: 13
    Dernier message: 06/06/2011, 16h53
  4. KSH : Problème d'evaluation des varialbes
    Par rufhy dans le forum Linux
    Réponses: 2
    Dernier message: 29/03/2011, 09h28
  5. Réponses: 11
    Dernier message: 17/08/2010, 00h21

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