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 08/12/2012, 17h57   #1
bibi boom
Invité de passage
 
Inscription : avril 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 7
Points : 1
Points : 1
Par défaut assert en prolog

Bonjour,
mon probleme:

Une ligne de metro est de cette forme:
Code :
ligne(nomligne,type,listestations,direction1 direction2)
Code :
nbrestations(N,S):-ligne(N,_,Y,_,_),nb(Y,S).
// nb est un predicat qui parcourt la liste renvoie le nombre d'elements

nbrestations calcule pour chaque nom de ligne donné le nombre de stations.


je voudrai creer un predicat createStations avec assert qui va me retourner pour chaque ligne son nombre de stations sachant que dans ma base de faits j'ai plusieurs lignes comme cela:

Code :
ligne(m3b, metro, [porte_lilas, saint_fargeau, pelleport, gambetta],porte_lilas, gambetta).
j'ai essayé de faire comme sa mais sa marche pas
Code :
 createstations:- assert(nbstations(ligne,S)).
aidez moi SVp merciiiiiiiii d'avance
bibi boom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 08h35   #2
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
Bonjour
Pourquoi utiliser assert ? pour des questions de rapidité ? nbrestations(N,S):-ligne(N,_,Y,_,_),nb(Y,S). fait très bien le travail il me semble.
Sinon on peut faire quelque choses comme ça :
Code :
1
2
3
4
5
:- dynamic nbstations/2.
createstations:- 
    forall(ligne(Nomligne,_type,Listestations,_direction1,_direction2),
            ( nbrestations(Nomligne,S)
              assert(nbstations(Nomligne,S)))).
__________________
"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 17/12/2012, 18h18   #3
bibi boom
Invité de passage
 
Inscription : avril 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 7
Points : 1
Points : 1
merci beaucoup pour votre reponse,
dans ma console quand j'écris :
createnbstations.
ça me renvoie true ,est-ce-qu'il ya un moyen de les afficher ou bien assert ne fait que l'insertion ?
merci encore une fois.
bibi boom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 18h40   #4
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
assert ne fait que les ajouter dans la base de données, pour les afficher on peut faire:
Code :
1
2
3
affichestations:- 
    forall(nbstations(Nomligne,S),
            format('Ligne ~w Stations ~w~n' [Nomligne, S])).
__________________
"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 18/12/2012, 09h04   #5
bibi boom
Invité de passage
 
Inscription : avril 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 7
Points : 1
Points : 1
Bonjour, je voudrais définir itineraire entre depart D et arrivée A entre deux stations, j'ai un predicat dessert qui signfie que la ligne dessert le depart et l'arrivée

Code :
1
2
// ils sont sur la même ligne
itineraire(D,A,T):-ligne(L,_,_,_,_),dessert(L,D,A),nbarret(L,D,A,DIR,_),affiche([L,DIR,D,A]).
Ce deuxieme cas, s'ils ne sont pas sur la même ligne
Code :
1
2
3
4
5
6
7
8
9
10
11
itineraire(D,A,T):-
	 ligne(L1,_,_,_,_),
	ligne(L2,_,_,_,_),
	not(dessert(L1,D,A)),
	dessert(L1,D,SC),
	dessert(L2,SC,A),!,
	nbarret(L1,D,SC,DIR,_),
	nbarret(L2,SC,A,DIR2,_),
	append([L1,DIR,D,SC],[L2,DIR2,SC,A],T),
	affiche(T),
	inters(L1,L2,SC). //SC c'est la station de croisement
// le probleme c qu'il me retourne que les trajets a 1 correspondance moi je voudrais avoir tous les cas possibles
merci
bibi boom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 12h39   #6
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
Je ne comprends pas bien tous tes calculs, je vais te donner un squelette de programme pour un cas similaires que tu devras adapter à ton problème.
Code :
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
% ligne(Nom, Liste_des_stations).
ligne(m1, [a1,b1,c1,d1,e1,f1]).
ligne(m2, [a2,b2,c2,d2,e2,f2,g2,h2]).
ligne(m3, [a3,b3,c3,c1,d3,e3,f2,f3,g3,h3,i3]).


