Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Prolog
Prolog Forum d'entraide sur la programmation en langage Prolog. Avant de poster : Cours Prolog
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/11/2012, 20h22   #1
sologne
Membre habitué
 
Avatar de sologne
 
Homme
Chargé de missions
Inscription : mai 2011
Messages : 66
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Service public

Informations forums :
Inscription : mai 2011
Messages : 66
Points : 118
Points : 118
Par défaut etre_avant dans une liste

Bonjour,

je cherche à savoir comment on fait pour savoir dans une liste si un élément est avant un autre.
J'ai rédige cela :
Code :
1
2
3
est_avant(A, B, [A, B | _]).
est_avant(A, B, [_ | Y]) :- est_avant(A, B, Y).
qui fonctionne correctement si A est juste avant B dans la liste, mais pas si il y a des éléments entre A et B.

Avez vous des idées pour améliorer ce début de code ?
sologne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2012, 08h55   #2
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 436
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 436
Points : 5 301
Points : 5 301
Oui, as-tu entendu parler de append ?
Si oui, réfléchis bien à son utilisation.
__________________
"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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2012, 20h03   #3
sologne
Membre habitué
 
Avatar de sologne
 
Homme
Chargé de missions
Inscription : mai 2011
Messages : 66
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Service public

Informations forums :
Inscription : mai 2011
Messages : 66
Points : 118
Points : 118
Bonjour Trap D,

merci à toi de t'être intéressé à mon pb. D'après ce que j'ai vu la fonction "append" permet de réaliser des concaténations de listes, et étant débutant dans ce langage, je ne vois pas comment en détourner l'usage pour résoudre mon pb...
D'un point de vu algorithmique, et avec un langage 'classique' : Java, C, php cela ne me poserai aucun souci. je ferai une implémentation de type :

Code :
1
2
3
4
5
6
7
8
9
10
function est_avant(A, B, Liste) : bool {
 int IndA = indexe(A,Liste); // la fonction indexe étant déjà implémenté
 int IndB = indexe(B,Liste);
   if(IndA <  IndB) {
      return true;
   } else {
      return false;
   }
}
Voila, ce n'est pas de la mauvaise volonté et j'ai l'habitude de coder mais l'apprentissage de prolog est assez déroutant lorsque l'on vient des langages 'clasiques'.

Pourrais-tu stp m'éclairer un peu plus ?
sologne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2012, 20h26   #4
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 436
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 436
Points : 5 301
Points : 5 301
Voilà bien ce qui est ennuyeux quand on vient d'un langage impératif, on est formaté par ce type de raisonnement et ça ne marche pas du tout avec Prolog. Ne t'en fais pas, cela viendra, mais il faut persister, je suis aussi passé par la.
Pour t'éclairer sur le mode de raisonnement : si l'élément A est avant B dans la liste L, cela veut d'abord dire qu'il existe une sous-liste de L qui commence par A, donc on peut écrire
je pense que tu connais la signification du '_'.
Maintenant, je te laisse terminer : si B est après A dans L, cela veut dire qu'il existe ...
En Prolog, au début, il faut éviter toute considération d'efficacité de code, cela viendra après, quand tu commenceras à comprendre le mécanisme de réflexion.
__________________
"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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 18h56   #5
sologne
Membre habitué
 
Avatar de sologne
 
Homme
Chargé de missions
Inscription : mai 2011
Messages : 66
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Service public

Informations forums :
Inscription : mai 2011
Messages : 66
Points : 118
Points : 118
Bonjour TrapD,

J'ai eu beau chercher dans la direction que tu m'indiques et malheureusement je n'arrive pas à aboutir ...

Par contre j'ai fini par réussir à écrire ce bout de code qui répond à mon problème.

Code :
1
2
3
4
5
6
7
8
9
10
11

rang(X,[X|Q],0).
rang(X,[T|Q], Somme) :-
  rang(X,Q,S),
  Somme is S+1.
  
estavant(A, B, Liste):-
	rang(A,Liste,RangA),
	rang(B,Liste,RangB),
	RangA < RangB.
mais qui est fortement inspiré de l'algo écrit dans mon post précédent et qui s'éloigne à mon sens de l'esprit de prolog ...

Ayant trouvé une solution, certes pas la meilleurs, acceptes-tu de me communiquer la solution que tu proposes avec le append ?
sologne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 20h32   #6
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 436
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 436
Points : 5 301
Points : 5 301
Ben, elle est "toute simple" :
Code :
1
2
3
4
5
est_avant(A, B, L) :-
        % il existe une sous-liste de L qui commence par A,
	append(_, [A | X], L),
       % il existe une sous-liste de X qui commence par B,
	append(_, [B | _], X ).
__________________
"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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2012, 08h25   #7
sologne
Membre habitué
 
Avatar de sologne
 
Homme
Chargé de missions
Inscription : mai 2011
Messages : 66
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Service public

Informations forums :
Inscription : mai 2011
Messages : 66
Points : 118
Points : 118
En effet,

une fois que l'on voit la solution c'est simple : j'ai du chemin à parcourir, pour rentrer dans cet esprit...

Merci de ton aide précieuse.
sologne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h30.


 
 
 
 
Partenaires

Hébergement Web