prolog- knight chess movies
TRANSCRIPT
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
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:
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.
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,
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).
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
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: