]> AND Private Git Repository - cours-maths-dis.git/blob - tpProlog/diaballik/prolog/.svn/tmp/tempfile.2.tmp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
42b6a6c68c1f8b12d9bc2a181d4e56b659640c6f
[cours-maths-dis.git] / tpProlog / diaballik / prolog / .svn / tmp / tempfile.2.tmp
1 :-use_module(library(clpfd)).
2
3
4 /* init7(Coul,Jeu),successeurs(Jeu,Coul,L),length(L,N),aff_coup_possible(L). 
5 init3(Coul,Jeu),successeurs(Jeu,Coul,L),length(L,N),aff_coup_possible(L).
6 init5(Coul,Jeu),successeurs(Jeu,Coul,L),length(L,N),aff_coup_possible(L). */
7
8 /***************/
9 /* aritmétique */
10 /***************/
11
12 abs(X,X):-
13     X >= 0. 
14 abs(X,A):-
15     A is 0 - X.
16
17 min(X,Y,X):-
18     X =< Y. 
19 min(_,Y,Y). 
20
21 max(X,Y,X):-
22     X > Y .
23 max(_,Y,Y). 
24
25
26
27 /* types de case 
28   v : vide
29   b : blanc
30   n : noire
31   bb: blanc + balle 
32   nb: noire + balle
33 */
34     
35
36 /*****************************/
37 /* Colonnes, lignes et cases */
38 /*****************************/
39
40 /* accesseurs sur ligne et colonne*/
41
42 ligcol(1,[A,_,_,_,_,_,_],A).
43 ligcol(2,[_,A,_,_,_,_,_],A).
44 ligcol(3,[_,_,A,_,_,_,_],A).
45 ligcol(4,[_,_,_,A,_,_,_],A).
46 ligcol(5,[_,_,_,_,A,_,_],A).
47 ligcol(6,[_,_,_,_,_,A,_],A).
48 ligcol(7,[_,_,_,_,_,_,A],A).
49
50 ligcol(1,[A,_,_,_,_],A).
51 ligcol(2,[_,A,_,_,_],A).
52 ligcol(3,[_,_,A,_,_],A).
53 ligcol(4,[_,_,_,A,_],A).
54 ligcol(5,[_,_,_,_,A],A).
55
56 ligcol(1,[A,_,_],A).
57 ligcol(2,[_,A,_],A).
58 ligcol(3,[_,_,A],A).
59
60
61
62
63
64
65
66
67 /* retourne le contenu "Contenu_case" de la case  
68 situé à la colonne "Col" et la ligne "Lig" du jeux en cours
69 "Contenu_jeu" */
70  
71 case(Lig,Col,Contenu_jeu,Contenu_case) :- 
72     ligcol(Lig,Contenu_jeu,Ligne),
73     ligcol(Col,Ligne,Contenu_case).
74
75
76
77
78 changeContenuLigCol(1,X,[_,B,C,D,E,F,G],[X,B,C,D,E,F,G]).
79 changeContenuLigCol(2,X,[A,_,C,D,E,F,G],[A,X,C,D,E,F,G]).
80 changeContenuLigCol(3,X,[A,B,_,D,E,F,G],[A,B,X,D,E,F,G]).
81 changeContenuLigCol(4,X,[A,B,C,_,E,F,G],[A,B,C,X,E,F,G]).
82 changeContenuLigCol(5,X,[A,B,C,D,_,F,G],[A,B,C,D,X,F,G]).
83 changeContenuLigCol(6,X,[A,B,C,D,E,_,G],[A,B,C,D,E,X,G]).
84 changeContenuLigCol(7,X,[A,B,C,D,E,F,_],[A,B,C,D,E,F,X]).
85
86 changeContenuLigCol(1,X,[_,B,C,D,E],[X,B,C,D,E]).
87 changeContenuLigCol(2,X,[A,_,C,D,E],[A,X,C,D,E]).
88 changeContenuLigCol(3,X,[A,B,_,D,E],[A,B,X,D,E]).
89 changeContenuLigCol(4,X,[A,B,C,_,E],[A,B,C,X,E]).
90 changeContenuLigCol(5,X,[A,B,C,D,_],[A,B,C,D,X]).
91
92 changeContenuLigCol(1,X,[_,B,C],[X,B,C]).
93 changeContenuLigCol(2,X,[A,_,C],[A,X,C]).
94 changeContenuLigCol(3,X,[A,B,_],[A,B,X]).
95
96
97
98
99
100 changeContenu(Conf1,Piece,Y,X,Conf2):-
101     ligcol(Y,Conf1,Ligne),
102     changeContenuLigCol(X,Piece,Ligne,Lignep),
103     changeContenuLigCol(Y,Lignep,Conf1,Conf2).
104
105
106
107     
108 sans_balle(b).
109 sans_balle(n).
110
111
112 /*********************/
113 /* position initiale */
114 /*********************/
115
116 init7(b,
117      [[b,b,b,bb,b,b,b], 
118       [v,v,v,v,v,v,v],
119       [v,v,v,v,v,v,v],
120       [v,v,v,v,v,v,v],
121       [v,v,v,v,v,v,v],
122       [v,v,v,v,v,v,v], 
123       [n,n,n,nb,n,n,n]]).
124
125 init7_2(b,
126      [[b,n,b,bb,b,n,b], 
127       [v,v,v,v,v,v,v],
128       [v,v,v,v,v,v,v],
129       [v,v,v,v,v,v,v],
130       [v,v,v,v,v,v,v],
131       [v,v,v,v,v,v,v], 
132       [n,b,n,nb,n,b,n]]).
133
134 init7_test1(b,
135      [[v,n,v,v,v,n,b],  
136       [v,v,v,v,v,v,v],
137       [b,v,b,b,b,bb,v],
138       [v,v,v,v,v,v,v],
139       [v,v,v,v,v,v,v],
140       [v,v,v,v,n,b,n], 
141       [n,v,n,nb,v,v,v]]).
142
143
144 init7_test_victoire(b,
145      [[v,n,v,v,v,n,b],  
146       [v,v,v,v,v,v,v],
147       [b,v,b,b,b,b,v],
148       [v,v,v,v,v,v,v],
149       [v,v,v,v,v,v,v],
150       [v,v,v,v,n,b,n], 
151       [n,bb,n,nb,v,v,v]]).
152
153 init7_test_victoire2(b,
154      [[v,n,v,v,v,nb,b], 
155       [v,v,v,v,v,v,v],
156       [b,v,b,v,b,b,v],
157       [v,v,v,v,v,v,v],
158       [v,v,v,v,v,v,v],
159       [v,v,v,v,n,b,n], 
160       [n,bb,n,n,v,v,v]]).
161
162
163 init5(b,
164      [[b,b,bb,b,b],     
165       [v,v,v,v,v],
166       [v,v,v,v,v],
167       [v,v,v,v,v], 
168       [n,n,nb,n,n]]).
169
170 init5_2(b,
171      [[n,b,bb,b,n],     
172       [v,v,v,v,v],
173       [v,v,v,v,v],
174       [v,v,v,v,v], 
175       [b,n,nb,n,b]]).
176
177
178 init3(b,
179      [[b,bb,b], 
180       [v,v,v],
181       [n,nb,n]]).
182
183 init3_2(b,
184      [[n,bb,n], 
185       [v,v,v],
186       [b,nb,b]]).
187
188
189
190
191
192 /* affichage */
193
194 affligne:-write('-----------------------------'),nl.
195
196 affiche(Jeu):-
197     affligne,
198     affiche2(Jeu).
199
200 affiche2([]).
201
202 affiche2([Prem_ligne|Reste]):-
203     write('|'),affpions(Prem_ligne),nl,affligne,
204     affiche2(Reste).
205
206 affpions([]).
207
208 affpions([b|R]):-
209     write(' b |'),
210     affpions(R).
211
212 affpions([v|R]):-
213     write('   |'),
214     affpions(R).
215
216 affpions([n|R]):-
217     write(' n |'),
218     affpions(R).
219
220 affpions([bb|R]):-
221     write(' bb|'),
222     affpions(R).
223
224 affpions([nb|R]):-
225     write(' nb|'),
226     affpions(R).
227
228
229
230
231 aff_coup_possible([]).
232
233 aff_coup_possible([P|R]):-
234     affiche(P),
235     aff_coup_possible(R).
236
237
238 /* victoire */
239
240
241 test_victoire(Coul,Jeu,true):-
242                 victoire(Coul,Jeu).
243
244 test_victoire(Coul,Jeu,false):-
245                 not(victoire(Coul,Jeu)).
246
247
248
249 victoire(n,Contenu_jeu):-            
250     case(1,_,Contenu_jeu,nb).   
251
252 victoire(b,Contenu_jeu):-
253     case(7,_,Contenu_jeu,bb).
254
255
256 /*************************/
257 /* deplacement possibles */
258 /*************************/
259
260 deplacement(0,_,Contenu_jeu,Contenu_jeu).
261
262
263 /*monter un */ 
264 deplacement(1,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
265     case(Lig,Col,Contenu_jeu,Coul),
266     Ligp is Lig-1, Ligp >= 1, 
267     case(Ligp,Col,Contenu_jeu,v),
268                 changeContenu(Contenu_jeu,v,Lig,Col,Contenu_jeu1),
269                 changeContenu(Contenu_jeu1,Coul,Ligp,Col,Nouv_Contenu_jeu).
270
271
272 /*gauche un */ 
273 deplacement(1,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
274     case(Lig,Col,Contenu_jeu,Coul),
275     Colp is Col-1, Colp >= 1, 
276     case(Lig,Colp,Contenu_jeu,v),
277                 changeContenu(Contenu_jeu,v,Lig,Col,Contenu_jeu1),
278                 changeContenu(Contenu_jeu1,Coul,Lig,Colp,Nouv_Contenu_jeu).
279
280
281
282
283 /* descendre */
284
285 depl(X,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
286                 deplacement(X,Coul,Contenu_jeu,Nouv_Contenu_jeu).
287 depl(X,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
288                 deplacement(X,Coul,Nouv_Contenu_jeu,Contenu_jeu).
289
290
291 /*************************/
292 /* lancer de balle       */
293 /*************************/
294
295 amis(n,n).
296
297 amis(n,v).
298 amis(b,b).
299
300 amis(b,v).
301
302
303 ma_couleur(b,b).
304 ma_couleur(b,bb).
305
306 ma_couleur(n,n).
307 ma_couleur(n,nb).
308
309 balon(n,nb).
310 balon(b,bb).
311
312 aucun_adversaire_ligne(_,_,_,_,0).
313 aucun_adversaire_ligne(Coul,Lig,Col,Contenu_jeu,Delta):-      
314     Colp is Col + Delta, 
315     case(Lig,Colp,Contenu_jeu,Coulp),
316     amis(Coul,Coulp),
317     Deltap is Delta -1,
318     aucun_adversaire_ligne(Coul,Lig,Col,Contenu_jeu,Deltap).
319
320 aucun_adversaire_col(_,_,_,_,0).
321 aucun_adversaire_col(Coul,Lig,Col,Contenu_jeu,Delta):-
322     Ligp is Lig + Delta, 
323     case(Ligp,Col,Contenu_jeu,Coulp),
324     amis(Coul,Coulp),
325     Deltap is Delta -1,
326     aucun_adversaire_col(Coul,Lig,Col,Contenu_jeu,Deltap).
327
328
329
330
331
332 sign(x,1):- x >= 0.
333 sign(x,-1):- x < 0.
334
335
336 aucun_adversaire_diag1(_,_,_,_,0).
337 aucun_adversaire_diag1(Coul,Lig,Col,Contenu_jeu,Delta):-
338     Ligp is Lig + Delta, Colp is Col + Delta,
339     case(Ligp,Colp,Contenu_jeu,Coulp),
340     amis(Coul,Coulp),
341                 sign(Delta,s),
342     Deltap is Delta -s,
343     aucun_adversaire_diag1(Coul,Lig,Col,Contenu_jeu,Deltap).
344
345 aucun_adversaire_diag2(_,_,_,_,0).
346 aucun_adversaire_diag2(Coul,Lig,Col,Contenu_jeu,Delta):-
347     Ligp is Lig + Delta, Colp is Col - Delta,
348     case(Ligp,Colp,Contenu_jeu,Coulp),
349     amis(Coul,Coulp),
350                 sign(Delta,s),
351     Deltap is Delta -s,
352     aucun_adversaire_diag2(Coul,Lig,Col,Contenu_jeu,Deltap).
353
354
355
356
357
358 /* horizontal */
359 lancerh(Coul,Contenu_jeu,Nouv_Contenu_jeu):-       
360     balon(Coul,Coulb),
361     case(Lig,Col,Contenu_jeu,Coulb),
362     case(Lig,Colp,Contenu_jeu,Coul),
363     min(Col,Colp,Min),
364     max(Col,Colp,Max),
365     Delta is Max-Min -1,
366     aucun_adversaire_ligne(Coul,Lig,Min,Contenu_jeu,Delta),
367
368                 changeContenu(Contenu_jeu,Coul,Lig,Col,Contenu_jeu1),
369                 changeContenu(Contenu_jeu1,Coulb,Lig,Colp,Nouv_Contenu_jeu).
370
371 /*    case(Lig,Col,Nouv_Contenu_jeu,Coul),
372     case(Lig,Colp,Nouv_Contenu_jeu,Coulb).*/
373     
374
375 /* vertical */
376 lancerv(Coul,Contenu_jeu,Nouv_Contenu_jeu):-
377     balon(Coul,Coulb),
378     case(Lig,Col,Contenu_jeu,Coulb),
379     case(Ligp,Col,Contenu_jeu,Coul),
380     min(Lig,Ligp,Min),
381     max(Lig,Ligp,Max),
382     Delta is Max-Min -1,
383     aucun_adversaire_col(Coul,Lig,Min,Contenu_jeu,Delta),
384    
385                 changeContenu(Contenu_jeu,Coul,Lig,Col,Contenu_jeu1),
386                 changeContenu(Contenu_jeu1,Coulb,Ligp,Col,Nouv_Contenu_jeu).
387                 /*case(Lig,Col,Nouv_Contenu_jeu,Coul),
388     case(Ligp,Col,Nouv_Contenu_jeu,Coulb).*/
389
390
391 /* diag haut droite */
392 lancerd1(Coul,Contenu_jeu,Nouv_Contenu_jeu):-
393     balon(Coul,Coulb),
394     case(Lig,Col,Contenu_jeu,Coulb),
395     case(Ligp,Colp,Contenu_jeu,Coul),
396     Delta is Ligp-Lig -1,
397     Delta is Colp-Col -1,
398     aucun_adversaire_diag1(Coul,Lig,Col,Contenu_jeu,Delta),
399                 
400                 changeContenu(Contenu_jeu,Coul,Lig,Col,Contenu_jeu1),
401                 changeContenu(Contenu_jeu1,Coulb,Ligp,Colp,Nouv_Contenu_jeu).
402
403     /*case(Lig,Col,Nouv_Contenu_jeu,Coul),
404     case(Ligp,Colp,Nouv_Contenu_jeu,Coulb).*/
405     
406
407
408
409
410 /* diag haut gauche */
411 lancerd2(Coul,Contenu_jeu,Nouv_Contenu_jeu):-
412     balon(Coul,Coulb),
413     case(Lig,Col,Contenu_jeu,Coulb),
414     case(Ligp,Colp,Contenu_jeu,Coul),
415     Delta is -(Ligp-Lig -1),
416     Delta is Colp-Col -1,
417     aucun_adversaire_diag2(Coul,Lig,Col,Contenu_jeu,Delta),
418     
419                 changeContenu(Contenu_jeu,Coul,Lig,Col,Contenu_jeu1),
420                 changeContenu(Contenu_jeu1,Coulb,Ligp,Colp,Nouv_Contenu_jeu).
421
422     /*case(Lig,Col,Nouv_Contenu_jeu,Coul),
423     case(Ligp,Colp,Nouv_Contenu_jeu,Coulb).*/
424
425     
426
427
428 lancer(0,_,Contenu_jeu,Contenu_jeu).
429
430 lancer(1,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
431                 lancerv(Coul,Contenu_jeu,Nouv_Contenu_jeu);
432     lancerh(Coul,Contenu_jeu,Nouv_Contenu_jeu);
433     lancerd1(Coul,Contenu_jeu,Nouv_Contenu_jeu);
434     lancerd2(Coul,Contenu_jeu,Nouv_Contenu_jeu).
435
436
437
438 coup(Coul,Contenu_Jeu,Nouv_Contenu_jeu):-
439                 lancer(L1,Coul,Contenu_Jeu,Contenu_jeu1),
440                 depl(D1,Coul,Contenu_jeu1,Contenu_jeu2),
441                 lancer(L2,Coul,Contenu_jeu2,Contenu_jeu3),
442                 depl(D2,Coul,Contenu_jeu3,Contenu_jeu4),
443                 lancer(L3,Coul,Contenu_jeu4,Nouv_Contenu_jeu),
444                 L is L1+L2+L3,
445                 L=<1,
446                 D is    D1+D2,
447                 D =< 2.
448
449 /* tour */
450 joueur_suivant(n,b).
451 joueur_suivant(b,n).
452
453
454
455
456 /************ TODO à affiner **********/
457
458
459 valeur(b,Conf,1000):-
460                 victoire(b,Conf).
461
462 valeur(b,Conf,T):- 
463     maplist(nb_ele(b),Conf,L1),
464     length(Conf,N),
465     numlist(1,N,L2),
466     maplist(poids_ligne,L1,L2,L3),
467     sumlist(L3,T),!.
468
469 <<<<<<< .mine
470     /* pour une ligne de poids X, de rang Y, son poids est P */
471 poids_ligne(X,Y,P):-
472     P is 10*X*Y,!.
473 =======
474 valeur(n,Conf,T):-
475                 victoire(n,Conf),
476                 T is -1000.
477
478 valeur(n,Conf,Tp):- 
479     maplist(nb_ele(n),Conf,L1),
480     length(Conf,N),
481     numlist(1,N,L2),
482     maplist(poids_ligne2(N),L1,L2,L3),
483     sumlist(L3,T),
484                 Tp is -T,
485                 !.
486
487
488     /* pour une ligne de poids X, de rang Y, son poids est N */
489 poids_ligne(X,Y,N):-
490     N is 10*X*Y,!.
491 >>>>>>> .r7
492
493 poids_ligne2(N,X,Y,R):-
494     R is (N+1-Y)*10*X,!.
495
496     /*nbre d elements N de la couleur Coul dans la liste L */
497 nb_ele(Coul,L,N):-
498     sublist(ma_couleur(Coul),L,Lp),
499     length(Lp,N).
500
501 successeurs(N,Coul,L) :- 
502     findall(NP,coup(Coul,N,NP),Lp),
503     list_to_set(Lp,Lpp),
504     filtre_sym(Lpp,L).
505
506     /*
507       choisit la meilleur conf à partir de Conf parmi les susccesseurs 
508       alpha est la valeur minimum estimée jusqu'à présent
509       beta  est la valeur maximum estimée jusqu'à présent
510     */
511 evaluate_and_choose(Coul,[Succ|Succs],Conf,D,Alpha,Beta,Record,MeilleurSuccVal):-
512     joueur_suivant(Coul,Coulp),
513     alpha_beta(Coulp,D,Succ,Alpha,Beta,_,Valeur),
514     Valeurp is -Valeur,
515     cutoff(Coul,Succ,Valeurp,D,Alpha,Beta,Succs,Conf,Record,MeilleurSuccVal).
516
517 evaluate_and_choose(_,[],_,_,Alpha,_,Record,(Record,Alpha)).
518
519
520 /* implantation alpha beta du minimax */
521 alpha_beta(Coul,0,Conf,_,_,_,Valeur) :- 
522     valeur(Coul,Conf,Valeur).
523
524 alpha_beta(Coul,D,Conf,Alpha,Beta,Succ,Valeur) :- 
525     D > 0,
526     successeurs(Conf,Coul,Succs),
527     Alpha1 is -Beta, 
528     Beta1 is -Alpha,
529     D1 is D-1, 
530     writef('%w\n %w\n %w\n%w\n %w\n %w\n%w\n %w\n',[Coul,Conf,D1,Alpha1,Beta1,nil,Succ,Valeur]),
531     evaluate_and_choose(Coul,Succs,Conf,D1,Alpha1,Beta1,nil,(Succ,Valeur)).
532
533
534 cutoff(_,Succ,Valeur,_,_,Beta,_,_,_,(Succ,Valeur)):- 
535     Valeur >= Beta,!.
536 cutoff(Coul,Succ,Valeur,D,Alpha,Beta,Succs,Conf,_Record,MeilleurSuccVal):- 
537     Alpha < Value, Value < Beta,  
538     evaluate_and_choose(Coul,Succs,Conf,D,Valeur,Beta,Succ,MeilleurSuccVal).
539 cutoff(Coul,_,Valeur,D,Alpha,Beta,Succs,Conf,Record,MeilleurSuccVal) :- 
540     Valeur =< Alpha,!, 
541     evaluate_and_choose(Coul,Succs,Conf,D,Alpha,Beta,Record,MeilleurSuccVal).
542
543
544 symetrique(
545     [
546      [A1,A2,A3,A4,A5,A6,A7],
547      [B1,B2,B3,B4,B5,B6,B7],
548      [C1,C2,C3,C4,C5,C6,C7],
549      [D1,D2,D3,D4,D5,D6,D7],
550      [E1,E2,E3,E4,E5,E6,E7],
551      [F1,F2,F3,F4,F5,F6,F7],
552      [G1,G2,G3,G4,G5,G6,G7]],
553     [[A7,A6,A5,A4,A3,A2,A1],
554      [B7,B6,B5,B4,B3,B2,B1],
555      [C7,C6,C5,C4,C3,C2,C1],
556      [D7,D6,D5,D4,D3,D2,D1],
557      [E7,E6,E5,E4,E3,E2,E1],
558      [F7,F6,F5,F4,F3,F2,F1],
559      [G7,G6,G5,G4,G3,G2,G1]]).
560
561 symetrique(
562     [
563      [A1,A2,A3,A4,A5],
564      [B1,B2,B3,B4,B5],
565      [C1,C2,C3,C4,C5],
566      [D1,D2,D3,D4,D5],
567      [E1,E2,E3,E4,E5]],
568     [[A5,A4,A3,A2,A1],
569      [B5,B4,B3,B2,B1],
570      [C5,C4,C3,C2,C1],
571      [D5,D4,D3,D2,D1],
572      [E5,E4,E3,E2,E1]]).
573
574 symetrique(
575     [
576      [A1,A2,A3],
577      [B1,B2,B3],
578      [C1,C2,C3]],
579     [[A3,A2,A1],
580      [B3,B2,B1],
581      [C3,C2,C1]]).
582
583 non_symetrique_de(X,Y):- not(symetrique(X,Y)).
584
585 filtre_sym([],[]).
586 filtre_sym([X|T],[X|R]):-
587     sublist(non_symetrique_de(X),T,Ns),
588     filtre_sym(Ns,R).
589
590
591 /*
592 tour(Contenu_Jeu, Coul) :-
593                 victoire(Coul,Contenu_Jeu).
594
595 tour(Contenu_Jeu, Coul) :-
596                 coup(Coul,Contenu_Jeu,Nouv_Contenu_jeu),
597                 victoire(Coul,Nouv_Contenu_jeu).
598                 
599
600 tour(Contenu_Jeu, Coul) :-
601                 coup(Coul,Contenu_Jeu,Nouv_Contenu_jeu),
602                 joueur_suivant(Coul,Coulp),
603                 not(victoire(Coul,Nouv_Contenu_jeu)),
604                 tour(Nouv_Contenu_jeu,Coulp).
605 */
606
607
608
609