Determinant; bir kare matrisi, reel bir sayıyla eşleştiren özel bir fonksiyondur. Sadece kare matrislere uygulanabilir. Determinant hesabının temel yolu minör ve kofaktörlerinin hesaplanması yöntemidir. Buna ek olarak kolay hesaplama için Sarrus Yöntemi adında başka bir yöntem daha geliştirilmiştir.
Minör ve kofaktör hesabı ile daha büyük matrisleri daha sistemli bir şekilde çarpabiliriz.
Minör tanım olarak: A = (aij) nxn kare matrisinde bir aij ( 1≤i,j≤n) öğesinin bulunduğu i. satır ve j. sütunun çıkarılmasıyla elde edilen n-1. dereceden kare matrisinin determinantıdır. Mij ile ifade edilir.
A = (aij) nxn matrisinde aij öğesinin minörü olan Mij ‘nin (-1)^(i+j) ile çarpılmasıyla elde edilen sayıya aij öğesinin kofakötür denir ve Aij ile gösterilir.
Bir kare matrisin minör ve kofaktörlerinin çarpımlarının toplamı o matrisin determinantını verir.
Prolog dilinde yazılan programda da kofaktör ve minör hesabı ile determinant hesabı yapılmıştır. Goal kısmında örnek bir matris verilerek determinantı hesaplanıştır.
DOMAINS liste=integer* matris = liste* int=integer PREDICATES ilkEleman(liste,int) uzunluk(liste,int) detBul(liste,liste,int) ilkleriSil(matris,matris) negatif(int,int) sonaAt(matris,matris) tersCevirListe(matris,matris) tersCeviriciListe(matris,matris,matris) det(matris,int,int,int) CLAUSES ilkEleman([X|_],X). uzunluk([],0). uzunluk([_|K],U):-uzunluk(K,X),U=X+1. ilkleriSil([],[]). ilkleriSil([[_|BasKuyruk]|Kuyruk1],[ BasKuyruk |SonucKuyruk]):- ilkleriSil(Kuyruk1,SonucKuyruk). negatif(-1,1). negatif(1,-1). sonaAt([Bas|Kuyruk],Sonuc):- tersCevirListe(Kuyruk,TersKuyruk), tersCevirListe([Bas|TersKuyruk],Sonuc). tersCevirListe(X,Y):-tersCeviriciListe(X,[],Y). tersCeviriciListe([],X,X). tersCeviriciListe([B|K],TMP,SONUC) :- tersCeviriciListe(K,[B|TMP],SONUC). detBul([Bas1,Kuyruk1|_],[Bas2,Kuyruk2|_],Sonuc):- Sonuc = Bas1*Kuyruk2-Bas2*Kuyruk1. det([Bas1,Bas2|_],_,Sonuc,_):- uzunluk(Bas1,En), En<=2, detBul(Bas1,Bas2,Sonuc),!. det([Bas|_],Sayac,0,_):-uzunluk(Bas,En),En<=Sayac,!. det([Bas|Kuyruk],Sayac,Sonuc,_):- YeniSayac=Sayac+1, uzunluk(Bas,En), En>Sayac, En<=3, sonaAt([Bas|Kuyruk],Sonda), ilkEleman(Bas,KatSayi), ilkleriSil(Kuyruk,KuyrukOrta), det(KuyrukOrta,0,OrtaSonuc,_), det(Sonda,YeniSayac,YanSonuc,_), Sonuc=(KatSayi*OrtaSonuc)+YanSonuc,!. det([Bas|Kuyruk],Sayac,Sonuc,X):- YeniSayac=Sayac+1, uzunluk(Bas,En), En>Sayac, sonaAt([Bas|Kuyruk],Sonda), ilkEleman(Bas,KatSayi), ilkleriSil(Kuyruk,KuyrukOrta), negatif(X,Y), det(KuyrukOrta,0,OrtaSonuc,Y), det(Sonda,YeniSayac,YanSonuc,Y), Sonuc=(X*KatSayi*OrtaSonuc)+YanSonuc. GOAL write("_____"),nl,det([[1,2,4,8],[2,2,7,11],[3,6,3,12],[4,13,0,5]],0,Sonuc,1),write(Sonuc).
Programda kullanılan yüklemlere tek tek bakacak olursak yüklemlerin yaptığı görevler aşağıda açıklanmıştır:
Yukarıdan aşağıya doğru yazılmış dört yüklemi sırasıyla incelersek;