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

Lisp Discussion :

comment savoir si une liste est evaluable?


Sujet :

Lisp

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Points : 54
    Points
    54
    Par défaut comment savoir si une liste est evaluable?
    Bonjour,

    je rencontre un petit problème avec une fonction de simplification. Je dois pouvoir simplifier toutes fonctions c'est à dire (+ 0 x)=x mais aussi les évaluer si possible (+ 3 4)=7 et si rien est possible l'afficher comme tel (* x x)=(* x x)
    j'ai pensé à un algorithme du style
    je teste d'abord si mon premier element est un + ensuite je teste si le premier element egale 0 j'affiche le deuxième je traite le cas de la commutativité cela ca va. mais je sais pas comment faire ou plutot si c'est possible de faire:

    si la liste est evaluable alors l'évaluer sinon l'afficher comme tel.
    comment savoir si elle est evaluable ou pas pour la simplifier au max.

    merci de me donner un petit coup de pouce

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Facile : une liste est évaluable si tout ses éléments sont évaluables.

    --
    Jedaï

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Points : 54
    Points
    54
    Par défaut
    Peux tu être plus explicite
    si je ne vois pas comment on fait pour tester si une liste est évaluable c'est que je ne sais pas comment faire pour tester si un élément est évaluable
    en effet je voudrais faire si le premier element est evaluable passer au deuxieme et ainsi de suite jusqu'à ce que la liste soit fini et si tous ces elements sont evaluables alors evaluer la liste sinon l'afficher telle qu'elle est.
    Mais au niveau programmation je ne vois vraiment pas comment faire

    Puis je avoir un peu plus d'explication merci


  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    si je ne vois pas comment on fait pour tester si une liste est évaluable c'est que je ne sais pas comment faire pour tester si un élément est évaluable
    Bin alors pourquoi n'as tu pas demandé ça ?

    Dans ce cas, ne te préoccupe pas de comment tester si une liste d'élément est évaluable. C'est extrêmement simple dès que tu sais comment évaluer un terme comme l'a indiqué Jedaï.

    Cherches d'abord comment déterminer si un élément est évaluable.
    1) Commence par expliquer en bon français ce que tu appelles évaluable.
    2) Ensuite, donnes une idée de l'algorithme que tu pourrais en tirer (de tes phrases en français)

    Et là on verra où tu as besoin d'aide.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Points : 54
    Points
    54
    Par défaut
    pour moi evaluable c'est quand on peut calculer l'expression
    Ma fonction ne recevra que des listes de la forme (+ 3 4) ou (+ 2 x)
    quand il recoit la premiere je veux que la fonction le calcule et quand il voit la deuxième qu'il la réaffiche tel quel.
    je ne sais pas comment traduire en lisp si l'element est evaluable après le reste je pense que c'est bon mais ca je ne vois vraiment pas
    merci de votre aide

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Et bien dirais-tu que "+" est évaluable ? Que "2" est évaluable ? Que "x" est évaluable ?
    Une fois que tu as établis ces cas de bases, tu peux simplement utiliser "une liste est évaluable si tous ses composants sont évaluables" récursivement.

    --
    Jedaï

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par pepsister Voir le message
    [...]je ne sais pas comment traduire en lisp si l'element est evaluable [...]
    Laisses tomber pour l'instant la traduction en Lisp, c'est un détail une fois que tu as l'algorithme correct.

    Comme te l'as fait remarquer Jedaï il faut d'abord que tu définisses qu'est ce que tu veux dire par évaluable pour chaque élément de tes listes. Tu auras après une définition applicable il suffira de la traduire.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Points : 54
    Points
    54
    Par défaut
    Pour moi '+' est evaluable et tous les nombres sont evaluables donc une liste (+ 3 4) est evaluable. Pour moi evaluable c'est que lisp s'est le calculer. Par contre 'x' n'est pas evaluable une liste du style (* 3 x) n'est pas evaluable car x il ne connait pas sa valeur du coup il ne peut pas la calculer.

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par pepsister Voir le message
    Pour moi '+' est evaluable et tous les nombres sont evaluables donc une liste (+ 3 4) est evaluable. Pour moi evaluable c'est que lisp s'est le calculer. Par contre 'x' n'est pas evaluable une liste du style (* 3 x) n'est pas evaluable car x il ne connait pas sa valeur du coup il ne peut pas la calculer.
    Exact... sauf si tu connais la valeur de x dans un dictionnaire par exemple. C'est d'ailleurs là qu'on parle de liaisons syntaxiques. Bon toujours est il que tu as les moyens de déterminer ce qui est évaluable ou non.

    Fais toi une fonction evaluer.
    Celle-ci devra déterminer comment faire pour évaluer 1 objet, et si l'objet n'est pas évaluable retourner #f.
    Il faut que tu saches qu'en lisp on passe par un système de symbole.
    Si tu ne sais pas ça, ça va être difficile de saisir le principe. Mais je suppose qu'on te l'a appris. Un symbole est évaluable s'il est lié syntaxiquement. Si tu ne travailles pas avec un dictionnaire, ton symbole ne devrait pas l'être. Ensuite tu as les constantes du langages: les primitives. Si quelque chose n'est pas un symbole, il s'évalue en lui-même.

    Ainsi 1 s'évalue en 1 et + en +. Mais 'x s'évalue en rien s'il n'est pas lié.

    Est-ce que tu comprends le principe ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Points : 54
    Points
    54
    Par défaut
    Il faut que tu saches qu'en lisp on passe par un système de symbole.
    Si tu ne sais pas ça, ça va être difficile de saisir le principe. Mais je suppose qu'on te l'a appris.
    Je comprend ce que tu veux dire et je pensais à faire une fonction evaluer mais je ne vois pas quoi lui mettre
    Si les elements sont des nombres ou si les elements sont des opérateurs + - * / alors je dis que c'est evaluable sinon je retourne que ce n'est pas evaluable. Est ce cela le principe?
    je ne comprend pas quand tu dis qu'il faut retourner #f, c'est quoi cette chose, je n'ai jamais vu ca.
    Merci encore de ton aide

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par pepsister Voir le message
    Je comprend ce que tu veux dire et je pensais à faire une fonction evaluer mais je ne vois pas quoi lui mettre
    Si les elements sont des nombres ou si les elements sont des opérateurs + - * / alors je dis que c'est evaluable sinon je retourne que ce n'est pas evaluable. Est ce cela le principe?
    Tu as des tests qui vérifient les données primitives. Ici la seule chose que tu ais besoin est SYMBOLP qui teste si l'expression que tu manipules est un symbole.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [1]> (SYMBOLP 'a)
    T
    [2]> (SYMBOLP +)
    NIL
    [3]> (SYMBOLP 1)
    NIL
    Citation Envoyé par pepsister Voir le message
    je ne comprend pas quand tu dis qu'il faut retourner #f, c'est quoi cette chose, je n'ai jamais vu ca.
    Oupss pardon je me pensais en Scheme.. tu renvois NIL c'est-à-dire faux. Ceci te permet d'utiliser le résultat en code d'erreur.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Points : 54
    Points
    54
    Par défaut
    j'ai compris mais j'ai un problème:
    pour moi il faut faire si le premier element de la liste est un symbole alors on renvoie la liste complète sinon c'est donc pas un symbole donc on teste l'élément suivant de la liste. Mais je ne lui dit jamais dans ma fonction que si tous les elements ne sont pas des symboles alors il peut l'évaluer je veux donc qu'il l'évalue et donne donc le résultat de l'opération.
    puis je avoir encore un coup de pouce
    merci

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par pepsister Voir le message
    j'ai compris mais j'ai un problème:
    pour moi il faut faire si le premier element de la liste est un symbole alors on renvoie la liste complète sinon c'est donc pas un symbole donc on teste l'élément suivant de la liste. Mais je ne lui dit jamais dans ma fonction que si tous les elements ne sont pas des symboles alors il peut l'évaluer je veux donc qu'il l'évalue et donne donc le résultat de l'opération.
    puis je avoir encore un coup de pouce
    merci
    Désolé, mais je n'ai pas compris.
    En premier lieu, je n'ai pas compris ton algorithme. Réécris le sous la forme d'un énumération ou d'un pseudocode propre.

    Deuxèmement je n'ai pas compris où est la question ?!

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Points : 54
    Points
    54
    Par défaut
    le but de ma fonction est de calculer la liste si cela est possible (exemple: (+ 3 4)) sinon ce n'est pas possible la rafficher telle quelle est (exemple: ( + 3 x))
    voici le pseudo code auquel j'ai pensé:
    si le premier element de la liste est evaluable
    alors je passe à l'élément suivant de la liste
    sinon j'affiche la liste

    je me rend compte que ma fonction va beugger car une fois la liste terminé et si tous les element sont evaluables la fonction plante car je ne lui ai rien dit vis a vis de ca. je voudrais une fois la liste terminée et si tous les elements sont evaluables qu'elle me l'évalue (qu'elle me donne le resultat de l'opération). Mes questions: Ai je raison, ma fonction va-t-elle planté pour cette raison là? comment faire pour résoudre ce problème, comment traduire si tous les elements sont evaluables alors evaluer la liste?

    j'espère avoir été assez claire. j'ai vraiment besoin d'une aide car cette fonction devient urgente pour continuer le reste de mon programme que je dois rendre dans peu de temps

    merci beaucoup

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Oups, excuses moi je t'avais vu mais j'ai oublié de te répondre.


    Bon visiblement tu te rends comptes que ton algo a un problème.
    Pourquoi donner celui-ci alors ?
    Surtout que tu sais pourquoi : tu ne fais rien quand c'est évaluable.

    Ça vient du fait que tu fais une mauvaise analyse du problème.
    Déjà tu n'as pas bien fais attention à ce que je t'ai dis :
    « Fais toi une fonction evaluer. Celle-ci devra déterminer comment faire pour évaluer 1 objet, et si l'objet n'est pas évaluable retourner #f. »
    Ici tu fais une fonction qui regardes si qqchose est évaluable.
    Mais ce que tu dois faire c'est d'évaluer.
    Si ton élément est évaluable, et bien évalue le. Simplement.

    Donc il faut que tu demandes qu'est ce que tu auras à évaluer...

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 34
    Points
    34
    Par défaut
    Bonjour

    Un autre problème non simple à implémenter est que les éléments non calculables pourront éventuellement s'éliminer.
    Par exemple (- (* x x) (+ (* (+ x 1) (- x 1)) 1)) vaut 0 alors que c'est loin d'être évident a priori si x n'est pas calculable.

    Fractal

Discussions similaires

  1. Comment savoir si une liste est vide?
    Par erfindel dans le forum Access
    Réponses: 2
    Dernier message: 14/02/2007, 15h20
  2. Comment savoir si une connexion est deja ouverte?
    Par ghor_bey dans le forum Web & réseau
    Réponses: 3
    Dernier message: 29/07/2005, 15h17
  3. Réponses: 6
    Dernier message: 01/07/2005, 15h06
  4. Comment savoir si une variable est initialisée ?
    Par nabix dans le forum Général Python
    Réponses: 8
    Dernier message: 10/03/2005, 15h12
  5. Comment savoir qu'une fonction est standard ?
    Par D[r]eadLock dans le forum C
    Réponses: 5
    Dernier message: 24/03/2003, 14h42

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