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 :

Repeter élément liste


Sujet :

Prolog

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Repeter élément liste
    Bonjour,

    je bloque sur un prédicat qui pour une liste L, on répète N fois chaque élément de la liste & donne une liste résultat Lr : repeter([a,b,c], 3, Lr). -> Lr = [a,a,a,b,b,b,c,c,c].

    Pour commencer j'y vais par étape en faisant un prédicat qui répète un élément X, N fois & on met le résultat dans une liste : test(2, 3, Lr). -> Lr = [2,2,2].

    J'ai donc ça pour le moment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    test(_,0,[]).
    test(X, N, ):-
         N>0,
         Lr = [X], 
         Tmp is N-1,
         test(X, Tmp, ).
    Merci d'avance pour votre aide

    EDIT
    Bon j'en suis arrivé à là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    test(_,_,[]).
    test(X, N, [X|Lr]):-
         N>0,
         Tmp is N-1,
         test(X, Tmp, Lr).
     
    repete([], _, []).
    repete([T|Q], N, Lr):-
          test(T, N, Lr),
          repete(Q, N, Lr).
    & là je séche un peu

    EDIT FINAL

    Bon j'ai finalement réussi, je post ça ici si besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    repeteElement(_,_,[]).
    repeteElement(X, N, [X|Lr]):-
         N>0,
         Tmp is N-1,
         repeteElement(X, Tmp, Lr). //Exemple: repeteElement(a, 3, Lr). -> Lr = [a,a,a].
    
    repeter([], _, []).
    repeter([T|Q], N, Lfinal):-
          repeteElement(T, N, Lintermediaire),
          append(Lintermediaire, Lresultat, Lfinal),
          repeter(Q, N, Lresultat). // Exemple: repeter([a,b,c], 3, Lr). -> Lr = [a,a,a,b,b,b,c,c,c].
    Je clos, bonne soirée.

  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
    Bonjour et bravo, tu as résolu ton problème toi même !
    Je voudrais simplement montrer des possibilités de Prolog très intéressantes :
    Sur le fait de dupliquer un terme pour obtenir la liste, ce que tu as fait fonctionne, mais je vais te montrer la puissance de Prolog en utilisant la bibliothèque clpfd
    On écrit alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    :- use_module(library(clpfd)).
     
    repeter_un_element(Elem, N, [Elem | R1]):-
        N #> 0,
        N1 #= N - 1,
        repeter_un_element(Elem, N1, R1).
     
    repeter_un_element(_Elem, 0, []).
    Voici ce qu'on peut obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ?- repeter_un_element(a, 3, L).
    L = [a, a, a] ;
    false.
     
    ?- repeter_un_element(X, Y, [a,a]).
    X = a,
    Y = 2 ;
    false.
    A partir du résultat recherché, tu peux obtenir les arguments d'appel, peu de langages sont capables de faire ça !

    Une autre manière de coder répéter est d'utiliser un style "fonctionnel" avec foldl puisque tu travailles successivement sur chaque élément de la liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    :- use_module(library(lambda)).
     
    repeter(In, N, Out) :-
        foldl(N +\X^Y^Z^(repeter_un_element(X, N, T),
                         append(Y, T, Z)),
              In, [], Out).
    Bon courage pour Prolog, c'est un langage passionnant !
    "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. tableau imbrique repete ma liste trop de fois
    Par kate59 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/08/2011, 11h10
  2. Réponses: 1
    Dernier message: 04/01/2009, 18h41
  3. Recupération éléments liste de choix
    Par Harpoon dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/11/2007, 18h03
  4. Comment selectionner un élément listé?
    Par darkann dans le forum IHM
    Réponses: 5
    Dernier message: 07/05/2007, 15h12
  5. Pb ajouter/suppression élément liste
    Par jerome38000 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/09/2005, 16h54

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