1 /* accesseurs sur ligne et colonne*/
2 :-use_module(library(assoc)).
5 piece(ro,[[(2,0),(2,1)],[(0,2),(1,2)],[(-1,0),(-1,1)],[(0,-1),(1,-1)]],
6 [[(0,0),(0,1)],[(0,0),(1,0)],[(1,0),(1,1)],[(0,1),(1,1)]]).
7 piece(j1,[[(1,0),(1,1)],[(0,2)],[(-1,0),(-1,1)],[(0,-1)]],
8 [[(0,0),(0,1)],[(0,0)],[(0,0),(0,1)],[(0,1)]]).
9 piece(j2,[[(1,0),(1,1)],[(0,2)],[(-1,0),(-1,1)],[(0,-1)]],
10 [[(0,0),(0,1)],[(0,0)],[(0,0),(0,1)],[(0,1)]]).
11 piece(n1,[[(1,0),(1,1)],[(0,2)],[(-1,0),(-1,1)],[(0,-1)]],
12 [[(0,0),(0,1)],[(0,0)],[(0,0),(0,1)],[(0,1)]]).
13 piece(n2,[[(1,0),(1,1)],[(0,2)],[(-1,0),(-1,1)],[(0,-1)]],
14 [[(0,0),(0,1)],[(0,0)],[(0,0),(0,1)],[(0,1)]]).
15 piece(bl,[[(2,0)],[(0,1),(1,1)],[(-1,0)],[(0,-1),(1,-1)]],
16 [[(0,0)],[(0,0),(1,0)],[(1,0)],[(0,0),(1,0)]]).
17 piece(b1,[[(1,0)],[(0,1)],[(-1,0)],[(0,-1)]],
18 [[(0,0)],[(0,0)],[(0,0)],[(0,0)]]).
19 piece(b2,[[(1,0)],[(0,1)],[(-1,0)],[(0,-1)]],
20 [[(0,0)],[(0,0)],[(0,0)],[(0,0)]]).
21 piece(m1,[[(1,0)],[(0,1)],[(-1,0)],[(0,-1)]],
22 [[(0,0)],[(0,0)],[(0,0)],[(0,0)]]).
23 piece(m2,[[(1,0)],[(0,1)],[(-1,0)],[(0,-1)]],
24 [[(0,0)],[(0,0)],[(0,0)],[(0,0)]]).
28 direction(g,2,(-1,0)).
29 direction(h,3,(0,-1)).
33 gen_assoc(P,Conf,Coord).
36 plus_binaire((X1,Y1),(X2,Y2),(Xp,Yp)):-
43 deplace_vide(Conf,Conf,[],[]).
44 deplace_vide(Conf,ConR,[V|Lvide],[Coord|Lcoord]):-
45 deplace_vide(Conf,ConRp,Lvide,Lcoord),
46 put_assoc(V,ConRp,Coord,ConR).
49 /*tous les glissements */
50 glissement(P,D,Conf1,Conf2):-
51 piece(P,TestVides,NouvVides),
53 direction(D,Idx,DeltaCoord),
54 nth0(Idx,TestVides,Delta),
55 nth0(Idx,NouvVides,NVp),
56 plus_binaire(DeltaCoord,Coord,NCoord),
57 maplist(plus_binaire(Coord),Delta,L),
58 maplist(plus_binaire(Coord),NVp,Lp),
59 maplist(case(Conf1),L,LVp),
60 maplist(est_vide,LVp),
61 put_assoc(P,Conf1,NCoord,Conf1b),
62 deplace_vide(Conf1b,Conf2,LVp,Lp).
66 gl_time(P,D,Confa,Confb):-
68 glissement(P,D,Confa,Confb),
71 write('depl : '),writeln(DT3).
73 /* Tous les successeurs d une configuration */
74 successeurs(Confa-Chemins,L):-
76 Confb-[(P,D)|Chemins],
77 glissement(P,D,Confa,Confb),
80 successeurs_liste(L,Sl):-
81 maplist(successeurs,L,Lp),
88 /* regarde si le premier parametre appartient
89 à la liste donné en second parametre. Si c est le cas,
97 appartient(Conf1-_,[Conf1-_|_]):-!.
98 appartient(Conf1-C,[_|L]):-
99 appartient(Conf1-C,L).
103 difference([El|L1],L2,Res):-
106 difference(L1,L2,Res).
107 difference([El|L1],L2,[El|Res]):-
108 difference(L1,L2,Res).
115 but([Conf-Chemin|_],Chemin):-final(Conf),!.
116 but([_|L],Chemin):-but(L,Chemin).
119 largeur(Atraiter,_,_,Res):-
122 largeur(Atraiter,Visites,C,Res):-
124 write('boucle'), writeln(C),
126 successeurs_liste(Atraiter,Succ),
128 write('taille succ : '),writeln(Taille),
131 append(Atraiter,Visites,Visites2),
133 difference(Succ,Visites2,Atraiter2),
136 write('successeur : '),writeln(DT1),
137 write('difference : '),writeln(DT3),
138 largeur(Atraiter2,Visites2,Cp,Res).
142 largeur([X-[]],[],0,Res).
179 gen_assoc(n1,X,(1,3)),
180 gen_assoc(n2,X,(2,3)),!.
182 gen_assoc(n2,X,(1,3)),
183 gen_assoc(n1,X,(2,3)).
188 gen_assoc(bl,X,(2,2)),
189 gen_assoc(m2,X,(2,4)),
190 gen_assoc(n2,X,(3,3)).