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 :

Conversion atomes-listes pour l'exercice SEND+MORE=MONEY


Sujet :

Prolog

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Conversion atomes-listes pour l'exercice SEND+MORE=MONEY
    Bonjour, je suis débutant en Prolog et j'utilise GNU-Prolog.
    J'ai un exercice à faire en Prolog qui est de calculer les cryptarithmes (type SEND+MORE=MONEY ou DEUX+NEUF=ONZE).
    J'ai effectué mon programme en plusieurs versions:
    crypta([D,E,U,X],[N,E,U,F],[O,N,Z,E]).
    crypta([D,E,U,X],[N,E,U,F],[O,N,Z,E],10). (prise en compte de la base de calcul)
    => Ces deux versions marchent.

    Maintenant, la version "ultime" serait de rentrer directement les mots sous formes d'atomes (c'est bien le mot à utiliser ?):
    crypta(deux,neuf,onze,10)

    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
    /* Conversion des atomes en listes */
    atom_chars(A1,L1),
    atom_chars(A2,L2),
    atom_chars(A3,L3),
     
    /* Inversion des listes */
    reverse(L1,RA1),
    reverse(L2,RA2),
    reverse(L3,RA3),
     
    /* Concaténation des listes */
    append(RA1,RA2,Ltemp),
    append(Ltemp,RA3,L),
     
    /* Sort des listes */
    sort(L,Lsort),
     
    /* Domain */
    LIMIT is BASE-1,
    fd_domain(Lsort,0,LIMIT),
    Mais il y a un problème lors du fd_domain, la liste n'est pas correcte. En effet, atom_chars(deux,L1) me renvoie [d,e,u,x] alors qu'il me faudrait [D,E,U,X]. Comment peut-on associer une variable à chaque élément de cette liste (automatiquement, car les mots ont une longueur variable) ?

  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
    Essaie celà, cà fonctionne en SWI-Prolog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    to_upper(Min, Maj) :-
    	atom_chars(Min,L1),
    	maplist(my_char_type, L1,Maj).
     
    my_char_type(Min, Maj) :-
    	char_type(Maj, to_upper(Min)).
    Sortie :
    2 ?- to_upper(deux, Maj).
    Maj = ['D', 'E', 'U', 'X'].
    Une autre version possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    to_upper1(Min, Maj) :-
    	upcase_atom(Min, MA),
    	atom_chars(MA, Maj).
    "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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci !
    Mais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    uncaught exception: error(existence_error(procedure,maplist/3),to_upper/2)
    uncaught exception: error(existence_error(procedure,upcase_atom/2),to_upper1/2)


    Je vais fouiller dans la doc pour voir s'il n'y a pas d'équivalent.

  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
    Je viens de m'apercevoir que ce n'est pas forcément bon, à l'affichage, on obtient des atomes (les lettres sont entre quotes) et non pas des variables !!!
    "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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Je viens de m'apercevoir que ce n'est pas forcément bon, à l'affichage, on obtient des atomes (les lettres sont entre quotes) et non pas des variables !!!
    En effet, je n'avais pas fait attention non plus.

    Pour "contourner" (ou mieux cerner) le problème, est-il possible d'associer une variable à chaque élément de [d,e,u,x], peu importe son nom ? A chaque élément d'une liste ?

  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
    Non, mais tu peux peut-être travailler avec 2 listes parallèles, une liste de variables et l'autre représentant les chiffres.
    "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

Discussions similaires

  1. Encore un SEND+MORE=MONEY
    Par ghassenus dans le forum Prolog
    Réponses: 1
    Dernier message: 29/07/2011, 22h36
  2. send+more=money, temps de calcul
    Par patrick974 dans le forum Prolog
    Réponses: 11
    Dernier message: 19/09/2007, 13h59
  3. Réponses: 4
    Dernier message: 31/10/2005, 18h37
  4. Demande d'aide pour un exercice
    Par IDE dans le forum C
    Réponses: 3
    Dernier message: 29/10/2005, 15h09
  5. Réponses: 6
    Dernier message: 06/10/2005, 16h02

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