prolog- knight chess movies

7
Universiteti Politeknik i Tiranës Fakulteti i Teknologjisë së Informacionit Inxhinieri Informatike Master shkencor(II) 1. DETYRË KURSI Lënda : Intelingjenca Artificiale Tema: Lëvizja e gurit të kalit të shahut në 8x8 në Prolog Pranoi: Alban ALLKOÇI Punoi : Anisa SHEHU ________________________ ________________________ (Firma) (Firma) TIRANË, 2015

Upload: anisa1989

Post on 14-Aug-2015

80 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Prolog- knight chess movies

Universiteti Politeknik i Tiranës

Fakulteti i Teknologjisë së Informacionit

Inxhinieri Informatike

Master shkencor(II)

1. DETYRË KURSI

Lënda : Intelingjenca Artificiale

Tema: Lëvizja e gurit të kalit të shahut në 8x8 në Prolog

Pranoi: Alban ALLKOÇI Punoi : Anisa SHEHU

________________________ ________________________

(Firma) (Firma)

TIRANË, 2015

Page 2: Prolog- knight chess movies

Lëvizja e gurit të kalit të shahut në kutinë me përmasa 8x8.

Fushën e plotë të lojës së shahut (8x8) e paraqesim sipas tabelës së mëposhtme:

çdo numër përfaqëson një kuti të lojës së shahut (nga 1 – 64). Duhet që duke u nisur nga një kuti

(numër) X të përfundojmë në një kuti të caktuar Y, duke u bazuar në lëvizjen në formë L-je të

gurit të kalit dhe gjithashtu të gjurmojmë rrugën midis X dhe Y.

Ne figuren me poshte paraqiten numri maximale i levizjeve te gurit te kalit te shahut ne nje fushe

me permasa 8*8.

Fig1. Paraqitja e nr max te levizjeve te gurit te kalit

Programi duhet të ruajë në një listë kutitë që kalohen njëherë, në mënyrë që të mos përsëriten

brenda rrugës nga burimi në destinacion. Kalohet nga kutia burim tek kutia tjetër që gjendet

brenda rrugës për në destinacion dhe me anë të thirrjes rekursive të predikatës path(), gjendet një

rrugë nga kjo kuti tek destinacioni. Ekzekutimi i programit bëhet duke shkruar në prolog:

“path(X,Z).”.

Më poshtë jepet kodit i programit në prolog:

Page 3: Prolog- knight chess movies

KODI I PROGRAMIT: /* Path midis X dhe Y gjendet duke thirrur path me 3 terma*/ path(X,Y) :- path(X,Y,[X]). /* Rasti i fundit, ne kete pike printohet lista e rruges */ path(Z,Z,L) :- !, printoList(L). /* Thirrjet rekursive te path me 3 terma. Kerkohet nje levizje nga X ne Z */ path(X,Y,L) :- levizje(X,Z), /* Sigurohemi qe kalojme ne nje kuti ku nuk kemi kaluar me pare per te shmangur ciklet e pafundme */ not(anetar(Z,L)), /* Kerkojme nje Rruge nga Z te Y */ path(Z,Y,[Z|L])./ /PREDIKATAT E 8 LEVIZJEVE TE MUNDSHME TE KALIT / levizje(X,Y) :- Kolona_X is X mod 8, Rreshti_X is X // 8, Kolona_Y is Kolona_X - 1, % levizje 1 majtas Kolona_Y >= 0, Rreshti_Y is Rreshti_X + 2, % levizje 2 poshte Rreshti_Y < 8, Y is Rreshti_Y * 8 + Kolona_Y, Y >= 0, X >= 0, X < 64, Y < 64. levizje(X,Y) :- Kolona_X is X mod 8, Rreshti_X is X // 8, Kolona_Y is Kolona_X - 1, % levizje 1 majtas Kolona_Y >= 0, Rreshti_Y is Rreshti_X - 2, % levizje 2 larte Rreshti_Y >= 0, Y is Rreshti_Y * 8 + Kolona_Y, Y >= 0, X >= 0, X < 64, Y < 64.

