home
12 Dec 2008 - By Ahmet Kakıcı

Prolog ile Matris Çarpımı

Matris çarpımı birçok programlama dilinde öncelikli verilen ödevlerden biri olsa gerek. Aşağıdaki kodu yazarken anladım ki prolog bu dillerin arasında yok ve olmamalı. Prolog yapısından dolayı bu tip işlemleri yapmak için [bence] oldukça zor bir dil. Mantıksal programlamada veya öz-yinelemeli şekildeki problemlerin çözümünde kullanıldığı zaman az kod ile çok iş yapılabiliniyor ancak matris çarpımı için aynı şeyi diyemiyorum ve sizlere kodu takdim ediyorum :

DOMAINS
liste=integer*
matris = liste*
int=integer

PREDICATES
listeGoster(liste)
matrisGoster(matris)
listeTopla(liste,int)
listeCarp(liste,liste,liste)
listeVeMatris(liste,matris,liste)
matrisCarp(matris,matris,matris)

CLAUSES
listeGoster([]).
listeGoster([B|K]):-write(B," "),listeGoster(K).

matrisGoster([]).
matrisGoster([B|K]):-
write("["),
listeGoster(B),
write("]"),nl,
matrisGoster(K).

listeTopla([],0).
listeTopla([X|K],T):-listeTopla(K,Y),T=Y+X.

listeCarp([],[],[]).
listeCarp([Bas1|Kuyruk1],[Bas2|Kuyruk2],[SonucBas|SonucKuyruk]):-
SonucBas=Bas1*Bas2,
listeCarp(Kuyruk1,Kuyruk2,SonucKuyruk).

listeVeMatris(_,[],[]).
listeVeMatris(Liste1,[MatrisBas|MatrisKuyruk],[CarpimBas|CarpimKuyruk]):-
listeCarp(Liste1,MatrisBas,Carpim),
listeTopla(Carpim,CarpimBas),
listeVeMatris(Liste1,MatrisKuyruk,CarpimKuyruk).

matrisCarp([],_,[]).
matrisCarp([Bas1|Kuyruk1],Matris2,[SonucBas|SonucKuyruk]):-
listeVeMatris(Bas1,Matris2,SonucBas),
matrisCarp(Kuyruk1,Matris2,SonucKuyruk).

GOAL
matrisCarp(
[[1,2,3],[3,4,5],[3,1,1]],
[[1,5,5],[2,3,3],[3,4,1],[5,5,1]], Y),
matrisGoster(Y).

Programda kullanılan yüklemlere tek tek bakacak olursak yüklemlerin yaptığı görevler aşağıda açıklanmıştır:

Programa goal kısmındaki ikinci matris transpozesi alınmış şekilde yazılmıştır. Transpozesini hesaplayacak bir yüklem yazmayı gözüme kestiremediğim için bu şekilde yaptım, umarım işinize yarar.

post tags: kodprolog