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 :

Problème des 2 cruches


Sujet :

Prolog

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut Problème des 2 cruches
    Bonjour à tous,

    En faite j'arrive pas à coder le problème des 2 cruches. le problème c'est : J'ai 2 cruches un de 5l et un autre de 8L et je veux avoir exactement 4l.
    Je sais en théorie ce qu'il faut faire mais je ne peux pas le coder.

    Merci de votre aide.

  2. #2
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    voici le code que j'ai trouvé dites moi s'il ya une erreur.

    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
     
     
    /* Ecrit par Nicolas Zinovieff (p6mip138) */
     
     
    /*
    	etatactuel(grande(X),petite(Y)) signifie que la grande contient X litres et la petite Y litres
    */
     
     
    /* 
    remplir-vider les cruches */
     
    etatsuivant(etatactuel(grande(X),petite(Y)),etatactuel(grande(8),petite(Y))) :- X < 8.
    etatsuivant(etatactuel(grande(X),petite(Y)),etatactuel(grande(X),petite(5))) :- Y < 5.
    etatsuivant(etatactuel(grande(X),petite(Y)),etatactuel(grande(0),petite(Y))) :- X > 0.
    etatsuivant(etatactuel(grande(X),petite(Y)),etatactuel(grande(X),petite(0))) :- Y > 0.
    /* vider la grande dans la petite */
    etatsuivant(etatactuel(grande(XX),petite(YY)),etatactuel(grande(X),petite(5))) :- XX > (5 - YY), X is XX - (5 - YY), X < XX.
    etatsuivant(etatactuel(grande(XX),petite(YY)),etatactuel(grande(0),petite(Y))) :- XX =< (5 - YY), Y is YY + XX, Y > YY.
    /* vider la petite dans la grande */
    etatsuivant(etatactuel(grande(XX),petite(YY)),etatactuel(grande(8),petite(Y))) :- YY > (8 - XX), Y is YY - (8 - XX), Y < YY.
    etatsuivant(etatactuel(grande(XX),petite(YY)),etatactuel(grande(X),petite(0))) :- YY =< (8 - XX), X is XX + YY, XX+YY > XX.
     
    /* recherche avec accumulateur */
    possible_gallons(X, X, CList, CList).
    possible_gallons(X, Y, CList, List) :-
    etatsuivant(X, Z),
    not(member(Z, CList)),
    possible_gallons(Z, Y, [Z | CList], List).
     
    chemin_gallons(X, Y, FoundPath) :- possible_gallons(X, Y, [X], FoundPath).
     
    /* recherche en largeur */
    recherche_largeur(X,Y,C) :- cherche(Y,[[X]],C).
     
    cherche(Y,[[Y|Chs]|_],[Y|Chs]) :- !. /* la solution est la bonne mais inversee */
    cherche(Y,[[S|Chs]|AutresChemins],Sol) :- findall([Suc,S|Chs],etatsuivant(S,Suc),NewChemins),
      append(AutresChemins,NewChemins,Chemins),cherche(Y,Chemins,Sol).
     
    but_gallons :- chemin_gallons(etatactuel(grande(0),petite(0)),etatactuel(grande(4),petite(0)), Liste),reverse(Liste,R),write(R).
    but_gallons2 :- recherche_largeur(etatactuel(grande(0),petite(0)),etatactuel(grande(4),petite(0)), Liste),reverse(Liste,R),write(R).

  3. #3
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    Par contre je veut faire un predicat de recherche en profondeur en utilisant etat final, etat intermedaire etat final j'ai fait le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rechercheProf(Ec,Ef,L1,L2]):-ope(Ec,Opx,Es),not(member(Es,L1)),rechercheProf(Es,Ef,[Es|L1],L2).
    mais ça ne marche pas.!

  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
    Il manque la définition de "ope(Ec,Opx,Es)"
    "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
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    Ok.
    Maintenant j'ai modifier le code mais et le résultat ne s'arrete jamais.
    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
    initial( [h,h,h,b,b,b] ).
    final( [b,b,b,h,h,h] ).
     
    opF( L1, r1, L2) :- remp([h,h], [b,b], L1, L2).
    opF( L1, r2, L2) :- remp([h,b], [b,h], L1, L2).
    opF( L1, r3, L2) :- remp([b,h], [h,b], L1, L2).
    opF( L1, r4, L2) :- remp([b,b], [h,h], L1, L2).
     
    remp(S1, S2, L1, L2) :- 
    	append(Tmp1, LSuffixe, L1), 
    	append(LPrefixe, S1, Tmp1),
    	append(LPrefixe, S2, Tmp2), 
    	append(Tmp2, LSuffixe, L2).
     
    rechPf(Ef,Ef, Letats, []) :- !, print(Letats).
    rechPf(Ec, Ef, Letats, [Opx|Lop]) :- 
    	opF(Ec, Opx, Esuivant),
    	not( member(Esuivant,Letats)),
    	rechPf(Esuivant, Ef, [Esuivant|Letats] , Lop).
     
    resoudre(S) :- initial(Ei), final(Ef), rechPf(Ei, Ef, [Ei], S).
    l'appelle c'est resoudre(S).

  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
    Que veux-tu dire par le résultat ne s'arrête jamais ?
    Simplement, tel que tu interroges Prolog, il te donne toutes les solutions possibles (je n'ai pas regardé en détail si elle étaient correctes!).
    "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

  7. #7
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    oui il me donne toute les solutions possibles, et si j'en demande d'autres avec un point virgule il m'en donne encore et encore bref tout le temps koi .

  8. #8
    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 qu'il y a beaucoup de solutions à ton problème !
    "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

  9. #9
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    ok merci. je vais essayer de trouver une heuristique qui me permet de prendre les meilleurs.

Discussions similaires

  1. Réponses: 12
    Dernier message: 27/08/2007, 12h33
  2. problème des N reines récursif
    Par duvi dans le forum C++
    Réponses: 7
    Dernier message: 20/02/2006, 13h45
  3. Réponses: 1
    Dernier message: 01/11/2005, 12h04

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