% predicat qui recherche la jonction entre deux lignes
jonction(Ligne_1, Ligne_2, Station) :-
	ligne(Ligne_1, Stations_1),
	ligne(Ligne_2, Stations_2),
	Ligne_1 \= Ligne_2,
	member(Station, Stations_1),
	member(Station, Stations_2).

% predicat qui indique si une Station
% est desservie par une Ligne
dessert(Station, Ligne) :-
	ligne(Ligne,Stations),
	member(Station, Stations).


% predicat de lancement de recherche
trajet(A, B, P) :-
	dessert(B, Ligne),
	trajet(A, B, [[Ligne, B]], P).

% predicat effectif de la recherche
% on va de A à B, sachant qu'on a déjà visité
% les stations décrites dans Chemin
%
% Attention, dans la recherche on est en B
% et on veut arriver à A
% En fait la recherche se fait de la fin vers le début
%
% Premier cas les stations sont sur la même ligne
trajet(A, B, Chemin, [[Ligne, A] | Chemin]) :-
	Chemin = [[Ligne, B] | _R],
	dessert(A, Ligne),
	dessert(B, Ligne),
	!.

% ici on recherche une jonction entre deux lignes
trajet(A, B, Chemin, Chemin_terminal) :-
	Chemin = [[Ligne, B] | _R],
	jonction(Ligne, Ligne_1, S),
	\+ member([Ligne, S], Chemin),
	trajet(A, S, [[Ligne_1, S], [Ligne, S] | Chemin], Chemin_terminal).
Exemple :
Citation:
?- trajet(a1, g2, P).
P = [[m1,a1],[m1,c1],[m3,c1],[m3,f2],[m2,f2],[m2,g2]] ;
false.
__________________
"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 23/12/2012, 13h51   #7
bibi boom
Invité de passage
 
Inscription : avril 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 7
Points : 1
Points : 1
bonjour,
je cherche un predicat itineraire entre deux stations metro ,qui me renvoie tout les trajets possible,j'ai tout essaye ,je trouve pas :'( merci de m'aider

j'arrive pas a retourner ma liste de trajets

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
itineraire(Depart, Arrivee, [L0|L] ):-
dif(Depart,Arrivee),
station(Depart,L1Lignes),
findall(X,
	(
		member(Nom,L1Lignes),
		forall(
			(correspondance(ligne(Nom,_,_,_,_),LLignesStations), member(LAux,LLignesStations), nth0(StationAux,1,LAux)),
			(
				findall([Nom,Depart,StationAux],
					(itineraire(StationAux,Arrivee,[L]), dessert(Nom,Depart,StationAux)),
				Liste),
				member(X,Liste)
			)
		)
	),
ListeTrajet),
member(L0,ListeTrajet).
aidez moi svp

cordialement
bibi boom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 18h51   #8
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
En Prolog, lorsqu'on veut trouver toutes les possibilités répondant à certaines conditions, on utilise la démarche suivante :
1°) on explique à Prolog comment on trouve une possibilité répondant aux conditions
2°) on lui demande de trouver toutes les podsiibilités en utilisant les prédicats findall, bagof, setof
J'ai donné sur une autre discussion la méthode pour trouver un chemin, il suffit d'utiliser l'un des trois prédicats pour trouver les chemins.

On peut faire
Code :
1
2
tous_les_trajets(A, B, TLT) :-
   setof(P, trajet(A, B, P), TLT).
__________________
"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 24/12/2012, 16h12   #9
bibi boom
Invité de passage
 
Inscription : avril 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 7
Points : 1
Points : 1
j'y arrive toujours pas a le faire :'(
bibi boom est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h57.


 
 
 
 
Partenaires

Hébergement Web