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

Prolog Discussion :

Question au sujet des crochets pour les listes


Sujet :

Prolog

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut Question au sujet des crochets pour les listes
    Bonjour, je suis entrain de me remettre au Prolog, et en faisant un exercice sur les listes, j'ai fais une erreur mais je n'arrive pas à comprendre pourquoi ce que je fais est faux.

    Donc je cherche à définir un prédicat qui donne la longueur d'une liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    longueur([],0).
    longueur([_|L],X):-longueur([L],X1), X is X1+1.
    % l'erreur provient des [ ] autour du L, car lorsque j'écris
    longueur([_|L],X):-longueur(L,X1), X is X1+1.
    % ça marche
    Je ne comprend pas pourquoi il ne faut absolument pas mettre de crochets à L qui est une sous-listes (et donc une liste).
    Je précise que j'utilise SWI-prolog.
    Merci de votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 938
    Points : 6 383
    Points
    6 383
    Par défaut
    Salut

    Oui, c'est une erreur courante quand on se met au Prolog.

    Que signifie la notation [H|T] ? C'est la notation d'une liste dont le premier élément est H et le reste la LISTE L.

    Donc il ne faut pas mettre de crochets lorsque tu veux utiliser la liste L. [L] represente une liste dont le seul élément est la liste L.

    Si tu connais un peu Scheme ou LISP, on retrouve la notion de car et cdr.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    C'est ce que je me suis dis, mais pourquoi lorsque je demande

    Ca ne marche pas.
    Je pensais que ça marcherais au moins pour les listes contenant un seul élément.

  4. #4
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    C'est tout à fait logique. L est une liste, et ta fonction prend en premier argument une liste, donc syntaxiquement c'est correct. [L] signifie une liste contenant L.
    L'écriture [_|L] matérialise simplement qu'une liste est composée du premier élément et du reste de la liste (qui est lui meme une liste). Donc quand tu fais ton appel, tu le fais sur le reste de la liste, donc L. Si tu as déja fait du scheme, le L ici correspond au "cdr" et le "_" au "car"

    Edit: croisement...
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  5. #5
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Désolé, je n'ai jamais fais de Scheme.
    Mais lorsque j'ai commis mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    longueur([_|L],X) :- longueur([L],X1), X is X1+1.
    Prolog aurait pu (ou du) comprendre :
    longueur du liste égal X si longueur d'une liste à 1 élément égal X1 et X = X1 +1.

    Enfin je pense.

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 938
    Points : 6 383
    Points
    6 383
    Par défaut
    Citation Envoyé par juve1897 Voir le message
    C'est ce que je me suis dis, mais pourquoi lorsque je demande

    Ca ne marche pas.
    Je pensais que ça marcherais au moins pour les listes contenant un seul élément.
    Parceque [9] peut s'écrire [9 | []] ! et donc après tu demandes la longueur de [[]].

    Comme en Lisp on a
    [1, 2, 3] = [1 | [2 | [3 | []]]].
    On n'en est pas toujours conscient en Prolog.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Désolé si je suis lourd, mais j'ai bien conscience du fait que [9] <=> [9|[]], et c'est justement pour cela que l'on devrait obtenir 1.
    Longueur de [] etant défini (dans le premier fait) comme egal à 0, donc 0+1 nous donne la longueur de [9].
    Je suis vraiment désolé de vous emmerder avec ça.
    A la prochaine réponse si je n'ai toujours pas compris, je passe mon chemin et j'enchaine sur autre chose.

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 938
    Points : 6 383
    Points
    6 383
    Par défaut
    J'ai un peu modifié ton code, pour que tu voies ce qui se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    longueur([],0).
    longueur(L,X):-
    	writeln(L),
    	read(_),
    	L = [_|L1],
    	longueur([L1],X1), X is X1+1.
    Teste le, tu verras que tu n'arrive jamais à Attention, Au prompt, il faut terminer la saisie par un point ('.').
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. Recherche des exercices pour les listes chainée
    Par dot-_-net dans le forum C
    Réponses: 1
    Dernier message: 15/12/2007, 18h14
  2. Des classes pour les liens en CSS
    Par Invité dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 08/03/2005, 14h31
  3. [debutant][JNI]Stocker des objet pour les rappeler plus tard
    Par Celenor dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 28/03/2004, 01h28

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