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 02/09/2012, 04h45   #1
citron_666
Invité de passage
 
Inscription : août 2012
Messages : 15
Détails du profil
Informations forums :
Inscription : août 2012
Messages : 15
Points : 2
Points : 2
Par défaut Pile sous GNU Prolog

Bonjour à tous,
J'étais à la recherche d'une manière de modéliser les piles sous Prolog lorsque je suis tombé sur ce lien qui propose une solution sous SWI Prolog.

Hors après plusieurs heures de recherche je n'arrive pas à l'adapter pour GNU Prolog, j'ai tenté ceci mais je n'arrive pas à retrouver la pile pour l'afficher une fois celle ci crée.

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
dynamic([p1/1, p2/1, p3/1]).

% les prédicats de gestion de pile
init_piles([]).
init_piles([Pile | Q]) :-
	P =.. [Pile, _X],
	retractall(P),
	P2 =.. [Pile, []],
	asserta(P2),
	init_piles(Q).


pile_vide(Pile) :-
	P =.. [Pile, []],
	call(P).

empile(Pile, Elem) :-
	P =.. [Pile, X],
	retract(P),
	P1 =.. [Pile, [Elem | X]],
	asserta(P1).

depile(Pile, Elem) :-
	P =.. [Pile, X],
	retract(P),
	X = [Elem | T],
	P1 =.. [Pile, T],
	asserta(P1).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
empile_pile([], []).
empile_pile([Pile | X], [Input | Y]) :-
	empile(Pile, Input),
	empile_pile(X, Y).


test(Input) :-
	% on calcule le nombre de sous listes
	length(Input, N),
	% on genere une liste du même nombre de piles
	length(LP, N),
	% on initialise les piles
	init_piles([p1, p2, p3]),
	% on les remplit avec les listes
	empile_pile([p1, p2, p3], Input),
	empile_pile([p1, p2, p3], [[x], [y], [z]]),
	% on cree le tableau de sortie
	%cree_tableau([], L),
	% on l'ecrit à la console
	afficher_liste_pile([p1, p2, p3]).

% si les trois piles sont vides
% Le tableau est termine
/*cree_tableau(LP, L, L) :-
	forall(member(P, LP), pile_vide(P)),
	!.

% on boucle sur la création du tableau
cree_tableau(LP, L, LL) :-
	maplist(extrait, LP, L1),
	cree_tableau(LP, [L1 | L], LL).*/

% on extrait un élément des piles
% Si la pile est vide, on insère 0
extrait(Pile, LL) :-
	pile_vide(Pile) -> LL = 0;
	depile(Pile, LL).

afficher_liste_pile([]).
afficher_liste_pile([T | Q]) :-
	afficher_pile(T),
	afficher_liste_pile(Q).

afficher_pile(Pile) :-
	P =.. [Pile, X],
	write(X).
En fait c'est uniquement lorsque je fais un retract que le compilateur reconnait le contenu de la pile (visible lorsqu'on debug). Du coup y aurait il une âme charitable pour adapter correctement le code ?
citron_666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2012, 04h55   #2
citron_666
Invité de passage
 
Inscription : août 2012
Messages : 15
Détails du profil
Informations forums :
Inscription : août 2012
Messages : 15
Points : 2
Points : 2
Et il y a aussi le fait que je n'arrive pas à générer des chaînes uniques pour chaque pile pour ensuite appliquer les méthodes. Je sais que ça fait deux demandes mais je ne viendrais pas vous embeté si s'était très important pour moi, j'ai réellement besoin de trouver une solution à ce problème.
citron_666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2012, 18h28   #3
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
Une possibilité d'adaptation du code est de coder maplist sur GNU-Prolog, c'est un exo simple à faire (en plus en fouillant la doc SWI-Prolog...)
__________________
"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 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h26.


 
 
 
 
Partenaires

Hébergement Web