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 :

Prédicat somme(L1,L2,L3) Prolog


Sujet :

Prolog

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 208
    Points
    208
    Par défaut Prédicat somme(L1,L2,L3) Prolog
    bonsoir,
    J'ai besoin d'écrire un prédicat somme qui vérifie que la liste L3 est la somme, terme à terme des valeurs des listes L1 et L2
    Ex :
    ?- somme([1,2,3],[2,3,5]).
    L= [3,5,8]
    ok

    Pour ma part j'ai écris cette règle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    somme(X,[Y|L1],X2,[Y2|L2],[X3|L3]):-X=Y,X2=Y2,X3 is (X+X2).
    qui fonctionne pour les valeurs en tête de liste, mais je n'arrive pas écrire la règle pour la suite de la liste.
    Si quelqu'un a une idée merçi
    A +

  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
    Ça c'est la technique de base de travail sur les listes.
    On va supposer que les deux listes ont la même longueur.

    Le cas simple, c'est que si les deux listes sont vides, alors le résultat est une liste vide.

    Maintenant, reprenons ce que tu as écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme(X,[Y|L1],X2,[Y2|L2],[X3|L3]):-X=Y,X2=Y2,X3 is (X+X2).
    Tu t'es un peu compliqué la vie, on peut écrire exactement la même chose mais plus simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    somme([Y1|L1],[Y2|L2],[Y3|L3]):-
          Y3 is (Y1+Y2).
    tu auras donc un prédicat somme(L1, L2, LS) qui réussit si LS est la somme terme à terme des listes L1 et L2.

    La règle que tu as écrite calcule la somme des premiers éléments des listes.
    Il faut donc dans la même règle, appeler le calcul de la somme des autres éléments des listes.

    Maintenant, à toi de voir comment tu peux faire cet appel en tenant compte de ma remarque préliminaire sur les listes vides et sur la manière de construire les listes en ajoutant des éléments en tête de listes avec l'opérateur | .

    Bon courage.
    "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
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 208
    Points
    208
    Par défaut langue au chat ?
    Citation Envoyé par Trap D Voir le message
    Ça c'est la technique de base de travail sur les listes.
    On va supposer que les deux listes ont la même longueur.

    Le cas simple, c'est que si les deux listes sont vides, alors le résultat est une liste vide.

    Maintenant, reprenons ce que tu as écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme(X,[Y|L1],X2,[Y2|L2],[X3|L3]):-X=Y,X2=Y2,X3 is (X+X2).
    Tu t'es un peu compliqué la vie, on peut écrire exactement la même chose mais plus simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    somme([Y1|L1],[Y2|L2],[Y3|L3]):-
          Y3 is (Y1+Y2).
    tu auras donc un prédicat somme(L1, L2, LS) qui réussit si LS est la somme terme à terme des listes L1 et L2.

    La règle que tu as écrite calcule la somme des premiers éléments des listes.
    Il faut donc dans la même règle, appeler le calcul de la somme des autres éléments des listes.

    Maintenant, à toi de voir comment tu peux faire cet appel en tenant compte de ma remarque préliminaire sur les listes vides et sur la manière de construire les listes en ajoutant des éléments en tête de listes avec l'opérateur | .

    Bon courage.
    salut Trap D, voilà j'ai cogité un peu et voiçi ce que j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    somme([],[],[]). % règle 1
    somme([X1|L1],[X2|L2],[X3|L3]):-X3 is (X1 + X2). % règle 2
    somme([_,X1|L1],[_,X2|L2],[_,X3|L3]):-X3 is (X1+X2),somme([L1],[L2],[L3]).
    % règle 3
    L a règle 1 reprends ce que tu m'a dis par apport à la somme de listes vides: içi vérité absolue pas de problème.
    La règle 2 reprends ce que j'avais écris en simplifiant comme tu me l'as suggéré et au lieu de Y j'ai pris X (elle fonctionne)
    La règle 3 là j'ai pensé rajouté X3 égal à X1 + X2 qui se trouvent eux même après la tête de liste, puis je rappelle somme en récursivité mais voilà ça fonctionne pas Prolog me réponds "no" :

    | ?- somme([1,2,3],[2,3,5],[L3]).

    L3 = 3 ? ;

    no

    Si tu pouvais me donner un petit coup de pouce pour que j'avance... merçi
    A +

  4. #4
    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
    Il te faut deux règles pour calculer la somme élément par élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme([],[],[]). % règle 1
    ça c'est correct

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    somme([X1|L1],[X2|L2],[X3|L3]):-
       X3 is (X1 + X2). % règle 2
    ca c'est un bon début mais tu ne peux pas t'arréter la, comment est calculer L3 à partir de L1 et L2 ?

    C'est ici que tu dois réfléchir, il faut utiliser quelque part dans la deuxième règle somme(L1, L2, L3), à toi de voir à quel endroit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    somme([X1|L1],[X2|L2],[X3|L3]):-
      % ici ....
      X3 is (X1 + X2)
      % ou là .... % règle 2


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    somme([_,X1|L1],[_,X2|L2],[_,X3|L3]):-X3 is (X1+X2),somme([L1],[L2],[L3]).
    ça, c'est inutile
    "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

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Il te faut deux règles pour calculer la somme élément par élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme([],[],[]). % règle 1
    ça c'est correct

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    somme([X1|L1],[X2|L2],[X3|L3]):-
       X3 is (X1 + X2). % règle 2
    ca c'est un bon début mais tu ne peux pas t'arréter la, comment est calculer L3 à partir de L1 et L2 ?

    C'est ici que tu dois réfléchir, il faut utiliser quelque part dans la deuxième règle somme(L1, L2, L3), à toi de voir à quel endroit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    somme([X1|L1],[X2|L2],[X3|L3]):-
      % ici ....
      X3 is (X1 + X2)
      % ou là .... % règle 2


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    somme([_,X1|L1],[_,X2|L2],[_,X3|L3]):-X3 is (X1+X2),somme([L1],[L2],[L3]).
    ça, c'est inutile
    O k j'ai essayé ce code et ça change rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    somme([],[],[]).
    somme([X1|L1],[X2|L2],[X3|L3]):-X3 is (X1 + X2),somme(L1,L2,L3).
    Prolog réponds "no"

    et ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    somme([],[],[]).
    somme([X1|L1],[X2|L2],[X3|L3]):-somme(L1,L2,L3),X3 is (X1 + X2).
    Prolog réponds "no" aussi.

    J'ai pensé à rajouter cette 3ème règle bien que tu m'ais dit que ça servait à rien et en effet ça sert à rien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    somme([],[],[]).
    somme([X1|L1],[X2|L2],[X3|L3]):-X3 is (X1 + X2).
    somme([_,X1|L1],[_,X2|L2],[_,X3|L3]):-X3 is (X1+X2),somme(L1,L2,L3). (règle 3)
    Prolog réponds :
    L3 = 3 ? ;

    no

    Donc là je vois pas quoi faire si tu peux m'aider merçi
    A +

  6. #6
    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
    Ce code est correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    somme([],[],[]).
    somme([X1|L1],[X2|L2],[X3|L3]):-
      somme(L1,L2,L3),
      X3 is (X1 + X2).
    Voilà ce que j'obtiens avec
    5 ?- somme([1,2,3],[2,3,5],L).
    L = [3, 5, 8] ;
    false.
    "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 actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Ce code est correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    somme([],[],[]).
    somme([X1|L1],[X2|L2],[X3|L3]):-
      somme(L1,L2,L3),
      X3 is (X1 + X2).
    Voilà ce que j'obtiens avec

    Merçi pour ta réponse en fait le problème venait qu'il fallait lancer la requête comme ça comme tu l'as écrit :


    somme([1,2,3],[2,3,5],L3).

    et non comme je faisais :

    | ?- somme([1,2,3],[2,3,5],[L3]).

    no
    | ?- somme([1,2,3],[2,3,5],[L]).

    no

    L ou L3 qu'importe... curieusement d'ailleurs car en 3ème liste dans mon code j'avais notifié L3
    Merçi pour ton aide pour c'est résolu si t'as d'autres commentaires te gène pas.
    A +

  8. #8
    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
    somme([1,2,3],[2,3,5],[L3]).
    C'est le genre d'erreur qu'on fait au début, j'ai fait les mêmes...
    "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

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

Discussions similaires

  1. prédicat somme plus court
    Par Klaine dans le forum Prolog
    Réponses: 4
    Dernier message: 22/12/2011, 03h32
  2. Prédicat Prolog Voyage
    Par xeron33 dans le forum Prolog
    Réponses: 8
    Dernier message: 09/03/2010, 21h01
  3. prédicat plus_cher Prolog
    Par xeron33 dans le forum Prolog
    Réponses: 10
    Dernier message: 14/11/2009, 08h59
  4. Calcul des prédicats dans prolog
    Par nschoe dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 01/11/2008, 00h56
  5. Réponses: 1
    Dernier message: 09/01/2007, 14h33

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