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 :

Incrémenter une variable jusqu'à l'état acceptant


Sujet :

Prolog

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Incrémenter une variable jusqu'à l'état acceptant
    Bonjour,
    J'ai un petit programme en prolog pour représenter une Rumba des nombres.
    En envoyant à Prolog l'état initial, l'état final, une liste L et un nombre de déplacements; il me renvoi L (les déplacements possible) si bien sur il peut atteindre l'état final en ce nombre de déplacements.

    Voici un petit exemple :
    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
    //Nombre de déplacement à 0
     
    | ?- rumba(jeu([vert(1),bleu(1),vert(3)],
         [rouge(3),bleu(2),vert(2)],
         [bleu(3),rouge(1),rouge(2)],
         []),
         jeu([rouge(3),bleu(1),vert(3)],
         [vert(1),bleu(2),vert(2)],
         [bleu(3),rouge(1),rouge(2)],
         []),L,0).
    no
     
    //Nombre de déplacement à 1
     
    | ?- rumba(jeu([vert(1),bleu(1),vert(3)],
         [rouge(3),bleu(2),vert(2)],
         [bleu(3),rouge(1),rouge(2)],
         []),
         jeu([rouge(3),bleu(1),vert(3)],
         [vert(1),bleu(2),vert(2)],
         [bleu(3),rouge(1),rouge(2)],
         []),L,1).
    no
     
    //Nombre de déplacement à 2
     
    | ?- rumba(jeu([vert(1),bleu(1),vert(3)],
         [rouge(3),bleu(2),vert(2)],
         [bleu(3),rouge(1),rouge(2)],
         []),
         jeu([rouge(3),bleu(1),vert(3)],
         [vert(1),bleu(2),vert(2)],
         [bleu(3),rouge(1),rouge(2)],
         []),L,2).
    no
     
    //Nombre de déplacement à 3
     
    | ?- rumba(jeu([vert(1),bleu(1),vert(3)],
         [rouge(3),bleu(2),vert(2)],
         [bleu(3),rouge(1),rouge(2)],
         []),
         jeu([rouge(3),bleu(1),vert(3)],
         [vert(1),bleu(2),vert(2)],
         [bleu(3),rouge(1),rouge(2)],
         []),L,3).
    L = [1==>4,2==>1,4==>2]
    Il me retourne donc une liste de déplacements car c'est possible.

    Voici mon code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    % Le prédicat rumba
     
    rumba(jeu(L1,L2,L3,L4),jeu(L1,L2,L3,L4),[],0).
     
    rumba(jeu(L1,L2,L3,L4),jeu(L1__,L2__,L3__,L4__),[D|LD],R1) :-
    	R1 > 0,
    	R_ is R1 - 1,
    	deplacement(jeu(L1,L2,L3,L4),jeu(L1_,L2_,L3_,L4_),D),
    	rumba(jeu(L1_,L2_,L3_,L4_),jeu(L1__,L2__,L3__,L4__),LD,R_).
    et donc voici mon problème (enfin)

    Je voudrais envoyer à Prolog juste l'état initial, l'état final et L et qu'il me trouve à chaque fois ma liste L; que mon predicat test pour déplacement égal à 0, puis si il ne trouve pas de solution, qu'il teste pour déplacement égal à 1 et, sinon 2 et ainsi de suite. Je voudra.is commencer à 0 car je doit trouver le plus court chemin pour y arriver.
    Le problème ne doit pas être compliqué mais je flanche sur ça !!

    J'ai éssayer différents code mais cela ne marche pas!! cela doit ressembler à quelque chose comme ça je pense :

    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
    % Le prédicat rumba
     
    rumba(jeu(L1,L2,L3,L4),jeu(L1,L2,L3,L4),L) :-
    	entier(R),
    	jouer(jeu(L1,L2,L3,L4),jeu(L1_,L2_,L3_,L4_),L,R),!.
     
    jouer(jeu(L1,L2,L3,L4),jeu(L1,L2,L3,L4),[],0).
     
    jouer(jeu(L1,L2,L3,L4),jeu(L1__,L2__,L3__,L4__),[D|LD],R) :-
    	R > 0,
    	R_ is R - 1,
    	deplacement(jeu(L1,L2,L3,L4),jeu(L1_,L2_,L3_,L4_),D),
    	jouer(jeu(L1_,L2_,L3_,L4_),jeu(L1__,L2__,L3__,L4__),LD,R_).
     
    % Le predicat entier
     
    entier(0).
     
    entier(I) :-
    	I_ is I + 1,
    	entier(I_).
    Merci en avance pour vos réponses, étant débutant en prolog, je vous prie de ne pas trop être compliqué dans vos réponses

  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
    Il manque le code du prédicat deplacement(jeu(L1,L2,L3,L4),jeu(L1_,L2_,L3_,L4_),D) .
    "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
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    J'ai bien sur aussi mon predicat déplacement :

    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
    % On définit l opérateur ==>
     
    :- op(300,xfx,'==>').
     
    % On compte le nombre d élément dans la liste  
     
    taille_Liste([],0).
    taille_Liste([_X|L],N) :- 
      taille_Liste(L,N_),
      N is N_ + 1.
     
    % On vérifie si le nombre d élément de la liste est inférieur ou égal à 3
     
    taille_Liste_inf(L) :-
      taille_Liste(L,R),
      R < 3.
     
    % On déplace un élément d une liste
     
    deplacement(jeu([X|L1],L2,L3,L4),jeu(L1,[X|L2],L3,L4),1==>2) :- 
    	taille_Liste_inf(L2).
    deplacement(jeu([X|L1],L2,L3,L4),jeu(L1,L2,[X|L3],L4),1==>3) :-  
    	taille_Liste_inf(L3).
    deplacement(jeu([X|L1],L2,L3,L4),jeu(L1,L2,L3,[X|L4]),1==>4) :-  
    	taille_Liste_inf(L4).
     
    deplacement(jeu(L1,[X|L2],L3,L4),jeu([X|L1],L2,L3,L4),2==>1) :-  
    	taille_Liste_inf(L1).
    deplacement(jeu(L1,[X|L2],L3,L4),jeu(L1,L2,[X|L3],L4),2==>3) :-  
    	taille_Liste_inf(L3).
    deplacement(jeu(L1,[X|L2],L3,L4),jeu(L1,L2,L3,[X|L4]),2==>4) :-  
    	taille_Liste_inf(L4).
     
    deplacement(jeu(L1,L2,[X|L3],L4),jeu([X|L1],L2,L3,L4),3==>1) :-  
    	taille_Liste_inf(L1).
    deplacement(jeu(L1,L2,[X|L3],L4),jeu(L1,[X|L2],L3,L4),3==>2) :-  
    	taille_Liste_inf(L2).
    deplacement(jeu(L1,L2,[X|L3],L4),jeu(L1,L2,L3,[X|L4]),3==>4) :-  
    	taille_Liste_inf(L4).
     
    deplacement(jeu(L1,L2,L3,[X|L4]),jeu([X|L1],L2,L3,L4),4==>1) :-  
    	taille_Liste_inf(L1).
    deplacement(jeu(L1,L2,L3,[X|L4]),jeu(L1,[X|L2],L3,L4),4==>2) :-  
    	taille_Liste_inf(L2).
    deplacement(jeu(L1,L2,L3,[X|L4]),jeu(L1,L2,[X|L3],L4),4==>3) :- 
    	taille_Liste_inf(L3).

  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
    En gros c'est la recherche du plus court chemin d'un état intial à un état final.
    Tu peux faire une exploration en largeur, tu pars de l'état initial, et tu regardes tous les états que tu peux obtenir avec un mouvement, puis tu pars de la liste obtenue et tu regardes tout ce que tu peux faire avec un mouvement esupplémentaire etc, etc.
    Tu peux adapter le code qui se trouve ici ! Ça correspond tout à fait à ce que tu veux faire.
    "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
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Je te remercie, je vais plutôt suivre la méthode que tu m'as conseillé, c'est exactement le même problème!!
    Mais par pure curiosité, car je m'y suis penché quelques temps quand même sur cette variable à incrémenter, comment aurais tu fais pour que cette variable augmente de 1 et s'arrète une fois un succés trouvé??

Discussions similaires

  1. Incrémenter une variable en CR9
    Par nanouille56 dans le forum SAP Crystal Reports
    Réponses: 9
    Dernier message: 13/02/2007, 15h59
  2. incrémenter une cellule jusqu'a une cellule variable
    Par derf3183 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 05/07/2006, 14h48
  3. Envoyer une variable dans un état
    Par uskiki85 dans le forum Access
    Réponses: 5
    Dernier message: 13/10/2005, 21h44
  4. [XSLT] incrémenter une variable
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 26/09/2005, 17h12
  5. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19

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