débutant.. [Prolog] - Divers - Programmation
Marsh Posté le 08-04-2007 à 13:08:46
En fait pour réduire le problème
Pour ce prédicat :
Code :
|
Il me sort vrai car il existe une case de coordonnée X paire mais comment faire si je veux que toutes les cases aient X paire ?
Marsh Posté le 08-04-2007 à 16:24:56
guiguivts a écrit : En fait pour réduire le problème
|
essaie :
Code :
|
Valalble avec SWI-Prolog.
Marsh Posté le 08-04-2007 à 18:17:47
J'ai trouvé un moyen détourner mais ça peut toujours servir merci
Marsh Posté le 09-04-2007 à 12:07:39
Salut , toujours question de débutant :
J'ai un damier de créer avec des cases des murs etc..
Je cherche à faire un prédicat me disant s'il y a un chemin entre une case et une autre :
j'ai fait ça :
existechemin(X,Y,A,B) :- voisin(X,Y,A,B).
existechemin(X,Y,A,B) :- existechemin(C,D,A,B) , voisin(X,Y,C,D).
L'ennui c'est que bien sûr ça boucle.. je voie bien d'ou ça vient et comment corriger le problème en utilisant des listes. (enfin je pense..) mais est ce que c'est possible sans utiliser de listes ?
Marsh Posté le 09-04-2007 à 16:01:56
On touche aux graphes là, et sans les listes, je ne vois pas trop comment t'en sortir.
Marsh Posté le 09-04-2007 à 19:05:26
Oki j'ai trouvé des tutos intéressants je vais donc devoir me les taper
J'ai déjà vu djikstra et autres en cours mais de là à les faire en prolog berk!
Marsh Posté le 09-04-2007 à 21:53:26
guiguivts a écrit : Oki j'ai trouvé des tutos intéressants je vais donc devoir me les taper |
Pas berk
Je t'invite à y réfléchir sérieusement, tu auras beaucoup à y gagner.
Cette adressepour te montrer ce qu'on peut faire
Marsh Posté le 11-04-2007 à 13:55:09
J'ai commencer à voir comment tester si un chemin existait en utilisant les listes mais je bloque. j'ai ça comme prédicat :
Code :
|
mais bien sûr ça ne fonctionne pas
Marsh Posté le 11-04-2007 à 14:36:29
Etonnant j'ai rajouté dans mon troisieme existe chemin un prédicat estliste(L) décrit comme ça :
estliste([]).
estliste([X|S]).
et ça fonctionne, à priori ça ne marche pas sans ça car on ne sait pas ce que c'est L mais j'avoue que je voie pas tres bien pourquoi !
Marsh Posté le 11-04-2007 à 15:13:36
Enfin de compte ça ne marche pas si le chemin n'existe pas, il boucle...
Marsh Posté le 11-04-2007 à 17:49:26
ReplyMarsh Posté le 11-04-2007 à 17:49:52
Plusieurs choses
Choisis, travaille avec des cases ou avec des coordonnées mais là tu mélangers un peu.
Ton prédicat membre/2, tu peux l'écrire comme ça, ce sera plus général :
Code :
|
Sans test aucun car je n'ai pas Prolog sous la main, je ferais comme ça :
Je pars de la case (X,Y) et je veux aller à la case (A,B)
Code :
|
Attention ce code te donne le chemin à l'envers.
Maintenant, personnellement, je chercherais toutes les cases accessibles en 1 pas, puis toutes celles accessibles en 2, puis 3 jusqu'a arriver à la case(A,B). Cette méthode te donnera en plus le plus court chemin.
_darkalt3_
Marsh Posté le 11-04-2007 à 18:20:47
J'ai fait plus ou moins pareil je trouve non ?
Tu pars de la case X,Y pour aller à la case A,B donc tu cherches récursivement s'il existe un chemin de X,Y à C,D C,D étant proche de A,B
Moi je pars de X,Y pour aller à A,B et je cherche s'il existe un chemin entre C,D et A,B C et D étan proche de X,Y ça revient au même je trouve mais je peux me tromper.
J'ai tester ton code ça revient au même que le mien ça boucle dans certains cas lorsque le chemin n'existe pas
bye
Marsh Posté le 12-04-2007 à 00:05:55
Bon, je suis devant SWI-Prolog et maintenant ça fonctionne.
Voilà comment j'ai travaillé.
J'ai défini le prédicat voisin comme ceci :
Code :
|
Pour pouvoir, en interrogeant la base de fait de cette façon : voisin(case(X,Y),Z). obtenir toutes les cases voisines de la case(X,Y).
J'utilise maintenant un prédicat existechemin(X,Y,L, NL) donc à 4 arguments où
X est la case de départ,
Y est la case d'arrivée,
L est le chemin déjà parcouru
NL le chemin final
Maintenant on construit le chemin :
Code :
|
Le chemin est construit dans l'ordre.
Maintenant, pour rechercher un chemin, tu fais par exemple
Code :
|
Marsh Posté le 12-04-2007 à 11:29:13
Bon bien ça ne marche pas il aime pas ton append et même sans rajouter de L1 en gardant juste L il boucle j'utilise sicstus prolog mais je crois que je vais arréter je perd trop de temps
Marsh Posté le 12-04-2007 à 11:43:59
Dommage, utilise SWi-Prolog, c'est mieux.
PS : si c'est la append qui te gène, fais
Code :
|
Marsh Posté le 12-04-2007 à 11:54:44
je peux utiliser que sicstus car je l interface avec java
merci en tous cas
Marsh Posté le 12-04-2007 à 12:06:09
en fait le soucis c'est que dans ce prédicat
existechemin(X , Y, L, L1) :-
voisin(Y,Z),
/+membre(Z,L),
existechemin(X, Z, [Y | L], L1).
Ptet que ça marche mais je ne comprend pas dans ce cas , comme on rajoute La nouvelle case Y dans l'appel récursif il est possible que l'on teste quand même deux fois ce Y.
Par exemple on appelle une premiere fois ce prédicat et X à plusieurs voisins Z On rappelle ce prédicat récursivement avec le premier voisins et donc le premiers voisin va rajouter ses propres voisins à L. Mais lorsque cet appel sera terminé le permier appel du prédicat va reprendre avec un autre voisin mais avec l'ancienne liste L et donc il est possible de tester plusieurs fois la même case c'est peut etre ce qui boucle je ne sais pas.
ça ne boucle que sur certain cas c'est bizarre.
Marsh Posté le 12-04-2007 à 13:35:22
Peux-tu m'indiquer tes cases valides ?
Moi j'ai défini dans ma base de faits
case(1,1).
case(1,2).
case(1,3).
etc, de manière à avoir plusieurs possibilités de chemins pour aller d'une case à une autre, et je les obtiens tous. Le problème vient peut-être de cette définitions de case.
voisin(Y,Z) doit fournir un voisin de Y à chaque appel, c'est essentiel.
Par le phénomène de backtrack, quand un parcours échoue on revient sur ses pas et on essaye avec un nouveau voisin.
Marsh Posté le 12-04-2007 à 14:01:10
Oui je comprend pas non plus. en fait j'ai un damier de 10 sur 10 avec des murs à l'intérieur si je prend un nombre assez petit de case par exemple 10 12 ça fonctionne mais si j'en prend 50 ça ne marche plus.
Il y a donc 100 cases mais elles ne sont pas forcément accessibles.
Marsh Posté le 12-04-2007 à 14:24:36
Voilà mon code : voisin j'ai testé à beaucoup de reprises et il fonctionne :
le prolog :
Code :
|
le java
Code :
|
Je pige pas..
Marsh Posté le 12-04-2007 à 17:39:40
Tu es sûr de l'interface avec Java ?
D'autre part cette méthode bouffe pas mal de mémoire, des algos plus élaborés seraient sans doute plus adaptés.
Cependant, je viens de faire le test avec ça,
Code :
|
Ca fonctionne très bien.
Marsh Posté le 12-04-2007 à 18:05:13
honnetement je comprend pas ça fait 24h que je suis dessus quand même
je viens de passer 10 minutes à faire exactement la même chose en utilisant java et prolog juste pour tester si les faits existent et ça fonctionne donc je voie pas mais bon ça a l'air de marcher
Par contre comme prévu c'est long et lourd en java alors qu'en prolog c'est censé faire 3 lignes..
Marsh Posté le 12-04-2007 à 18:15:37
Pour Plus de renseignements sur l'interface Java, reagarde là :
http://groups.google.de/group/comp.lang.prolog/topics
Marsh Posté le 13-04-2007 à 14:41:06
Ce petit programme en java fonctionne très bien avec l'interface jpl de SWI-Prolog.
Code :
|
Code de Labyrinthe.pl
Code :
|
Marsh Posté le 04-05-2007 à 19:01:25
Salut,
merci pour ton dernier message. J'avais un peu laissé tombé mais quand même réussi à faire fonctionner chemin
là j'essaye de récupérer la liste des chemin mais ça ne fonctionne malheureusement pas :-(
donc j'ai plus ou mon les mêmes prédicats pour existe chemin :
Code :
|
Pour récuperer une liste de résultat nous utilisons une fonction faite par le prof :
Code :
|
Et j'appelle ça comme ça :
listechemin =_sp.listelisteresultat("existechemin(case(1,1),case(3,1),[],L).", "L" );
malheureusement ça boucle..
J'ai une autre méthode pour récuperer le premier résultat de cette liste :
Code :
|
Cela fonctionne pourtant !
bye
Marsh Posté le 05-05-2007 à 11:37:48
Je ne m'y connais malheureusement pas assez en Java pour te conseiller.
Tout ce que je peux dire, c'est que dans l'exemple que j'ai posté, je récupère tous les chemins. Il est adapté des exemples de JPL de SWI-Prolog.
Marsh Posté le 05-05-2007 à 12:11:21
Oui moi aussi il le fait bien, l'ennui c'est que lorsqu'il n'y a plus de chemins possibles ça boucle de même avec ton exemple quand je teste sur un chemin qui n'existe pas il boucle
Marsh Posté le 05-05-2007 à 15:16:34
Je viens de faire le test, le programme génère une exception que tu peux intercepter si le chemin n'existe pas, (toujours avec SWI-Prolog et JPL).
Marsh Posté le 08-04-2007 à 12:45:45
Salut!
j'ai un petit probleme prolog pas bien compliqué je pense mais je voie pas trop comment le résoudre
C'est par rapport à ce prédicat :
En fait à partir d'une case de coordonnée X et Y je récupere les voisins à droite de cette case ( (X,Y+1) , (X,Y) , (X,Y-1) )
J'en ai donc au maximums trois et à partir de ces trois nouvelles cases je récupère la liste des voisins de ces trois cases grace au prédicat voisin ( je suis sûr qu'il fonctionne je l'ai testé) et je voudrai que TOUS ces voisins soient vus (grace au prédicat vue(C,D) )
Mon problème c'est que le prédicat déplacementdroiteinutile est vrai si il y a au moins un vue(C,D) vrai. or je voudrai qu'ils soient tous vrai mais je ne voie pas comment faire..
merci d'avance
Message édité par guiguivts le 08-04-2007 à 12:46:16