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

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 71
    Points : 41
    Points
    41
    Par défaut mettre chaque chiffre d'un nombre dans une liste
    Bonjour,

    Je cherche à transformer le nombre 123 par exemple en une liste L=[1,2,3].

    Voici mon programme.

    Code prolog : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    split(0,L,L) :- !.
    split(N,L,R) :-
    	NewN is floor(N / 10),
    	Z is N mod 10,
           	split(NewN,[Z|L],R).
    listDigits(N,L) :- split(N,[],R).

    Voici ce que donne la trace de listDigits(102,L). :

    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
    19
    20
    21
    22
    23
      Call: (6) listDigits(102, _G26748) ? creep
       Call: (7) split(102, [], _G26819) ? creep
    ^  Call: (8) _G26825 is floor(102/10) ? creep
    ^  Exit: (8) 10 is floor(102/10) ? creep
    ^  Call: (8) _G26828 is 102 mod 10 ? creep
    ^  Exit: (8) 2 is 102 mod 10 ? creep
       Call: (8) split(10, [2], _G26830) ? creep
    ^  Call: (9) _G26836 is floor(10/10) ? creep
    ^  Exit: (9) 1 is floor(10/10) ? creep
    ^  Call: (9) _G26839 is 10 mod 10 ? creep
    ^  Exit: (9) 0 is 10 mod 10 ? creep
       Call: (9) split(1, [0, 2], _G26841) ? creep
    ^  Call: (10) _G26847 is floor(1/10) ? creep
    ^  Exit: (10) 0 is floor(1/10) ? creep
    ^  Call: (10) _G26850 is 1 mod 10 ? creep
    ^  Exit: (10) 1 is 1 mod 10 ? creep
       Call: (10) split(0, [1, 0, 2], _G26852) ? creep
       Exit: (10) split(0, [1, 0, 2], [1, 0, 2]) ? creep
       Exit: (9) split(1, [0, 2], [1, 0, 2]) ? creep
       Exit: (8) split(10, [2], [1, 0, 2]) ? creep
       Exit: (7) split(102, [], [1, 0, 2]) ? creep
       Exit: (6) listDigits(102, _G26748) ? creep
    true.

    Dans la trace, ma liste est bien constituée à un moment donné (en rouge) mais rien ne s'affiche !

    Avez-vous une idée pour remédier au problème ?

    Merci d'avance ,

    Romain

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    septembre 2006
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2006
    Messages : 2 663
    Points : 3 760
    Points
    3 760
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    split(N,[N]) :- N < 10, !.
    split(N,L) :- 
    	N1 is N // 10, 
    	R is mod(N,10), 
    	split(N1,L1),
    	append(L1,[R],L).
    NB
    la syntaxe de la division entière peut être différente d'une implémentation à l'autre (ici //)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 71
    Points : 41
    Points
    41
    Par défaut
    Trop bien ça marche !!

    Merci beaucoup, à + .

    Romain

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

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 889
    Points : 6 329
    Points
    6 329
    Par défaut
    rom117 >> le dernier prédicat était incorrect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listDigits(N,L) :- split(N,[],R).
    Il fallait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listDigits(N,L) :- split(N,[],L).
    Celà devait être signalé à la compile (au moins sous SWI-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

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 71
    Points : 41
    Points
    41
    Par défaut
    Rah mon erreur était trop bête, ça fait rager...
    Merci .
    J'ai dû faire trop de Prolog aujourd'hui...

    Définitivement Résolu .


    Romain

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

Discussions similaires

  1. Extraire un chiffre ou un nombre dans une désignation
    Par guismoman60 dans le forum Macros et VBA Excel
    Réponses: 32
    Dernier message: 19/09/2014, 16h30
  2. [XL-2013] chercher un nombre dans une liste
    Par SimKmil dans le forum Excel
    Réponses: 3
    Dernier message: 03/04/2014, 12h30
  3. Trouver un encadrement d'un nombre dans une liste
    Par boulette85 dans le forum Débuter
    Réponses: 9
    Dernier message: 15/07/2008, 14h33
  4. Récupérer 1er chiffre d'un nombre dans une requête
    Par beletteroi dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 26/06/2006, 14h33
  5. Réponses: 4
    Dernier message: 24/04/2003, 23h28

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