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 :

Exercice Listes decodage


Sujet :

Prolog

  1. #1
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 17
    Par défaut Exercice Listes decodage
    Bonjour tout le monde,
    Voici l'exo qui me donne du fil à retordre:
    Début énoncé
    chaque lettre représente un chiffre et un seul. Trouver la ou les solutions à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    %MOT+MOT+MOT=BLA
    %FORTY+TEN+TEN=SIXTY
    %NEUF+UN+UN=ONZE
    %UNE+UNE=DEUX
    %CHIEN+CHASSE=GIBIER
    proposition de solution (la plus simple possible), pour le premier :
    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
    /* je décris l'ensemble des possibilités envisageables */
    chiffre(0).
    chiffre(1).
    chiffre(2).
    chiffre(3).
    chiffre(4).
    chiffre(5).
    chiffre(6).
    chiffre(7).
    chiffre(8).
    chiffre(9).
     
    /* je note ce que je veux */
    solution([M,O,T,B,L,A]) if
    chiffre(M),M=\=0,
    chiffre(O),O=\=M,
    chiffre(T),T=\=O,T=\=M,
    chiffre(B),B=\=0,B=\=T,B=\=O,B=\=M,
    chiffre(L),L=\=B,L=\=T,L=\=O,L=\=M,
    chiffre(A),A=\=L,A=\=B,A=\=T,A=\=O,A=\=M,
    3*(M*100+O*10+T)=:=B*100+L*10+A.
    Remarque (importante) : on détaille ici exactement et précisément ce que l'on veut (le "quoi"), mais
    on ne donne aucune indication sur la méthode de résolution du problème, pas d'algorithme (le
    "comment"), on laisse Prolog se débrouiller.
    Fin énoncé

    1ère question: 3*(M*100+O*10+T)=:=B*100+L*10+A. Je ne comprends pas du tout d'où ça découle, j'ai recherché: peut être ça concerne la priorité des opérateur, l'ordre du terme composé mais quand bien même je n'ai pas compris comment cela est construit...

    Ensuite j'ai écris ceci pour répondre à l'exercice:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    %Règles listes:
    %Association d'une lettre dans une liste à un chiffre
    chiffres([T|[]]):-chiffre(T).
    chiffres([T|Q]):-chiffre(T),chiffres(Q).
     
    %Appartenance à une liste:
    membre(X,[X|_]).
    membre(X,[_|Q]):-membre(X,Q).
     
    %Difference des membres d'une liste (nous évite de répéter à chaque fois que toutes les lettres ont un chiffre différent)
    differents([]).
    differents([T|Q]):- not(membre(T,Q)), differents(Q).
     
    %Unifie une liste à une variable
    evalue(ListeChiffres,R) :-
    	append(TousSaufDernier,[DernierELement],ListeChiffres),
    	evalue(TousSaufDernier,X),
    	R is DernierELement + 10*X.
    evalue([X],X).
     
     
    %Solutions
     
    %MOT+MOT+MOT=BLA
    solution([M,O,T,B,L,A]):-
          chiffre(M),M=\=0,
          chiffre(O),O=\=M,
          chiffre(T),T=\=O,T=\=M,
          chiffre(B),B=\=0,B=\=T,B=\=O,B=\=M,
          chiffre(L),L=\=B,L=\=T,L=\=O,L=\=M,
          chiffre(A),A=\=L,A=\=B,A=\=T,A=\=O,A=\=M,
          3*(M*100+O*10+T)=:=B*100+L*10+A.
     
     
    %FORTY+TEN+TEN=SIXTY
    solution([F,O,R,T,Y,E,N,S,I,X]):-
    evalue([F,O,R,T,Y],Forty), 
    evalue([T,E,N],Ten),
    evalue([S,I,X,T,Y],Sixty),
    Forty+Ten+Ten =:= Sixty,
    fail.
     
     
     
    %NEUF+UN+UN=ONZE
    solution([N,E,U,F,O,Z]):-
    chiffres([N,E,U,F,O,Z]),
    differents([N,E,U,F,O,Z]),
    evalue([N,E,U,F],Neuf),  
    evalue([U,N],Un),
    evalue([O,N,Z,E],Onze),
    Onze =:= Neuf+Un+Un,
    fail.
     
    %UNE+UNE=DEUX
    solution([U,N,E,D,X]):-
    chiffres([U,N,E,D,X]),
    differents([U,N,E,D,X]),
    evalue([U,N,E],Une),  
    evalue([D,E,U,X],Deux),
    Une+Une =:= Deux,
    fail.
     
     
     
    %CHIEN+CHASSE=GIBIER
    solution([C,H,I,E,N,A,S,G,B,R]):-
    chiffres([C,H,I,E,N,A,S,G,B,R]),
    differents([C,H,I,E,N,A,S,G,B,R]),
    evalue([C,H,I,E,N],Chien),  
    evalue([C,H,A,S,S,E],Chasse),
    evalue([G,I,B,I,E,R],Gibier),  
    Chien+Chasse =:= Gibier,
    fail.
    Problème: Pour CHIEN+CHASSE=GIBIER et pour FORTY+TEN+TEN=SIXTY ça met trop de temps on pourrait faire une permutation peut être pour alléger les calcul ou autre je ne sais pas afin que ça s'exécute plus vite!

    Merci pour vos réponses!

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 947
    Par défaut
    3*(M*100+O*10+T)=:=B*100+L*10+A.
    est faux, c'est
    3*(B*100+L*10+A) =:= M*100+O*10+T
    Maintenant pour associer les lettres à des chiffres utilisez maplist :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maplist(chiffre, [B,L,A,M,O,T]).
    fait très bien l'affaire.
    Plutôt que d'utiliser \= utilisez dif/2 bien plus puissant. Réfléchissez aussi à une utilisation de maplist dans un prédicat récursif pour imposer la différenciation. (le premier de la liste est différent des éléments du reste de la liste).
    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 averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 17
    Par défaut C'est bon!!
    Ca marche merci!

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

Discussions similaires

  1. [Exercices] Liste d'exercices corrigés en shell script et bash
    Par ok.Idriss dans le forum Shell et commandes GNU
    Réponses: 47
    Dernier message: 10/03/2025, 15h09
  2. Exercice liste chainée
    Par darkwall_37 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/12/2010, 05h44
  3. [PHP 5.2] Exercice : liste de données + remplisage de champ
    Par Raphael1980 dans le forum Langage
    Réponses: 0
    Dernier message: 28/04/2010, 14h52
  4. Exercice liste liée
    Par Isendar dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 30/05/2008, 08h50
  5. Probleme exercice list
    Par Gebudi. dans le forum C++
    Réponses: 6
    Dernier message: 31/07/2006, 16h43

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