Page 4: Prolog- knight chess movies

levizje(X,Y) :- Kolona_X is X mod 8, Rreshti_X is X // 8, Kolona_Y is Kolona_X + 1, % levizje 1 djathtas Kolona_Y < 8, Rreshti_Y is Rreshti_X + 2, % levizje 2 poshte Rreshti_Y < 8, Y is Rreshti_Y * 8 + Kolona_Y, Y >= 0, X >= 0, X < 64, Y < 64. levizje(X,Y) :- Kolona_X is X mod 8, Rreshti_X is X // 8, Kolona_Y is Kolona_X + 1, % levizje 1 djathtas Kolona_Y < 8, Rreshti_Y is Rreshti_X - 2, % levizje 2 larte Rreshti_Y >= 0, Y is Rreshti_Y * 8 + Kolona_Y, Y >= 0, X >= 0, X < 64, Y < 64. levizje(X,Y) :- Kolona_X is X mod 8, Rreshti_X is X // 8, Kolona_Y is Kolona_X + 2, % levizje 2 djathtas Kolona_Y < 8, Rreshti_Y is Rreshti_X + 1, % levizje 1 poshte Rreshti_Y < 8, Y is Rreshti_Y * 8 + Kolona_Y, Y >= 0, X >= 0, X < 64, Y < 64. levizje(X,Y) :- Kolona_X is X mod 8, Rreshti_X is X // 8, Kolona_Y is Kolona_X + 2, % levizje 2 djathtas Kolona_Y < 8,

Page 5: Prolog- knight chess movies

Rreshti_Y is Rreshti_X - 1, % levizje 1 larte Rreshti_Y >= 0, Y is Rreshti_Y * 8 + Kolona_Y, Y >= 0, X >= 0, X < 64, Y < 64. levizje(X,Y) :- Kolona_X is X mod 8, Rreshti_X is X // 8, Kolona_Y is Kolona_X - 2, % levizje 2 majtas Kolona_Y >= 0, Rreshti_Y is Rreshti_X + 1, % levizje 1 poshte Rreshti_Y < 8, Y is Rreshti_Y * 8 + Kolona_Y, Y >= 0, X >= 0, X < 64, Y < 64. levizje(X,Y) :- Kolona_X is X mod 8, Rreshti_X is X // 8, Kolona_Y is Kolona_X - 2, % levizje 2 majtas Kolona_Y >= 0, Rreshti_Y is Rreshti_X - 1, % levizje 1 larte Rreshti_Y >= 0, Y is Rreshti_Y * 8 + Kolona_Y, Y >= 0, X >= 0, X < 64, Y < 64. /**************PREDIKATA NDIHMESE **************/ /* Shfaqja e listes me pikat e rruges ne rastin e listes boshe */ printoList([]). /* Predikata baze per rastin e listes joboshe */ printoList([H|T]) :- printoList(T),nl,write(H). /* Predikatat e testimit te anetaresise ne liste */ anetar(H,[H|T]). anetar(A,[Y|T]) :- anetar(A,T).

Page 6: Prolog- knight chess movies

Ekzekutimi i programit:

Ne print-screen-et e meposhtme po paraqesim një shembull të ekzekutimit të programit. Për të

gjetur path-in ndërmjet kutive 10 dhe 55 japim komanden path(10,55). në prolog, duhet te kemi

parasysh qe perpara se te egzekutojme nje kod ne prolog duhet qe t’a kemi kompiluar kete kod

Fig2. Pathi gjate ekzekutimit te programit

0 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

Fig3. Pathi grafikisht

Page 7: Prolog- knight chess movies

Më poshtë po paraqesim një shembull të ekzekutimit të programit. Për të gjetur nese kali mund te

leviz nga nje kuti ne nje kuti tjeter: