1 /* accesseurs sur ligne et colonne*/
3 colonne(1,[A,_,_,_],A).
4 colonne(2,[_,A,_,_],A).
5 colonne(3,[_,_,A,_],A).
6 colonne(4,[_,_,_,A],A).
8 ligne(1,[A,_,_,_,_],A).
9 ligne(2,[_,A,_,_,_],A).
10 ligne(3,[_,_,A,_,_],A).
11 ligne(4,[_,_,_,A,_],A).
12 ligne(5,[_,_,_,_,A],A).
15 /* retourne le contenu "Contenu_case" de la case
16 situé à la colonne "Col" et la ligne "Lig" du jeux en cours
19 case(Lig,Col,Conf,Contenu) :-
20 ligne(Lig,Conf,Ligne),
21 colonne(Col,Ligne,Contenu).
23 changeContenuColonne(1,X,[_,B,C,D],[X,B,C,D]).
24 changeContenuColonne(2,X,[A,_,C,D],[A,X,C,D]).
25 changeContenuColonne(3,X,[A,B,_,D],[A,B,X,D]).
26 changeContenuColonne(4,X,[A,B,C,_],[A,B,C,X]).
28 changeContenuLigne(1,X,[_,B,C,D,E],[X,B,C,D,E]).
29 changeContenuLigne(2,X,[A,_,C,D,E],[A,X,C,D,E]).
30 changeContenuLigne(3,X,[A,B,_,D,E],[A,B,X,D,E]).
31 changeContenuLigne(4,X,[A,B,C,_,E],[A,B,C,X,E]).
32 changeContenuLigne(5,X,[A,B,C,D,_],[A,B,C,D,X]).
34 changeContenu(Conf1,Piece,Y,X,Conf2):-
36 changeContenuColonne(X,Piece,Ligne,Lignep),
37 changeContenuLigne(Y,Lignep,Conf1,Conf2).
83 glissement(r1,d,Conf1,Conf2):-
84 case(Lig,Col,Conf1,r1),
88 case(Lig,Colpp,Conf1,vi),
89 case(Ligp,Colpp,Conf1,vi),
90 changeContenu(Conf1,r1,Lig,Colp,Conf1a),
91 changeContenu(Conf1a,ro,Lig,Colpp,Conf1b),
92 changeContenu(Conf1b,vi,Lig,Col,Conf1c),
93 changeContenu(Conf1c,ro,Ligp,Colpp,Conf1d),
94 changeContenu(Conf1d,vi,Ligp,Col,Conf2).
97 glissement(r1,g,Conf1,Conf2):-
98 case(Lig,Col,Conf1,r1),
102 case(Lig,Colm,Conf1,vi),
103 case(Ligp,Colm,Conf1,vi),
104 changeContenu(Conf1,r1,Lig,Colm,Conf1a),
105 changeContenu(Conf1a,ro,Lig,Col,Conf1b),
106 changeContenu(Conf1b,vi,Lig,Colp,Conf1c),
107 changeContenu(Conf1c,ro,Ligp,Colm,Conf1d),
108 changeContenu(Conf1d,vi,Ligp,Colp,Conf2).
112 glissement(r1,b,Conf1,Conf2):-
113 case(Lig,Col,Conf1,r1),
117 case(Ligpp,Col,Conf1,vi),
118 case(Ligpp,Colp,Conf1,vi),
119 changeContenu(Conf1,r1,Ligp,Col,Conf1b),
120 changeContenu(Conf1b,vi,Lig,Col,Conf1c),
121 changeContenu(Conf1c,ro,Ligpp,Col,Conf1d),
122 changeContenu(Conf1d,ro,Ligpp,Colp,Conf1e),
123 changeContenu(Conf1e,vi,Lig,Colp,Conf2).
127 glissement(r1,h,Conf1,Conf2):-
128 case(Lig,Col,Conf1,r1),
132 case(Ligm,Col,Conf1,vi),
133 case(Ligm,Colp,Conf1,vi),
134 changeContenu(Conf1,r1,Ligm,Col,Conf1a),
135 changeContenu(Conf1a,ro,Ligm,Colp,Conf1b),
136 changeContenu(Conf1b,vi,Ligp,Col,Conf1c),
137 changeContenu(Conf1c,ro,Lig,Col,Conf1d),
138 changeContenu(Conf1d,vi,Ligp,Colp,Conf2).
144 /* glissement noire , jaune droite ou gauche */
145 glissement(Pc1,D,Conf1,Conf2):-
146 case(Lig,Col,Conf1,Pc1),
147 ((Pc1= n1, Pc2= no); (Pc1= j1, Pc2= ja)),
151 case(Lig,Colp,Conf1,vi),
152 case(Ligp,Colp,Conf1,vi),
153 changeContenu(Conf1,Pc1,Lig,Colp,Conf1a),
154 changeContenu(Conf1a,Pc2,Ligp,Colp,Conf1b),
155 changeContenu(Conf1b,vi,Lig,Col,Conf1c),
156 changeContenu(Conf1c,vi,Ligp,Col,Conf2).
162 glissement(Pc1,b,Conf1,Conf2):-
163 case(Lig,Col,Conf1,Pc1),
164 ((Pc1= n1, Pc2= no); (Pc1= j1, Pc2= ja)),
167 case(Ligpp,Col,Conf1,vi),
168 changeContenu(Conf1,Pc1,Ligp,Col,Conf1a),
169 changeContenu(Conf1a,Pc2,Ligpp,Col,Conf1b),
170 changeContenu(Conf1b,vi,Lig,Col,Conf2).
173 glissement(Pc1,h,Conf1,Conf2):-
174 case(Lig,Col,Conf1,Pc1),
175 ((Pc1= n1, Pc2= no); (Pc1= j1, Pc2= ja)),
178 case(Ligm,Col,Conf1,vi),
179 changeContenu(Conf1,Pc1,Ligm,Col,Conf1a),
180 changeContenu(Conf1a,Pc2,Lig,Col,Conf1b),
181 changeContenu(Conf1b,vi,Ligp,Col,Conf2).
183 /* blanc, à droite */
184 glissement(b1,d,Conf1,Conf2):-
185 case(Lig,Col,Conf1,b1),
188 case(Lig,Colpp,Conf1,vi),
189 changeContenu(Conf1,b1,Lig,Colp,Conf1a),
190 changeContenu(Conf1a,bl,Lig,Colpp,Conf1b),
191 changeContenu(Conf1b,vi,Lig,Col,Conf2).
193 /* blanc, à gauche */
194 glissement(b1,g,Conf1,Conf2):-
195 case(Lig,Col,Conf1,b1),
198 case(Lig,Colm,Conf1,vi),
199 changeContenu(Conf1,b1,Lig,Colm,Conf1a),
200 changeContenu(Conf1a,bl,Lig,Col,Conf1b),
201 changeContenu(Conf1b,vi,Lig,Colp,Conf2).
204 /* blanc, haut ou bas */
205 glissement(b1,D,Conf1,Conf2):-
206 case(Lig,Col,Conf1,b1),
210 case(Ligp,Col,Conf1,vi),
211 case(Ligp,Colp,Conf1,vi),
212 changeContenu(Conf1,b1,Ligp,Col,Conf1a),
213 changeContenu(Conf1a,bl,Ligp,Colp,Conf1b),
214 changeContenu(Conf1b,vi,Lig,Col,Conf1c),
215 changeContenu(Conf1c,vi,Lig,Colp,Conf2).
217 /* bois ou marron, gauche ou droite*/
218 glissement(PC,D,Conf1,Conf2):-
219 case(Lig,Col,Conf1,PC),
223 case(Lig,Colp,Conf1,vi),
224 changeContenu(Conf1,PC,Lig,Colp,Conf1a),
225 changeContenu(Conf1a,vi,Lig,Col,Conf2).
228 /* bois ou marron, haut ou bas*/
229 glissement(PC,D,Conf1,Conf2):-
230 case(Lig,Col,Conf1,PC),
234 case(Ligp,Col,Conf1,vi),
235 changeContenu(Conf1,PC,Ligp,Col,Conf1a),
236 changeContenu(Conf1a,vi,Lig,Col,Conf2).
240 /* ajoute la nouvelle paire (Conf, deplacements) à la fin en s assurant
241 que la conf n a pas encore été visitéé */
243 /*insert_fin((X,Y),[],[(X,Y)]).
244 insert_fin((X,_),[(X,K)|R1],[(X,K)|R1]):-!.
245 insert_fin(X,[T|R1],[T|R2]):-
248 insert_fin_liste([],L,L).
249 insert_fin_liste([X|R],L,Res):-
250 insert_fin_liste(R,L,Resp),
251 insert_fin(X,Resp,Res).
254 fusion_confs([],L2,L2).
255 fusion_confs(L1,[],L1).
256 fusion_confs(L1,L2,Res):-
258 ajoute_liste_assoc(L2,A,B),
259 assoc_to_list(B,Res).
261 ajoute_liste_assoc([],A,A).
262 ajoute_liste_assoc([K-V|L],A,B):-
263 ajoute_liste_assoc(L,A,Ap),
266 /* Tous les successeurs d une configuration */
267 successeurs((Confa,Chemins),L):-
269 (Confb,[(P,D)|Chemins]),
270 glissement(P,D,Confa,Confb),
277 successeurs_liste([],[]).
278 successeurs_liste([Ca|Cs],ConfsSucc):-
280 successeurs_liste(Cs,ConfsSuccInter),
281 fusion_confs(L,ConfsSuccInter,ConfsSucc).
282 /*insert_fin_liste(L,ConfsSuccInter,ConfsSucc).*/
285 successeurs_liste([Ca|Cs],ConfsSucc):-
287 successeurs_liste(Cs,ConfsSuccInter),
288 append(L,ConfsSuccInter,ConfsSucc).
292 /* regarde si le premier parametre appartient
293 à la liste donné en second parametre. Si c est le cas,
294 retourne le chemin */
297 appartient((Conf1,_),[(Conf1,_)|_]):-!.
298 appartient((Conf1,C),[_|L]):-
299 appartient((Conf1,C),L).
302 difference([El|L1],L2,Res):-
305 difference(L1,L2,Res).
306 difference([El|L1],L2,[El|Res]):-
307 difference(L1,L2,Res).
311 but([(Conf,Chemin)|_],Chemin):-final(Conf).
312 but([_|L],Chemin):-but(L,Chemin).
315 largeur(Atraiter,_,_,Res):-
320 write('but : '),writeln(DT),
322 largeur(Atraiter,Visites,C,Res):-
324 write('boucle'), writeln(C),
326 successeurs_liste(Atraiter,Succ),
329 write('successeur : '),writeln(DT1),
331 difference(Succ,Visites,Atraiter2),
334 write('difference : '),writeln(DT3),
336 insert_fin_liste(Atraiter,Visites,Visites2),
339 write('Visites2 : '),writeln(DT5),
340 largeur(Atraiter2,Visites2,Cp,Res).
345 largeur([(X,[])],[],0,Res).
352 display_ligne([El|R]):-
357 display_conf([L|R]):-
365 display_conf_chemin((Conf,Chemin)):-
366 display_conf(Conf),display_chemin(Chemin).
368 display_conf_chemin_liste([]).
369 display_conf_chemin_liste([CL|R]):-
370 display_conf_chemin(CL),
372 display_conf_chemin_liste(R).