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 :

tester dernière valeur de liste


Sujet :

Prolog

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 755
    Points : 208
    Points
    208
    Par défaut tester dernière valeur de liste
    bonsoir à toutes et à tous,
    Voilà je dois écrire un prédicat description(D,A,L) qui vérifie qu'on peut aller de la ville D à la ville A en passant par les villes se trouvant dans la liste L lue de gauche à droite. On vérifiera que D est la première ville de L et A la dernière ville de L.

    Mon code donne ceçi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    segment(paris,lyon,train,200).
    segment(lyon,toulouse,train,600).
    segment(toulouse,montpellier,train,750).
    segment(montpellier,marseille,train,100).
    connection(D,A,X,_):-segment(D,A,X,_),!.
    description(D,A,[D|L]):-segment(D,A1,X,_),connection(A1,A,X,_).
    Ainsi je teste bien que D est en tête de liste mais comment tester que A est la dernière valeur de la liste ?
    Merçi pour votre aide

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Une méthode possible est de dire que le dernier élément d'une liste est le premier de la liste inversée.
    En SWI-Prolog, le prédicat last/2 existe.
    Enfin, tu peux écrire toi-même ce prédicat, c'est un bon exercice.
    Ainsi, ta desciption s'écrirait d'elle-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    description(D,A,[D|L]):-
      last(A, L).
    "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 actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 755
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Une méthode possible est de dire que le dernier élément d'une liste est le premier de la liste inversée.
    En SWI-Prolog, le prédicat last/2 existe.
    Enfin, tu peux écrire toi-même ce prédicat, c'est un bon exercice.
    Ainsi, ta desciption s'écrirait d'elle-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    description(D,A,[D|L]):-
      last(A, L).
    Bonsoir et merçi pour ta réponse, ton idée de liste inversée m'a fait penser que j'avais vu ça en formation, en revoyant mes archives voiçi ce que j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    % base de faits
    segment(paris,lyon,train,200).
    segment(lyon,toulouse,train,600).
    segment(toulouse,montpellier,train,750).
    segment(montpellier,marseille,train,100).
     
    % prédicat connection
    connection(D,A,X,_):-segment(D,A,X,_),!.
    connection(D,A,X,_):-segment(D,A1,X,_),connection(A1,A,X,_).
     
    prédicats inverse et renverse
    inverse([],L,L).
    inverse([X|L],L2,L3):-inverse(L,L2,[X|L3]).
    renverse(L,L2):-inverse(L,L2,[]).
     
    % prédicat description
    description(D,A,[D|L]):-renverse(L,L2),segment(D,A1,X,_),connection(A1,[A|L2],X,_)
    Dans le prédicat description je veux tester A qui doit être en tête de liste
    L2 (Liste inversée de L)
    Mais ça ne marche pas .
    Si tu as une idée.
    Merçi encore.
    A +

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 755
    Points : 208
    Points
    208
    Par défaut Bonne année à tous et Rappel pour Trap D
    Citation Envoyé par xeron33 Voir le message
    Bonsoir et merçi pour ta réponse, ton idée de liste inversée m'a fait penser que j'avais vu ça en formation, en revoyant mes archives voiçi ce que j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    % base de faits
    segment(paris,lyon,train,200).
    segment(lyon,toulouse,train,600).
    segment(toulouse,montpellier,train,750).
    segment(montpellier,marseille,train,100).
     
    % prédicat connection
    connection(D,A,X,_):-segment(D,A,X,_),!.
    connection(D,A,X,_):-segment(D,A1,X,_),connection(A1,A,X,_).
     
    prédicats inverse et renverse
    inverse([],L,L).
    inverse([X|L],L2,L3):-inverse(L,L2,[X|L3]).
    renverse(L,L2):-inverse(L,L2,[]).
     
    % prédicat description
    description(D,A,[D|L]):-renverse(L,L2),segment(D,A1,X,_),connection(A1,[A|L2],X,_)
    Dans le prédicat description je veux tester A qui doit être en tête de liste
    L2 (Liste inversée de L)
    Mais ça ne marche pas .
    Si tu as une idée.
    Merçi encore.
    A +

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu es bien gentil mais ce n'est pas à moi de faire tes exercices.
    Ça ne marche pas !
    Pourquoi ? quelle est ta requête ? Quelle est la réponse attendue ? Il faut donner quelques détails.

    Maintenant, je t'avais répondu de façon générale quant à l'obtention du dernier élément d'une liste.

    Pour ton problème particulier, le mieux est d'obtenir la chemin qui de la ville D à la ville A et ensuite de vérifier que la première ville est bien D et la dernière est bien A. Ceci implique que tu dois construire ton chemin en partant de A et en remontant jusqu'à D.
    "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

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 755
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Tu es bien gentil mais ce n'est pas à moi de faire tes exercices.
    Pourquoi ? quelle est ta requête ? Quelle est la réponse attendue ? Il faut donner quelques détails.

    Maintenant, je t'avais répondu de façon générale quant à l'obtention du dernier élément d'une liste.

    Pour ton problème particulier, le mieux est d'obtenir la chemin qui de la ville D à la ville A et ensuite de vérifier que la première ville est bien D et la dernière est bien A. Ceci implique que tu dois construire ton chemin en partant de A et en remontant jusqu'à D.
    Bonsoir Trap D, malgrès beaucoup d'efforts de ma part je n'arrive pas à résoudre mon problème, je sais que tu n'es pas là pour résoudre mes exos, mais si tu peux jeter un coup d'oeil sur mon code qui fonctionne pour 4 villes au dela je n'y arrive pas .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    connection(D,A,X,_):-segment(D,A,X,_).
    connection(D,A,X,_):-segment(D,A1,X,_),connection(A1,A,X,_).
     
     
    % 3.2 prédicat description(D,A,L) qui vérifie qu'on peut aller de la ville D à la ville A en passant par les villes
    %   se trouvant dans la liste L lue de gauche à droite. On vérifiera que D est la première ville de L et A 
    %    la dernière ville de L.
    % renverse(L,Lrev)  pour la 2ème règle on vide la 1ère liste dans la 3ème
     
    inverse([],L,L).
    inverse([X|L],L2,L3):-inverse(L,L2,[X|L3]).
    renverse(L,L2):-inverse(L,L2,[]).
    der_vil(L,[A|L2]):-renverse(L,[A|L2]). % soit L2 liste inversée de L donc cette règle me donne le premier élément de L2(A) donc le dernier de L
     
    description(D,A,[D|L]):-segment(D,A,X,_),der_vil(L,[A|L2]),!.
    description(D,A,[D,A1|L]):-segment(D,A1,X,_),connection(A1,A,X,_),der_vil(L,[A|L2]),!.
    description(D,A,[D,A1,_|L]):-segment(D,A1,X,_),(connection(A1,_,X,_),segment(A1,_,X,_);segment(A1,A,X,_)),der_vil(L,[A|L2]),!.
    Merçi et à +

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne comprends pas : j'ai rajouté le segment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    segment(marseille, nice, train, 200).
    et avec ton code j'obtiens
    4 ?- description(paris, nice, L).
    L = [paris, lyon, nice].
    Ta première ville est bien paris, et la dernière nice !

    Maintenant, pour ton problème initial, je n'ai pas tout compris de ce que tu voulais, ce que je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    % base de faits
    segment(paris,lyon,train,200).
    segment(lyon,toulouse,train,600).
    segment(toulouse,montpellier,train,750).
    segment(montpellier,marseille,train,100).
    segment(marseille, nice, train, 200).
     
     
    description(D,A, [D, A]):-
    	segment(D,A,_X,_),
    	!.
     
    description(D,A,[D|L]):-
    	segment(D,A1,_X,_),
    	description(A1,A, L).
    est-ce suffisant ?
    6 ?- description(paris, nice,L).
    L = [paris, lyon, toulouse, montpellier, marseille, nice].
    Le premier est bien paris, le dernier nice, et tu as toute la liste des villes
    "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

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 755
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Je ne comprends pas : j'ai rajouté le segment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    segment(marseille, nice, train, 200).
    et avec ton code j'obtiens
    Ta première ville est bien paris, et la dernière nice !

    Maintenant, pour ton problème initial, je n'ai pas tout compris de ce que tu voulais, ce que je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    % base de faits
    segment(paris,lyon,train,200).
    segment(lyon,toulouse,train,600).
    segment(toulouse,montpellier,train,750).
    segment(montpellier,marseille,train,100).
    segment(marseille, nice, train, 200).
     
     
    description(D,A, [D, A]):-
    	segment(D,A,_X,_),
    	!.
     
    description(D,A,[D|L]):-
    	segment(D,A1,_X,_),
    	description(A1,A, L).
    est-ce suffisant ?
    Le premier est bien paris, le dernier nice, et tu as toute la liste des villes
    Bonsoir et merçi pour ton aide;en effet ton code fonctionne impeccablement pour 4 et 5 villes quand je lance :
    | ?- description(paris,nice,[paris,lyon,toulouse,montpellier,marseille,nice]).

    et que j'enlève successivement une ville de la liste il me réponds "no" c'est ce que je voulais.
    merçi encore et à +

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

Discussions similaires

  1. Se positionner sur la dernière valeur d'une liste déroulante
    Par lthibert dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/03/2008, 15h16
  2. Réponses: 1
    Dernier message: 21/04/2007, 09h34
  3. dernière valeur d'une liste par défaut
    Par faulk dans le forum Access
    Réponses: 2
    Dernier message: 11/07/2006, 12h34
  4. Liste sélectioner la dernière valeur ajoutée par un popup.
    Par guano dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/03/2006, 17h03
  5. Tester les valeur d'une liste déroulante
    Par st0nky dans le forum Langage
    Réponses: 1
    Dernier message: 04/12/2005, 14h52

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