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

Private GIT Repository
ajout initial de fichiers
[cours-maths-dis.git] / tpProlog / diaballik / prolog / .svn / tmp / tempfile.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,b,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
154 init5(b,
155      [[b,b,bb,b,b],     
156       [v,v,v,v,v],
157       [v,v,v,v,v],
158       [v,v,v,v,v], 
159       [n,n,nb,n,n]]).
160
161 init5_2(b,
162      [[n,b,bb,b,n],     
163       [v,v,v,v,v],
164       [v,v,v,v,v],
165       [v,v,v,v,v], 
166       [b,n,nb,n,b]]).
167
168
169 init3(b,
170      [[b,bb,b], 
171       [v,v,v],
172       [n,nb,n]]).
173
174 init3_2(b,
175      [[n,bb,n], 
176       [v,v,v],
177       [b,nb,b]]).
178
179
180
181
182
183 /* affichage */
184
185 affligne:-write('-----------------------------'),nl.
186
187 affiche(Jeu):-
188     affligne,
189     affiche2(Jeu).
190
191 affiche2([]).
192
193 affiche2([Prem_ligne|Reste]):-
194     write('|'),affpions(Prem_ligne),nl,affligne,
195     affiche2(Reste).
196
197 affpions([]).
198
199 affpions([b|R]):-
200     write(' b |'),
201     affpions(R).
202
203 affpions([v|R]):-
204     write('   |'),
205     affpions(R).
206
207 affpions([n|R]):-
208     write(' n |'),
209     affpions(R).
210
211 affpions([bb|R]):-
212     write(' bb|'),
213     affpions(R).
214
215 affpions([nb|R]):-
216     write(' nb|'),
217     affpions(R).
218
219
220
221
222 aff_coup_possible([]).
223
224 aff_coup_possible([P|R]):-
225     affiche(P),
226     aff_coup_possible(R).
227
228
229 /* victoire */
230
231
232 test_victoire(Coul,Jeu,true):-
233                 victoire(Coul,Jeu).
234
235 test_victoire(Coul,Jeu,false):-
236                 not(victoire(Coul,Jeu)).
237
238
239
240 victoire(n,Contenu_jeu):-            
241     case(1,_,Contenu_jeu,nb).   
242
243 victoire(b,Contenu_jeu):-
244     case(7,_,Contenu_jeu,bb).
245
246
247 /*************************/
248 /* deplacement possibles */
249 /*************************/
250
251 deplacement(0,_,Contenu_jeu,Contenu_jeu).
252
253
254 /*monter un */ 
255 deplacement(1,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
256     case(Lig,Col,Contenu_jeu,Coul),
257     Ligp is Lig-1, Ligp >= 1, 
258     case(Ligp,Col,Contenu_jeu,v),
259                 changeContenu(Contenu_jeu,v,Lig,Col,Contenu_jeu1),
260                 changeContenu(Contenu_jeu1,Coul,Ligp,Col,Nouv_Contenu_jeu).
261
262
263 /*gauche un */ 
264 deplacement(1,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
265     case(Lig,Col,Contenu_jeu,Coul),
266     Colp is Col-1, Colp >= 1, 
267     case(Lig,Colp,Contenu_jeu,v),
268                 changeContenu(Contenu_jeu,v,Lig,Col,Contenu_jeu1),
269                 changeContenu(Contenu_jeu1,Coul,Lig,Colp,Nouv_Contenu_jeu).
270
271
272
273
274 /* descendre */
275
276 depl(X,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
277                 deplacement(X,Coul,Contenu_jeu,Nouv_Contenu_jeu).
278 depl(X,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
279                 deplacement(X,Coul,Nouv_Contenu_jeu,Contenu_jeu).
280
281
282 /*************************/
283 /* lancer de balle       */
284 /*************************/
285
286 amis(n,n).
287
288 amis(n,v).
289 amis(b,b).
290
291 amis(b,v).
292
293
294 ma_couleur(b,b).
295 ma_couleur(b,bb).
296
297 ma_couleur(n,n).
298 ma_couleur(n,nb).
299
300 balon(n,nb).
301 balon(b,bb).
302
303 aucun_adversaire_ligne(_,_,_,_,0).
304 aucun_adversaire_ligne(Coul,Lig,Col,Contenu_jeu,Delta):-      
305     Colp is Col + Delta, 
306     case(Lig,Colp,Contenu_jeu,Coulp),
307     amis(Coul,Coulp),
308     Deltap is Delta -1,
309     aucun_adversaire_ligne(Coul,Lig,Col,Contenu_jeu,Deltap).
310
311 aucun_adversaire_col(_,_,_,_,0).
312 aucun_adversaire_col(Coul,Lig,Col,Contenu_jeu,Delta):-
313     Ligp is Lig + Delta, 
314     case(Ligp,Col,Contenu_jeu,Coulp),
315     amis(Coul,Coulp),
316     Deltap is Delta -1,
317     aucun_adversaire_col(Coul,Lig,Col,Contenu_jeu,Deltap).
318
319
320
321
322
323 sign(x,1):- x >= 0.
324 sign(x,-1):- x < 0.
325
326
327 aucun_adversaire_diag1(_,_,_,_,0).
328 aucun_adversaire_diag1(Coul,Lig,Col,Contenu_jeu,Delta):-
329     Ligp is Lig + Delta, Colp is Col + Delta,
330     case(Ligp,Colp,Contenu_jeu,Coulp),
331     amis(Coul,Coulp),
332                 sign(Delta,s),
333     Deltap is Delta -s,
334     aucun_adversaire_diag1(Coul,Lig,Col,Contenu_jeu,Deltap).
335
336 aucun_adversaire_diag2(_,_,_,_,0).
337 aucun_adversaire_diag2(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_diag2(Coul,Lig,Col,Contenu_jeu,Deltap).
344
345
346
347
348
349 /* horizontal */
350 lancerh(Coul,Contenu_jeu,Nouv_Contenu_jeu):-       
351     balon(Coul,Coulb),
352     case(Lig,Col,Contenu_jeu,Coulb),
353     case(Lig,Colp,Contenu_jeu,Coul),
354     min(Col,Colp,Min),
355     max(Col,Colp,Max),
356     Delta is Max-Min -1,
357     aucun_adversaire_ligne(Coul,Lig,Min,Contenu_jeu,Delta),
358
359                 changeContenu(Contenu_jeu,Coul,Lig,Col,Contenu_jeu1),
360                 changeContenu(Contenu_jeu1,Coulb,Lig,Colp,Nouv_Contenu_jeu).
361
362 /*    case(Lig,Col,Nouv_Contenu_jeu,Coul),
363     case(Lig,Colp,Nouv_Contenu_jeu,Coulb).*/
364     
365
366 /* vertical */
367 lancerv(Coul,Contenu_jeu,Nouv_Contenu_jeu):-
368     balon(Coul,Coulb),
369     case(Lig,Col,Contenu_jeu,Coulb),
370     case(Ligp,Col,Contenu_jeu,Coul),
371     min(Lig,Ligp,Min),
372     max(Lig,Ligp,Max),
373     Delta is Max-Min -1,
374     aucun_adversaire_col(Coul,Lig,Min,Contenu_jeu,Delta),
375    
376                 changeContenu(Contenu_jeu,Coul,Lig,Col,Contenu_jeu1),
377                 changeContenu(Contenu_jeu1,Coulb,Ligp,Col,Nouv_Contenu_jeu).
378                 /*case(Lig,Col,Nouv_Contenu_jeu,Coul),
379     case(Ligp,Col,Nouv_Contenu_jeu,Coulb).*/
380
381
382 /* diag haut droite */
383 lancerd1(Coul,Contenu_jeu,Nouv_Contenu_jeu):-
384     balon(Coul,Coulb),
385     case(Lig,Col,Contenu_jeu,Coulb),
386     case(Ligp,Colp,Contenu_jeu,Coul),
387     Delta is Ligp-Lig -1,
388     Delta is Colp-Col -1,
389     aucun_adversaire_diag1(Coul,Lig,Col,Contenu_jeu,Delta),
390                 
391                 changeContenu(Contenu_jeu,Coul,Lig,Col,Contenu_jeu1),
392                 changeContenu(Contenu_jeu1,Coulb,Ligp,Colp,Nouv_Contenu_jeu).
393
394     /*case(Lig,Col,Nouv_Contenu_jeu,Coul),
395     case(Ligp,Colp,Nouv_Contenu_jeu,Coulb).*/
396     
397
398
399
400
401 /* diag haut gauche */
402 lancerd2(Coul,Contenu_jeu,Nouv_Contenu_jeu):-
403     balon(Coul,Coulb),
404     case(Lig,Col,Contenu_jeu,Coulb),
405     case(Ligp,Colp,Contenu_jeu,Coul),
406     Delta is -(Ligp-Lig -1),
407     Delta is Colp-Col -1,
408     aucun_adversaire_diag2(Coul,Lig,Col,Contenu_jeu,Delta),
409     
410                 changeContenu(Contenu_jeu,Coul,Lig,Col,Contenu_jeu1),
411                 changeContenu(Contenu_jeu1,Coulb,Ligp,Colp,Nouv_Contenu_jeu).
412
413     /*case(Lig,Col,Nouv_Contenu_jeu,Coul),
414     case(Ligp,Colp,Nouv_Contenu_jeu,Coulb).*/
415
416     
417
418
419 lancer(0,_,Contenu_jeu,Contenu_jeu).
420
421 lancer(1,Coul,Contenu_jeu,Nouv_Contenu_jeu):-
422                 lancerv(Coul,Contenu_jeu,Nouv_Contenu_jeu);
423     lancerh(Coul,Contenu_jeu,Nouv_Contenu_jeu);
424     lancerd1(Coul,Contenu_jeu,Nouv_Contenu_jeu);
425     lancerd2(Coul,Contenu_jeu,Nouv_Contenu_jeu).
426
427
428
429 coup(Coul,Contenu_Jeu,Nouv_Contenu_jeu):-
430                 lancer(L1,Coul,Contenu_Jeu,Contenu_jeu1),
431                 depl(D1,Coul,Contenu_jeu1,Contenu_jeu2),
432                 lancer(L2,Coul,Contenu_jeu2,Contenu_jeu3),
433                 depl(D2,Coul,Contenu_jeu3,Contenu_jeu4),
434                 lancer(L3,Coul,Contenu_jeu4,Nouv_Contenu_jeu),
435                 L is L1+L2+L3,
436                 L=<1,
437                 D is    D1+D2,
438                 D =< 2.
439
440 /* tour */
441 joueur_suivant(n,b).
442 joueur_suivant(b,n).
443
444
445
446
447 /************ TODO à affiner **********/
448
449
450 valeur(Coul,Conf,1000):-
451                 coup(Coul,Conf,Conf2),
452                 victoire(Coul,Conf2).
453
454 valeur(Coul,Conf,T):- 
455     maplist(nb_ele(Coul),Conf,L1),
456     length(Conf,N),
457     numlist(1,N,L2),
458     maplist(poids_ligne,L1,L2,L3),
459     sumlist(L3,T),!.
460
461 <<<<<<< .mine
462 valeur(b,Conf,T):-
463                 length(Conf,N),
464                 count(b,Conf,N,M,-10,T),
465                 M is N*10.
466 =======
467     /* pour une ligne de poids X, de rang Y, son poids est N */
468 poids_ligne(X,Y,N):-
469     N is 10*X*Y,!.
470 >>>>>>> .r6
471
472
473
474     /*nbre d elements N de la couleur Coul dans la liste L */
475 nb_ele(Coul,L,N):-
476     sublist(ma_couleur(Coul),L,Lp),
477     length(Lp,N).
478
479 <<<<<<< .mine
480
481
482 valeur(_,_,1).
483
484
485 count(_,_,0,_,_,0).
486
487 count(Coul,Conf,N,ValNiveau,Add,Tp):-
488                 Np is N-1,
489                 ValNiveauP is ValNiveau+Add,
490                 ligcol(N,Conf,Lig),
491                 write(Lig),
492                 nb_ele(Coul,Lig,Nb),
493                 Tp is T+ValNiveau*Nb,
494                 count(Coul,Conf,Np,ValNiveauP,Add,T).
495
496
497
498 nb_ele(_,[],0).
499
500
501 nb_ele(Coul,[Coul2|F],N):-
502                 not(ma_couleur(Coul,Coul2)),
503                 nb_ele(Coul,F,N).
504
505 nb_ele(Coul,[Coul2|F],Np):-
506                 ma_couleur(Coul,Coul2),
507                 nb_ele(Coul,F,N),
508                 Np is N+1.
509                 
510
511
512                 
513                 
514
515
516
517
518 calcul_valeur_list(_,[]).
519
520 calcul_valeur_list(Coul,[D|F]):-
521                 test_victoire(Coul,D,V),
522                 write(V),
523                 calcul_valeur_list(Coul,[F]).
524
525 =======
526 >>>>>>> .r6
527 successeurs(N,Coul,L) :- 
528     findall(NP,coup(Coul,N,NP),Lp),
529     list_to_set(Lp,Lpp),
530     filtre_sym(Lpp,L).
531
532     /*
533       choisit la meilleur conf à partir de Conf parmi les susccesseurs 
534       alpha est la valeur minimum estimée jusqu'à présent
535       beta  est la valeur maximum estimée jusqu'à présent
536     */
537 evaluate_and_choose(Coul,[Succ|Succs],Conf,D,Alpha,Beta,Record,MeilleurSuccVal):-
538     joueur_suivant(Coul,Coulp),
539     alpha_beta(Coulp,D,Succ,Alpha,Beta,_,Valeur),
540     Valeurp is -Valeur,
541     cutoff(Coul,Succ,Valeurp,D,Alpha,Beta,Succs,Conf,Record,MeilleurSuccVal).
542
543 evaluate_and_choose(_,[],_,_,Alpha,_,Record,(Record,Alpha)).
544
545
546 /* implantation alpha beta du minimax */
547 alpha_beta(Coul,0,Conf,_,_,_,Valeur) :- 
548     valeur(Coul,Conf,Valeur).
549
550 alpha_beta(Coul,D,Conf,Alpha,Beta,Succ,Valeur) :- 
551     D > 0,
552     successeurs(Conf,Coul,Succs),
553     Alpha1 is -Beta, 
554     Beta1 is -Alpha,
555     D1 is D-1, 
556     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]),
557     evaluate_and_choose(Coul,Succs,Conf,D1,Alpha1,Beta1,nil,(Succ,Valeur)).
558
559
560 cutoff(_,Succ,Valeur,_,_,Beta,_,_,_,(Succ,Valeur)):- 
561     Valeur >= Beta,!.
562 cutoff(Coul,Succ,Valeur,D,Alpha,Beta,Succs,Conf,_Record,MeilleurSuccVal):- 
563     Alpha < Value, Value < Beta,  
564     evaluate_and_choose(Coul,Succs,Conf,D,Valeur,Beta,Succ,MeilleurSuccVal).
565 cutoff(Coul,_,Valeur,D,Alpha,Beta,Succs,Conf,Record,MeilleurSuccVal) :- 
566     Valeur =< Alpha,!, 
567     evaluate_and_choose(Coul,Succs,Conf,D,Alpha,Beta,Record,MeilleurSuccVal).
568
569
570 symetrique(
571     [
572      [A1,A2,A3,A4,A5,A6,A7],
573      [B1,B2,B3,B4,B5,B6,B7],
574      [C1,C2,C3,C4,C5,C6,C7],
575      [D1,D2,D3,D4,D5,D6,D7],
576      [E1,E2,E3,E4,E5,E6,E7],
577      [F1,F2,F3,F4,F5,F6,F7],
578      [G1,G2,G3,G4,G5,G6,G7]],
579     [[A7,A6,A5,A4,A3,A2,A1],
580      [B7,B6,B5,B4,B3,B2,B1],
581      [C7,C6,C5,C4,C3,C2,C1],
582      [D7,D6,D5,D4,D3,D2,D1],
583      [E7,E6,E5,E4,E3,E2,E1],
584      [F7,F6,F5,F4,F3,F2,F1],
585      [G7,G6,G5,G4,G3,G2,G1]]).
586
587 symetrique(
588     [
589      [A1,A2,A3,A4,A5],
590      [B1,B2,B3,B4,B5],
591      [C1,C2,C3,C4,C5],
592      [D1,D2,D3,D4,D5],
593      [E1,E2,E3,E4,E5]],
594     [[A5,A4,A3,A2,A1],
595      [B5,B4,B3,B2,B1],
596      [C5,C4,C3,C2,C1],
597      [D5,D4,D3,D2,D1],
598      [E5,E4,E3,E2,E1]]).
599
600 symetrique(
601     [
602      [A1,A2,A3],
603      [B1,B2,B3],
604      [C1,C2,C3]],
605     [[A3,A2,A1],
606      [B3,B2,B1],
607      [C3,C2,C1]]).
608
609 non_symetrique_de(X,Y):- not(symetrique(X,Y)).
610
611 filtre_sym([],[]).
612 filtre_sym([X|T],[X|R]):-
613     sublist(non_symetrique_de(X),T,Ns),
614     filtre_sym(Ns,R).
615
616
617 /*
618 tour(Contenu_Jeu, Coul) :-
619                 victoire(Coul,Contenu_Jeu).
620
621 tour(Contenu_Jeu, Coul) :-
622                 coup(Coul,Contenu_Jeu,Nouv_Contenu_jeu),
623                 victoire(Coul,Nouv_Contenu_jeu).
624                 
625
626 tour(Contenu_Jeu, Coul) :-
627                 coup(Coul,Contenu_Jeu,Nouv_Contenu_jeu),
628                 joueur_suivant(Coul,Coulp),
629                 not(victoire(Coul,Nouv_Contenu_jeu)),
630                 tour(Nouv_Contenu_jeu,Coulp).
631 */
632
633
634
635