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 :

Le jeu des chiffres


Sujet :

Prolog

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Points : 22
    Points
    22
    Par défaut Le jeu des chiffres
    On veut fabriquer un nombre donné à partir d’une liste de nombres entiers (comme dans le jeu “les chiffres et les lettres”).
    On a droit uniquement à l’addition. on veut écrire un prédicat chiffre1(+Liste, +Cible,-Solution) dans lequel la solution est sous forme d’une liste.
    exemple:
    chiffre1([5,50,45,3],50,S).
    donne :
    S = [5,45];
    S = [50].

    J'arrive pas à trouver une solution pour ce problème :\

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Points : 22
    Points
    22
    Par défaut
    J'ai fais ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    chiffres(L,C,S):-
        chiffraux(L,0,C,S).
    chiffraux(_,A,A,[A]).
    chiffraux([A|L],M,C,S):-
        D is M+A,
        D =< C,
        %S is [A|_],
        chiffraux(L,D,C,S).

  3. #3
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Tu te compliques la vie je pense, ça se fait en un seul prédicat
    Il faut considérer trois cas :
    • Le premier élément de L1 est le résultat ;
    • On garde le premier élément de L1 dans la somme et on en cherche d'autres dans la suite de L1 ;
    • On va chercher d'autres éléments dans la suite de L1, sans prendre le premier élément.

    Je te laisse reprendre sur ces bases ?

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par cLaSic
    On veut fabriquer un nombre donné à partir d’une liste de nombres entiers (comme dans le jeu “les chiffres et les lettres”).
    Ceci peut un peu t'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    additionPossible(L, S) :-
      select(A, L, T),
      select(B, T, _),
      S is A+B.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par pcaboche
    Ceci peut un peu t'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    additionPossible(L, S) :-
      select(A, L, T),
      select(B, T, _),
      S is A+B.
    c'est bien compliqué

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Eusebius
    c'est bien compliqué
    Gné ?

    Y'a pas plus simple pour trouver toutes les additions possibles à partir de 2 éléments de la liste.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par pcaboche
    Gné ?

    Y'a pas plus simple pour trouver toutes les additions possibles à partir de 2 éléments de la liste.
    Si c'est un exercice, ce que je pense (mais je peux me tromper), il y a peu de chances qu'on attende de lui qu'il utilise un prédicat prédéfini du langage, et donc par "c'est bien compliqué", j'entends qu'on peut tout faire avec un seul prédicat et en quatre lignes de code.

    Ta solution, (comme d'habitude ), sera sans doute la plus efficace.

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Eusebius
    Ta solution, (comme d'habitude ), sera sans doute la plus efficace.
    Pas forcément, en ce moment je suis très fatigué...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Le truc suivant débuggué devrait marcher (j'ai pas de prolog au bureau!):

    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
    but_chiffres(l, r_es, s_ol)->
    	chiffres(l, nil, r_es, s_ol);
     
    chiffres(l, l', r_es, e1.nil)->
    	retirer(e, l, l1)
    	addition(e.l', 0, a_dd)
    	val(a_dd '=' r_es, 1);
     
    chiffres(l, l', r_es, e1.e2.s_ol)->
    	retirer(e, l, l1)
    	addition(e.l', 0, a_dd)
    	val(a_dd '<' r_es, 1)
    	chiffres(l1, e.l', r_es, s_ol);
     
    addition(n1.nil, n2, s_ol)->
    	val(n1 '+' n2, s_ol);
     
    addition(n1.l, n2, s_ol)->
    	val(n1 '+' n2, n)
    	addition(l, n, s_ol);

    EDIT: replacement de "eval" par "val"

  10. #10
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par billynirvana
    Le truc suivant débuggué devrait marcher (j'ai pas de prolog au bureau!):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    but_chiffres(l, r_es, s_ol)->
    	chiffres(l, nil, r_es, s_ol);
     
    [...]
    Je crois qu'il ne travaille pas dans cette syntaxe

  11. #11
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    remplacer les fleches par :- et des points virgules par ., c'est trop compliqué à mon avis...

    Il est vrai pour certains buts par contre.

  12. #12
    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
    La solution évoquée (mais non publiée) par Eusébius est tout à fait correcte.
    Quelle est la signification exacte de eval("n1+n2", s_ol) ?
    "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

  13. #13
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Je m'en voudrais de faire mon cachottier, je vais décidément avoir une sale réputation sur ce forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chiffres([S|_], S, [S]).
    chiffres([A|Tail], S, [A|STail]) :-
      S2 is S - A,
      chiffres(Tail, S2, STail).
    chiffres([_|Tail], S, L) :-
      chiffres(Tail, S, L).

  14. #14
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Citation Envoyé par Trap D
    La solution évoquée (mais non publiée) par Eusébius est tout à fait correcte.
    Quelle est la signification exacte de eval("n1+n2", s_ol) ?
    En fait, je me suis gourré dans la syntaxe, c'est plutot val(n1 '+' n2, s_ol); Elle evalue l'expression arithmétique donnée en premier argument et lie le résultat avec s_ol.

  15. #15
    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
    C'est ce que je pensais, mais la syntaxe m'avait paru bizarre.
    "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. Simuler le jeu des chiffres et des lettres
    Par iMech dans le forum C
    Réponses: 21
    Dernier message: 12/12/2014, 10h23
  2. Le jeu des chiffres et des lettres
    Par shayw dans le forum Contribuez
    Réponses: 0
    Dernier message: 22/05/2014, 22h56
  3. [Sources] Jeu des chiffres et des lettres
    Par User dans le forum Contribuez
    Réponses: 29
    Dernier message: 29/11/2008, 13h19
  4. Commande pour afficher des chiffres apres la virgule
    Par manar dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/09/2004, 18h28

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