[PROLOG] Prédicat tous_differents avec des couples

Prédicat tous_differents avec des couples [PROLOG] - Divers - Programmation

Marsh Posté le 25-10-2006 à 18:57:38    

Salut!
Je n'arrive pas à trouver un prédicat satisfaisant pour faire un "tous_differents" sur une liste de couple d'entiers...
A chaque fois, j'arrive à un truc qui certe "marche" mais pose trop de contraintes, du coup ça complexifie énormément les choses pour rien :/
Vous avez une idée :??:


Message édité par ITM le 25-10-2006 à 18:57:51

---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 25-10-2006 à 18:57:38   

Reply

Marsh Posté le 25-10-2006 à 20:51:38    

En SWI-Prolog, tu peux utiliser sort/2, qui va te trier la liste en ordre croissant des premiers éléments des couples, après tu n'as plus qu'à balayer ta liste pour répérer les couples identiques (si j'ai bien compris ce que tu demandes).

Reply

Marsh Posté le 26-10-2006 à 00:11:10    

En fait je veux générer des couples de coordonnés entières compris entre (X1,Y1) et (X2,Y2)
 
Ma démarche est :
 - Générer une liste de (X2-X1+1)*(Y2-Y1+1)  couplets
 - Contraindre la liste de couplets (en gros couplets_tous_entiers, valeurs_tous_compris_entre X1 et X2, Y1 et Y2, couplets_tous_différents)
 - Enumérer
 
Le tous_differents me fait crasher le prog : j'ai fait un truc trop complexe ou les contraintes se recoupent (à cause d'un ou qui est pas mutuellement exclusif), alors je me demandais si y'avait plus simple...
En attendant j'ai remplacé cette méthode par un double "for" mais c'est pas vraiment l'esprit Prolog et c'est l'usine comparé à ça...
:hello:
 
 


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 26-10-2006 à 00:55:47    

ITM a écrit :

En fait je veux générer des couples de coordonnés entières compris entre (X1,Y1) et (X2,Y2)
 
Ma démarche est :
 - Générer une liste de (X2-X1+1)*(Y2-Y1+1)  couplets
 - Contraindre la liste de couplets (en gros couplets_tous_entiers, valeurs_tous_compris_entre X1 et X2, Y1 et Y2, couplets_tous_différents)
 - Enumérer
 
Le tous_differents me fait crasher le prog : j'ai fait un truc trop complexe ou les contraintes se recoupent (à cause d'un ou qui est pas mutuellement exclusif), alors je me demandais si y'avait plus simple...
En attendant j'ai remplacé cette méthode par un double "for" mais c'est pas vraiment l'esprit Prolog et c'est l'usine comparé à ça...
:hello:


C'est celà que tu veux ?

Code :
  1. % je définis ce qu'est un tuple cherché
  2. tuple((X1,Y1),(X2,Y2), (X,Y)) :-
  3. between(X1,X2,X),
  4. between(Y1,Y2,Y).
  5. % J'indique à Prolog que je veux tous les tuples
  6. % verifiant mon, prédicat tuple
  7. tous_les_tuples(X, Y , L) :-
  8. bagof(T, tuple(X,Y,T), L).

-? tous_les_tuples((1,2), (3,4),L).
 
L = [ (1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (..., ...)] ;
 
No


PS  : fonctionne en SWI-Prolog


Message édité par Trap D le 26-10-2006 à 01:03:15
Reply

Marsh Posté le 26-10-2006 à 01:43:09    

Ouais c'est exactement ça :love:
Je connaissais pas du tout between, honte à moi :D (edit : et j'aurais pu le faire moi même d'ailleurs :D)
Merci mille fois en tout cas, je teste dès demain :jap:


Message édité par ITM le 26-10-2006 à 01:44:11

---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 26-10-2006 à 10:04:41    

S'embarquer dans des for, c'est le signe qu'on est encore marqué par la programmation impérative, enfin pour moi c'était le cas.
Prolog est puissant pour ce genre de problème : trouver tous les ...

Reply

Marsh Posté le 26-10-2006 à 14:31:16    

Ouais je suis tout à fait d'accord :)
Alors, là j'ai un autre problème... En fait à mon école on est sur Prolog IV :'(
Du coup, bagof me balance un joli "not implemented" quand je l'utilise dans ce cas là... j'ai vérifié, ça marche nickel avec SWI-Prolog. En remplaçant par findall ça me fait la même chose, pourtant que jais que celui là marche dans des cas plus simples.
J'ai l'impression qu'il sait pas qu'on est sur un espace de nombre entier ou je ne sais quoi. J'ai beau foutre des int(X1), int(Y1), ... Rien à faire...
Comment faire? :/

Message cité 1 fois
Message édité par ITM le 26-10-2006 à 14:33:10
Reply

Marsh Posté le 26-10-2006 à 17:33:57    

ITM a écrit :

Ouais je suis tout à fait d'accord :)
Alors, là j'ai un autre problème... En fait à mon école on est sur Prolog IV :'(
Du coup, bagof me balance un joli "not implemented" quand je l'utilise dans ce cas là... j'ai vérifié, ça marche nickel avec SWI-Prolog. En remplaçant par findall ça me fait la même chose, pourtant que jais que celui là marche dans des cas plus simples.
J'ai l'impression qu'il sait pas qu'on est sur un espace de nombre entier ou je ne sais quoi. J'ai beau foutre des int(X1), int(Y1), ... Rien à faire...
Comment faire? :/

Désolé, je ne connais pas Prolog IV :/
Essaye sur DVP, peut-être pourra-t-on te renseigner ?

Reply

Marsh Posté le 26-10-2006 à 18:28:15    

Ok, DVP, qu'est-ce :??:


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 26-10-2006 à 21:01:53    

ITM a écrit :

Ok, DVP, qu'est-ce :??:

DVP c'est ici

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed