BİL551 – YAPAY ZEKA Prolog: Listeler Dr. Mehmet Dikmen mdikmen@baskent.edu.tr
Listeler Liste: elemanlar dizisi Örnek: ann, tennis, tom, skiing Prolog’daki ifadesi: [ann, tennis, tom, skiing]
Listelerin gösterimi (1) Boş dizi: [ ] Her listenin sonunda bulunur Boş olmayan bir liste 2 öğeden oluşur: Head: liste’nin başı Tail: listenin geri kalanı [ann, tennis, tom, skiing] örneği için : Head : ann Tail : [tennis, tom, skiing]
Listelerin gösterimi (2) Head|Tail gösterimine örnekler 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]] Tail = [b,[c,d]] [clock] Head = [clock] Tail = [] [] No head no tail
Listelerin gösterimi (3) Head herhangi bir prolog objesi olabilir. Tail liste olmak zorunda. head ve tail özel bir gösterimle liste yapısı haline getirilirler: .(Head, Tail) Yukarıdaki gösterimdeki Tail yine bir listedir.
Listelerin gösterimi (4) İlk örnek aşağıdaki şekilde de yazılabilir: .(ann, .(tennis, .(tom, .(skiing, []))))
Listelerin gösterimi (5) Boş liste bütün listelerin sonunda vardır: [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. ?- List1 = [a, b, c], List2 = .(a, .(b, .(c, []))). List1 = [a, b, c] List2 = [a, b, c]
Örnek sorgu ?- Hobbies1 = .(tennis, .(music, [])), Hobbies2 = [skiing, food], L = [ann, Hobbies1, tom, Hobbies2]. Çıktı: Hobbies1 = [tennis, music] Hobbies2 = [skiing, food] L = [ann, [tennis, music], tom, [skiing, food] ]
Listelerin gösterimi (6) Alternatif liste gösterimi: | kullanarak [a, b, c] = [ a | [b, c] ] = [ a, b | [c] ] = [ a, b, c | [] ]
Listenin elemanlarını ekrana yazma print_list([Head|Tail]):- write(Head), write(' '), print_list(Tail). ?- print_list([9,7,3]). 9 7 3 Yes ?- print_list([9,7,[3,6,8]]). 9 7 [3, 6, 8]
Listenin eleman sayısını bulma size([],0). size([H|T],N) :- size(T,N1), N is N1+1. ?- size([34,6,4,3],H). H = 4 ; No ?- size([34,6,[4,6,[2,1],3],3],H).
Çok yapılan bir hata Ters yazmak: size([],0). size([H|T],N) :- size(T,N1), N is N1+1. size([H|T],N) :- N is N1+1, size(T,N1). ?- size([2,4,5],H). ERROR: Arguments are not sufficiently instantiated
Örnek: Listenin elemanı mı? member( X, [X| _ ] ). member( X, [ _ |Tail] ) :- member( X, Tail ). ?- member(4,[6,4,8]). Yes ?- member([5,6],[6,[5,6],8]). ?- member(5,[6,[5,6],8]). No
Bir liste, bir başka listenin altkümesi midir? subset (X,L) doğrudur eğer X in tüm elemanları L’nin de elemanı ise. member(X,[X|_]). member(X,[_|R) :- member(X,R). subset([],_). subset([X|R],L) :- member(X,L), subset(R,L).
Listenin elemanlarının toplamı listetopla([X|[]],X). listetopla([H|T],R):- listetopla(T,G), R is H+G. ?- listetopla([10,2,4,4,7],G). G = 27 ; No
Liste sıralı mı? s([_]). s([X|[Y|T]]) :- s([Y|T]), X>Y. Alternatif:
Listenin ilk elemanını silmek removefirst([],[]). removefirst([Head|Tail],Tail). ?- removefirst([8],H). H = [] ; No ?- removefirst([8,7,5],H). H = [7, 5] ; ?- removefirst([[4,5],7,5],H). H = [7, 5] ; No ?- removefirst([],H). H = [] ;
Listenin ilk N elemanını silmek trim(N,L,L1) doğrudur eğer L1, L’nin ilk N elemanı silinmiş hali ise. 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). 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(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] ;
Listeleri Yazdırmak listeyaz([]). listeyaz([X|Y]):- write(X), nl, listeyaz(Y). ?- listeyaz([2,4,5]). 2 4 5 Yes write('\n'),
Çeviri means(0,zero). means(1,one). means(2,two). … means(9,nine). ?- translate([1,2,3],H). H = [one, two, three] ; ?- translate(H,[zero,one,nine]). H = [0, 1, 9] ; means(0,zero). means(1,one). means(2,two). … means(9,nine). translate([],[]). translate([H1|T1],[H2|T2]) :- means(H1,H2), translate(T1,T2).
Yol Bulma A B C D E F H G ?- go(a,c,YOL). YOL = [a, e, f, c] ; Başlangıç link(g,h). link(g,d). link(e,d). link(h,f). link(e,f). link(a,e). link(a,b). link(b,f). link(b,c). link(f,c). Hedef D E F H G yollar ?- go(a,c,YOL). YOL = [a, e, f, c] ; YOL = [a, b, f, c] ; YOL = [a, b, c] ; No go(X,X,[X]). go(X,Y,[X|T]):- link(X,Z), go(Z,Y,T). 22
Yol Bulma A B C D E F H G Başlangıç link(g,h). link(g,d). link(e,d). link(h,f). link(e,f). link(a,e). link(a,b). link(b,f). link(b,c). link(f,c). link(f,e). link(e,b). Hedef D E F H G ?- go(a,c,G). G = [a, e, f, c] ; G = [a, e, f, e, f, c] ; G = [a, e, f, e, f, e, f, c] ; G = [a, e, f, e, f, e, f, e, f|...] ; … yollar go(X,X,[X]). go(X,Y,[X|T]):- link(X,Z), go(Z,Y,T). 23
Yol Bulma A B C D E F H G go(X,X,_,[X]). go(X,Y,Visited,[X|T]):- Başlangıç link(g,h). link(g,d). link(e,d). link(h,f). link(e,f). link(a,e). link(a,b). link(b,f). link(b,c). link(f,c). link(f,e). link(e,b). Hedef D E F H G ?- go(a,c,[],G). G = [a, e, f, c] ; G = [a, e, b, f, c] ; G = [a, e, b, c] ; G = [a, b, f, c] ; G = [a, b, c] ; No go(X,X,_,[X]). go(X,Y,Visited,[X|T]):- link(X,Z), not(member(Z,Visited)), go(Z,Y,[Z|Visited],T). 24
Backtracking Control Prolog’da: Örnek: if X < 3 then Y = 0 if 3 <= X and X < 6 then Y = 2 if 6 <= X then Y = 4 Prolog’da: f(X,0) :- X<3. f(X,2) :- 3=<X, X<6. f(X,4) :- 6=<X. “f(1,Y), Y<2.” sorgusu: Doğru Ancak, 3 kural da (no bulana kadar) denenir. Halbuki ilk kural doğru ise diğerlerini kontrol etmeye gerek yok => if – else Çözüm: CUT (!) kullanmak
CUT Argüman almaz, her zaman true, backtracking’i durdurur Yeni çözüm: f(X,0) :- X<3, !. f(X,2) :- 3=<X, X<6, !. f(X,4) :- 6=<X. f(X,Y) sorgusu yapıldığında, sadece karşılık gelen kural denenir. “f(1,Y), Y<2.” sorgusu için sadece ilk kural denenir ve cevap Y=0 olur.
Örnek if X<3 then Y=0, otherwise if X<6 then Y=2, otherwise Y=4. Çözüm: f(X,0) :- X<3, !. f(X,2) :- X<6, !. f(X,4). CUT kullanmazsak: f(X,0) :- X<3. f(X,2) :- X<6. f(X,4). f(1,Y). > Y = 0; > Y = 2; > Y = 4; > no
MAX örneği max(X,Y,Max): Maximum of X and Y. max(X, Y, X) :- X >= Y. max(X, Y, Y) :- X < Y. Daha efektif çözüm (CUT kullanarak): max(X, Y, X) :- X >= Y, !. max(X, Y, Y).
Member ilişkisi member(X, [X | L]). member(X, [Y | L]) :- member(X, L). ?- member(X, [a,b,c]). X = a ; X = b ; X = c ; no member(X, [X | L]) :- !. Sadece 1 çözüm üretilir
FAIL Her zaman false ama backtracking’e devam ettirir Örnek: Ayşe yılan haricindeki tüm hayvanları sever. likes(ayse, X) :- yilan(X), !, fail; animal(X). “!, fail” yerine not da kullanılabilir: likes(ayse, X) :- not(yilan(X)).
if then else if P then Q else R Cevap: S :- P, !, Q. S :- R.
Kullanıcı ile Etkileşim Okunan bilginin sonunu ifade eder. kup:- read(X), islem(X). islem(bit):-!. islem(N):- C is N*N*N, write(C), nl, kup. ?- kup. |: 4. 64 |: 7. 343 |: 1. 1 |: bit. Yes Arama işlemini durdurur.
Gerçekler VT’nı değiştirmek ?- sehir(istanbul). ERROR: Undefined procedure: sehir/1 ?- assert(sehir(istanbul)). Yes ?- sehir(N). N = istanbul ; No ?- retract(sehir(X)). X = istanbul ;
VT’na kural eklemek ?- assert(canli(X):-hayvan(X)). X = _G350 ; No ?- assert(hayvan(zebra)). Yes ?- canli(X). X = zebra ; ?- retract(hayvan(X)).
asserta, assertz ?- assert(p(b)),assertz(p(c)),assert(p(d)),asserta(p(a)). Yes ?- p(K). K = a ; K = b ; K = c ; K = d ; No Başa ekler Sona ekler
Microsoft Üstün Mühendislik Başarısı Sorular? Microsoft Gizliliği