29.04.2013 İçerik • Geçen Hafta Prolog’la 5.Hafta – Hedef Birleştirme – Çıkarımlar • Bu Hafta – Listeler Hedef Birleştirme Hasta mı? • • • • tahlil(ahmet,tahlil1,90). tahlil(ahmet,tahlil2,25). tahlil(ahmet,tahlil3,10). yuksektansiyon(X):(tahlil(X,tahlil1,Y),Y>100);(tahlil(X,tahlil2,Z),Z<30). • kalphastasi(X):yuksektansiyon(X),tahlil(X,tahlil3,Q),Q<20. • ?-kalphastasi(ahmet). soru Tansiyon Ateş Mide Baş • Bir kişinin tansiyonu 13’ten bulantısı dönmesi büyükse o kişinin tansiyonu Ahmet 12 34 Var Yok yüksektir yüksektir. Mehmet 15 35 Var Yok • Bir kişinin ateşi 37’den Hilmi 16 39 Yok Var büyükse o kişinin ateşi Mazhar 18 40 Var Var yüksektir. • Bir kişinin ateşi yüksekse ve midesi bulaniyorsa X Yukarıdaki cümleleri kurallara, hastalığı vardır. tabloyu gerçeklere prolog dilinde çeviriniz. • Bir kişinin tansiyonu yüksekse ve X hastalığı varsa Z hastalığı olanları listeleyen Y hastalığı vardır. prolog kodunu yazınız. • Bir kişinin başı dönüyorsa ve Y hastalığı varsa Z hastalığı da vardır. 1 29.04.2013 tansiyon(ahmet,12). tansiyon(mehmet,15). tansiyon(hilmi,16). tansiyon(mazhar,18). ates(ahmet,34). ates(mehmet,35). ates(hilmi,39). ates(mazhar,40). mide_bulantisi_var(ahmet). mide_bulantisi_var(mehmet). mide_bulantisi_var(mazhar). bas_donmesi_var(hilmi). bas_donmesi_var(mazhar). cevap tansiyon_yuksek(X):-tansiyon(X,K),K>13. ates_yuksek(X):-ates(X,K),K>37. x_hastasi(X):-ates_yuksek(X),mide_bulantisi_var(X). y_hastasi(X):-tansiyon_yuksek(X),x_hastasi(X). z_hastasi(X):-bas_donmesi_var(X),y_hastasi(X). Çıkarımlar • • • • • Kitap okumayı sevenler kahve sever. Maç izlemeyi sevenler cips sever sever. Maç seven o gün maç izler. Kitap seven o gün kitap okur. Ali cips alışverişi yaptı. • • • • alisveris(al,ahmet,cips). sever(Y,X):-alisveris(al,Y,X). faaliyet(izle,X,mac):-sever(X,cips). faaliyet(oku,X,kitap):-sever(X,kahve). Tesekkürler Özdemir Köse Listeler • Liste: elemanlar dizisi • Örnek liste : ann, tennis, tom, skiing • Prolog ‘da ifadesi: [ann, tennis, tom, skiing] Listelerin gösterimi (1) • Boş bir dizi [] • Boş olmayan bir dizi – İki öğeden oluşur • İlk öğe : head liste’nin başı • İkinci öğe : tail listenin geri kalanı • Örneğimizdeki dizi için Head ve Tail : – Head H d: ann – Tail : [tennis, tom, skiing] 2 29.04.2013 Listelerin gösterimi (3) Listelerin gösterimi (2) • Head|Tail gösterimine örnekler –head herhangi bir prolog objesi olabilir. –Tail liste olmak zorunda. Liste [Head|Tail] değerleri [a, b, c, d, e] Head = [a] Tail = [b, c, d, e] [book, table, pen] Head = [book] Tail = [table, pen] [a,b,[c,d]] Head = [a] Tail = [b,[c,d]] [clock] Head = [clock] Tail = [] [] No head no tail –head ve tail özel bir gösterimle liste yapısı haline getirilirler: .(Head, Tail) –Yukarıdaki Y kar daki gösterimdeki Tail yine ine bir listedir listedir. Listelerin gösterimi (5) Listelerin gösterimi (4) – İlk örneğimiz aşağıdaki şekilde yazılabilir : .(ann, .(tennis, .(tom, .(skiing, [])))) ?- List1 = [a, b, c], List2 = .(a, .(b, .(c, []))). List1 = [a, b, c] List2 = [a, b, c] . tennis . . tom skiing [skiing] = .(skiing, []) – Liste gösteriminde nokta ve parantezli ya da köşeli parantezli notasyon kullanılabilir. – Arka planda listelerin işlenmesi ağaçlarla yapılır ancak programın çıkışında listeler köşeli parantezlerle gösterilir. . ann – Boş liste bütün listelerin sonunda vardır: [] ?- Hobbies1 = .(tennis, .(music, [])), Hobbies2 = [skiing, food], L = [ann, Hobbies1, tom, Hobbies2]. Hobbies1 = [tennis, music] Hobbies2 = [skiing, food] L = [ann, [tennis, music], tom, [skiing, food] ] 3 29.04.2013 Listelerle İşlemler Listelerin gösterimi (6) /*bir listenin elemanlarını yazdırma */ print_list([]). – Aynı dizinin farklı yazılışları p print_list([Head|Tail]):_ ([ | ]) [a b, [a, b c] = [ a | [b, [b c] ] = [a, b | [c] ] = [a, b, c | [] ] write(Head), write(' '), print_list(Tail). ?- print_list([9,7,3]). 7 3 Yes 9 ?- print_list([9,7,[3,6,8]]). 7 [3, 6, 8] Yes 9 /*bir dizinin eleman sayısını bulmak*/ size([],0). /*bir dizinin eleman sayısını bulmak*/ size([H|T],N) :- size(T,N1), N is N1+1. size([],0). i ([] 0) size([H|T],N) :- N is N1+1, size(T,N1). (?) size([H|T],N) :size(T,N1), N is N1+1. ?- size([34,6,4,3],H). =4; No ?- size([34,6,[4,6,[2,1],3],3],H). H = 4 ; H No ?- size([34,6,4,3],H). H = 4 ; No ?- size([34,6,[4,6,[2,1],3],3],H). H = 4 ; No ?- size([2,4,5],H). ERROR: Arguments are not sufficiently instantiated 4 29.04.2013 Bir liste, bir başka listenin altkümesi midir? /*bir elemanın, listenin elemanı olup olmadığını bulma*/ member(Element,[Element| b (El [El | _ ] ). ) member(Element,[ _ |Tail] ) :member(Element,Tail). ?- • sublist(X,L) doğrudur eğer X in tüm elemanları l l L’nin L’ i d de elemanı l ise. i – member(X,[X|_]). – member(X,[_|R) :- member(X,R). member(4,[6,4,8]). Yes ?- member([5,6],[6,[5,6],8]). Yes ?- member(5,[6,[5,6],8]). No alıştırmalar – guc(X,Y,Z) XY=Z – factorial(X,Y) f t i l(X Y) X! Y X!=Y – topla(X,Y) X = 1+2+...+Y – sum(Xs,N) • N, Xs listesindeki rakamların toplamı – sum1(Xs,Ys) • Xs is [x1,x2,...,xn] ve Ys, Xs in her elemanının bir fazlasını içerir. Ys(i)=Xs(i)+1. – subset([],_). subset([] ) – subset([X|R],L) :- member(X,L), subset(R,L). guc(X,Y,Z) • guc(X,1,X). • guc(X,Y,Z):• Y>1, • G is Y-1, • guc(X,G,T), • Z is X*T. XY=Z ?- guc(3,4,G). G = 81 ; No 5 29.04.2013 fact(N,F) • fact(0,1). • fact(N,F) :• N>0, • G is N-1, • fact(G,T), • F is N * T. N!=F ?- fact(5,E). E = 120 ; No sum(Xs,N) N, Xs listesindeki rakamların toplamı • listetopla([X|[]],X). • listetopla([H|T],R):- topla(X,Y) Y = 1+2+...+X • topla(1,1). • topla(N,F) :• N>1, • G is N-1, • topla(G,T), • F is N + T. sum1(Xs,Ys) Xs is [x1,x2,...,xn] ve Ys, Xs in her elemanının bir fazlasını içerir. Ys(i)=Xs(i)+1. • ? listetopla(T,G), R is G+H. ?- listetopla([10,2,4,4,7],G). G = 27 ; No 6 29.04.2013 /*bir dizinin ilk elemanını silmek*/ Sıralı mı? removefirst([],[]). removefirst([Head|Tail],Tail). • s([_]). • s([X|[Y|T]]):-s([Y|T]),X>Y. ?- removefirst([8],H). H = [] ; No ?- removefirst([8,7,5],H). H = [7, 5] ; No ? removefirst([[4,5],7,5],H). ?fi t([[4 5] 7 5] H) H = [7, 5] ; No ?- removefirst([],H). H = [] ; No • s([_]). • s([X,Y|T]):-s([Y|T]),X>Y. Listenin İlk N elemanını silmek • trim(N,L,L1) doğrudur eğer L1, L’nin ilk N elemanı l silinmiş ili i h halili iise. • trim(0,[],[]). • trim(0,[H|T],[H|T]). • trim(N,[_|T],L) :- N > 0, M is N - 1, trim(M,T,L). – ?? trim(3,[1,4,5,6,7,8,9],U). trim(3 [1 4 5 6 7 8 9] U) – U = [6, 7, 8, 9] ; Listeden istenilen elemanı silmek • del(X,[X|Tail],Tail). del(X,[Y|Tail],[Y|Tail1]): del(X,Tail,Tail1). • del(X,[Y|Tail],[Y|Tail1]):-del(X,Tail,Tail1). • • • • • • • • ?- del(a,[1,a,3,7,8],H). H = [1, 3, 7, 8] ; No ?- del(a,[1,a,3,a,a],H). H = [1, 3, a, a] ; H = [1, a, 3, a] ; H = [1, a, 3, a] ; No 7 29.04.2013 Çeviri • • • • • • • • • • means(0,zero). means(1,one). means(2,two). ( , ) means(3,three). means(4,four). means(5,five). means(6,six). means(7,seven). means(8,eight). means(9,nine). • • • • translate([],[]). translate([H1|T1],[H2|T2]) ( | | ) :means(H1,H2), translate(T1,T2). ?- translate([1,2,3],H). H = [one [one, two two, three] ; ?- translate(H,[zero,one,nine]). H = [0, 1, 9] ; Kaynaklar • PROLOG Programming for Artificial I t lli Intelligence, B Bratko, tk II., 3 3rd d Editi Edition, Addison-Wesley, 2001 8