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
    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
    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
    Trop bien ça marche !!

    Merci beaucoup, à + .

    Romain

  4. #4
    Rédacteur/Modérateur

    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
    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

###raw>template_hook.ano_emploi###