yzm 3217 yapay zeka ders#7: prolog...
TRANSCRIPT
YZM 3217– YAPAY ZEKADERS#7: PROLOG DİLİ
Prolog’un özellikleri
• PROgrammig in LOGic• Semboller üzerinde çalışma• Gerçekler ve kurallardan oluşur• Büyük küçük harfe duyarlıdır
– Sabitler için Küçük harfler– Değişkenler için Büyük harfler
• Program çıktıları çok sade• Prolog’da olmayanlar
– For, while döngüleri– IF…THEN yapısı– DizilerANCAK öz yinelemeli fonksiyonlarla yukarıdakiler sağlanır
2
3
Dekleratif Programlama
• Prolog Dekleratif programlama dili • Prosedürel programlamada adım adım ne yapılması
gerektiğini kodlarız (Ör: C, Pascal, Java vs.) • Dekleratif programlamada bir durum tanımlanır. Bu
tanıma göre yorumlayıcı ya da derleyici bir çözüm üretir
• Prolog – bir cümlenin doğru / yanlış olduğunu – cümle içinde değişken(ler) varsa cümlenin doğru olması
için o değişken(ler)in değer(ler)inin ne olması gerektiğini söyler.
4
Örnek : Aile Ağacı
pam tom
bob liz
ann pat
jim
5
İlişkileri gerçek(fact)lerle tanımlama
• “Tom, Bob’un ebeveynidir” gerçeğinin prolog’daifadesi:
parent(tom, bob).
– parent: ilişkinin ismi
– tom ve bob: ilişkinin argümanları (atomlar)
– .: sonlandırıcı
6
Aile Ağacı
• Tüm aile ağacını aşağıdaki Prolog ifadeleriyle tanımlarız:
parent(pam, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, pat).
parent(pat,jim).
pam tom
bob liz
ann pat
jim
7
Prolog Sorguları
• ?- iliski(a,b).
– a ve b arasında iliski isminde bir ilişki var mı?
– cevap YES yada NO
• ?- iliski(A,b).
– b ile iliski adlı ilişkiyi doğrulayan A lar nelerdir?
– cevap varsa A lar
yoksa NO
A: değişken
a, b: atom (sabit)
8
İlişkileri sorgulamak-1
• Bob, Pat’in ebeveyni mi?
?- parent(bob, pat).
yes
• Tom, Ben’in ebeveyni mi? :
?- parent(tom, ben).
no
pam tom
bob liz
ann pat
jim
9
İlişkileri sorgulamak-2
• Liz’in ebeveyni kimdir??- ebeveyn(Kim, liz).Prolog’un cevabı :Kim = tom
• Bob’un çocukları kimlerdir??- ebeveyn(bob, Cocuk).Prolog’un cevabı :Cocuk = ann ;Cocuk = pat ;no
pam tom
bob liz
ann pat
jim
10
İlişkileri sorgulamak-3
• Kimler kimlerin çocuğudur? ?- ebeveyn (Ebeveyn, Cocuk).Ebeveyn = pamCocuk = bob;
Ebeveyn = tomCocuk = bob;
Ebeveyn = tomCocuk = liz;
…• Çözümler listesini yarıda kesmek için enter• Devam ettirmek için ;
pam tom
bob liz
ann pat
jim
11
İlişkileri sorgulamak-4
• Jim’in büyük ebeveyni (grandparent) kimdir?
• Bilgi tabanımızda büyük ebeveyn diye bir ilişki tanımlı değil.
• Büyük ebeveyn ilişkisi iki ebeveyn ilişkisinin «ve» lenmesiyle elde edilebilir.
?- parent(Y, jim), parent(X, Y).X=bobY=pat
X
Y
jim
parent
parent
grandparent
12
İlişkileri sorgulamak-5
• Torun ilişkisi de benzer biçimde tanımlanabilir.
– tom, X’in ebeveyni,
– X, Y’nin ebeveyni ise
– Y, tom’un torunudur.
?- parent(tom,X), parent(X, Y).
X=bob
Y=ann;
X=bob
Y=pat;
no
X
Y
jim
parent
parent
grandparent
13
Çocuk ilişkisi
pam tom
bob liz
ann pat
jim
parent(pam, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, pat).
parent(pat, jim).
offspring(bob, pam).
offspring(bob, tom).
offspring(liz, tom).
offspring(ann, bob).
offspring(pat, bob).
offspring(jim, pat).
14
Kurallar
• Kurallar iki parçadan oluşur:
– head : böyledir (sonuç, çıkarım)
– body : eğer
parent(X, Y)offspring(Y, X) :-
head body
15
Kuralların Çalışması
• Veritabanı:
• Çalışma Mekanizması:1. offsprings ilişkisi için gerçek ara2. Yok => offsprings ilişkisi için kural varsa uygula3. Kuralda X tom’la , Y liz’le eşleştirilerek kuralın bir gerçeklemesi
bulunur:offspring(liz,tom) :- parent(tom,liz).
4. parents(tom,liz). gerçeği aranır. Bulunduğunda kuralın eğer kısmı doğrulandığından böyledir kısmı da doğrulanmış olur ve prolog “yes” cevabını verir
parent(pam, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
offspring(Y, X) :- parent(X, Y).
Sorgu:offspring(liz, tom).
16
Örnek: Anne ilişkisi
• Tüm X ve Y ler için,
X, Y’nin annesidir Eğer
X, Y’nin ebeveyni ise ve
X kadınsa.
• İlişkinin Prolog’da ifadesi :
mother(X, Y) :- parent(X, Y), female(X).
mother
X
Y
parent
female
17
Örnek: Kız kardeş ilişkisiTüm X ve Y ler için,
X, Y’nin kız kardeşidir EğerX ve Y aynı ebeveyne sahip ise veX bayansa
• İlişkinin Prolog’da ifadesi :sister(X, Y) :- parent(Z, X), parent(Z, Y), female(X).
• Sorgu:sister(X,pat).
sister
Z
X
parent
Y
parent
18
Örnek: Hala ilişkisi
Tüm X ve Y ler için,
X, Y’nin halasıdır
Eğer
Z, Y’nin ebeveyni ise ve
Z, erkek ise ve
X, Z’in kız kardeşi ise
• İlişkinin Prolog’da ifadesi :
sister(X, Y) :- parent(Z, X), parent(Z, Y), female(X).
hala(X,Y) :- parent(Z,Y), male(Z), sister(X,Z).
19
• parent(pam, bob).• parent(tom, bob).• parent(tom, liz).• parent(bob, ann).• parent(bob, pat).• parent(pat,jim).• predecessor(X, Z) :- parent(X, Z).• predecessor(X, Z) :- parent(X, Y),predecessor(Y, Z).
HEDEF / SORGU ?-predecessor(tom, pat).
PR1
PR2
Sonuç Ata İlişkisi
20
Cevap nasıl bulunur?
• Prolog hedefe ulaşmak için programdaki yazılış sırasına göre cümlecikleri kullanır.
Y = bob
by rule pr1 by rule pr2
no
predecessor(tom, pat)
parent(tom, pat)parent(tom, Y)
predecessor(Y, pat)
by fact parent(tom, bob)
predecessor(bob, pat)
yes
parent(bob, pat)
by rule pr1
21
Doğal Dil vs. Prolog
• Bütün çocuklar kısadır.
kisa(X):-cocuk(X).
• Bütün erkek çocuklar arabaları sever.
sever(X,araba):-erkek(X),cocuk(X).
• Bütün çocukların annesi vardır.
var(X,anne):-cocuk(X).
• Sebzeyi hiçbir çocuk sevmez.
sevmez(X,Y):-sebze(Y), cocuk(X).
• Çocuğunu döven öğretmeni hiçbir anne sevmez.
sevmez(X,Y):-anne(X,Z),ogretmen(Y,Z),dover(Y,Z).
22
Doğal Dil vs. Prolog 2
• Bütün insanlar canlıdır. Ahmet insandır. Dolayısıyla Ahmet canlıdır.canli(X):-insan(X).insan(ahmet).?-canli(ahmet).
• Ahmet 20 metre zıplayabilir. Birisi X metreye zıplayabilirse daha azlarına da zıplayabilir.
ziplar(ahmet,20).ziplar(X,Y):-ziplar(X,Z),Z>Y.?-ziplar(ahmet,15).
• Kendi kalesine gol atan futbolcuyu kendi takımının taraftarları sevmez, karşı takımınkiler sever.
sevmez(Y,X):- futbolcu(X), taraftar(Y), aynitakim(X,Y), kendikalesinegolatar(X). sever(Y,X):- futbolcu(X), taraftar(Y), karsitakim(X,Y), kendikalesinegolatar(X).
SWI Prolog’la çalışmak
• SWI prolog kurulur.
http://www.swi-prolog.org
• Gerçekler ve kurallar .pl uzantılı bir dosyaya kaydedilir.
SWI Prolog’la çalışmak
• .pl uzantılı dosyanın üzerine çift tıklanarak
SWI Prolog’la çalışmak
• Yada SWI prolog açıldıktan sonra file menüsünden dosya ‘consult’ edilerek
SWI Prolog’la çalışmak
• Gerçek ve kurallarımız prolog’a yüklenir. Artık sorgularımız komut satırından girilerek çalıştırılabilir.
27
Aşırı Yükleme
• Aynı isimde farklı ilişkiler olabilir:– point(1, 1), point(1, 1, 1), point(1, 1, 1, 1), …
• +(X,Y,Z):-Z is X+Y.• +(X,Y,Z,F):-F is X+Y+Z.
?- +(200,0.03,7.2,G).G = 207.23 ;No
?- +(200,0.03,G).G = 200.03 ;No
28
Ve , veya ; (1)
• P :- Q; R.
P doğrudur Eğer
Q doğruysa
veya
R doğruysa
• Aynı ifadeyi aşağıdaki şekilde de yazabiliriz:
P :- Q.
P :- R.
29
• Ve, veya’dan daha yüksek önceliklidir.
• Aşağıdaki iki ifade aynı sonucu verir:
P :- Q, R; S, T, U.
P :- (Q, R); (S, T, U).
• Aynı ifadeyi aşağıdaki şekilde de yazabiliriz:
P :- Q, R.
P :- S, T, U.
Ve , veya ; (2)
30
Hedefleri Birleştirme
• araba(chrysler,130000,3,kirmizi,12000).• araba(ford,90000,4,gri,25000).• araba(ferrari,30000,5,siyah,30000).• kamyon(mercedes,10000,2,mavi,20000).• kamyon(ford,50000,8,sari,28000).• kamyon(volvo,35000,2,siyah,35000).
• arac(Marka,Kilometresi,Yas,Renk,Fiyat):-araba(Marka,Kilometresi,Yas,Renk,Fiyat);kamyon(Marka,Kilometresi,Yas,Renk,Fiyat).
31
Fiyatı 25000’den az olan araçlar:
• ?- arac(Marka,KiloMetre,Yasi,Renk,Fiyat), Fiyat<25000.
Marka = chryslerKiloMetre = 130000Yasi = 3Renk = kirmiziFiyat = 12000 ;
Marka = mercedesKiloMetre = 10000Yasi = 2Renk = maviFiyat = 20000 ;
No
Hedef BirleştirmeHasta 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).
/*Unification Ch05Ex01.pro*/
domainstitle, author = symbolpages = integer
predicatesbook(title, pages)written_by(author, title)long_novel(title)
clauseswritten_by(fleming, "DR NO").written_by(melville, "MOBY DICK").book("MOBY DICK", 250).book("DR NO", 310).long_novel(Title) :-
written_by(_, Title),book(Title, Length),Length > 300.
Goal: written_by(X, Y) X=fleming, Y=DR NO X=melville, Y=MOBY DICK 2 Solutions
Goal:
Trace CALL: written_by( _, _) RETURN: *written_by("fleming","DR NO”)YES
Goal: long_novel(Title)
/* BacktrackingCho5ex02.pro */
predicateslikes(symbol,symbol)tastes(symbol,symbol)food(symbol)
clauseslikes(bill, X) :-
food(X), tastes(X, good).
tastes(pizza, good).tastes(brussels_sprouts,
bad).
food(brussels_sprouts).food(pizza).
CALL: likes("bill",_)CALL: food(_)RETURN: *food("brussels_sprouts")CALL: tastes("brussels_sprouts","good")REDO: tastes("brussels_sprouts","good")REDO: food(_)RETURN: food("pizza")CALL: tastes("pizza","good")RETURN: tastes("pizza","good")RETURN: likes("bill","pizza")
Goal: likes(bill, X)X=pizza1 Solution
/* BacktrackingCho5ex02.pro */
predicateslikes(symbol,symbol)tastes(symbol,symbol)food(symbol)
clauseslikes(bill, X) :-
food(X), tastes(X, good).
tastes(pizza, good).tastes(brussels_sprouts,
bad).
food(brussels_sprouts).food(pizza).
CALL: likes("bill",_)CALL: food(_)RETURN: *food("brussels_sprouts")CALL: tastes("brussels_sprouts","good")REDO: tastes("brussels_sprouts","good")REDO: food(_)RETURN: food("pizza")CALL: tastes("pizza","good")RETURN: tastes("pizza","good")RETURN: likes("bill","pizza")
Goal: likes(bill, X)X=pizza1 Solution
Arama Kontrolü
• Fail --- geriye doğru taramaya devam etmeyi zorlamak için.
• Cut(!) --- geriye doğru taramayı engellemek için kullanılır.
/* use of fail - Ch05ex06.pro */
domainsname = symbol
predicatesfather(name, name)everybody
clausesfather(leonard, katherine).father(carl, jason).father(carl, marilyn).everybody :-
father(X, Y),write(X, " is ", Y, "'s father\n"),fail.
Goal: father(X, Y)X=leonard, Y=katherineX=carl, Y=jasonX=carl, Y=marilyn3 SolutionsGoal:
Without ‘fail’Goal: everybodyleonard is katherine’s fatherYESGoal:With ‘fail’Goal: everybody leonard is katherine's father carl is jason's father carl is marilyn's father No Goal:
/* Cut Example -Ch05ex07.pro */predicates
buy_car(symbol, symbol)car(symbol, symbol, integer)colors(symbol, symbol)
clausesbuy_car(Model, Color) :-
car(Model, Color, Price),colors(Color, sexy),!,Price < 25000.
car(maserati, green, 25000).car(corvette, black, 24000).car(corvette, red, 26000).car(porsche, red, 24000).colors(red, sexy).colors(black, mean).colors(green, preppy).
Goal: buy_car(X, Y)No Solution
CALL: buy_car(_,"red")CALL: car(_,"red",_)REDO: car(_,"red",_)REDO: car(_,"red",_)RETURN: *car("corvette","red",26000)CALL: colors("red","sexy")RETURN: colors("red","sexy")
26000<25000FAIL: buy_car(_,"red")
Goal: buy_car(X, red)No Solution