Transcript YZ_9

Mantıksal Programlama-Prolog
Prolog-bildirimsel (declarative) dildir.
Bildirimsel cümleler,örneğin
P if Q and R and S
biçimindedir.
Bu cümle yordamsal (procedural) biçimde
böyle yazılabilir:
P’yi çözmek için Q’yü çöz,sonra R’i, sonra S’i
çöz.
Prolog dili –temel kavramlar
•Genellikle yapay zeka sorunlarını çözmek için
oluşturulmuştur. İlk kez 1972 yılında Marseilles
Üniversitesinde çalıştırılmıştır.
• "Prolog" adı "programming in logic“ kelimelerinden alınmıştır.
•Prolog’un temelini yüklemler mantığı
oluşturmaktadır. Mantıksal çıkarım kuralını
uygulamakla programın amacına (çözüme)
ulaşılıyor.
Temel kavramlar (devamı)
• Tanım: Cümle (clause) iki kısımdan oluşmaktadır. Baş kısım ve
metin. Cümlede okun gösterdiği kısım baş kısımdır. Sol taraf ise
metindir. Horn cümlesi, baş kısmında en fazla bir literal
(öneri/yüklem) bulunan cümledir.
Örnek : Aşağıdaki cümleler Horn cümleleridir
a) P (X), Q (Y) → W (X,Y)
b) R (X, Y), Q (Y) → ?
• (a)’da W (X, Y) cümlenin başı, P (X), Q (Y) ise metnidir. (b)’de R(X, Y), Q(Y)
metindir. Baş kısım null cümledir.
• (b) cümlesi R (X, Y), Q (Y) ‘nin doğru olup-olmadığını veya hangi X ve Y
değerleri kümesinin R (X, Y) ∧ Q (Y) ifadesini doğru yaptığını sorguluyor
• Tanım : Mantıksal program, Horn cümlelerinden oluşan
programdır
Temel kavramlar (devamı)
Yordam tanımı
Prolog yordam çağırma yöntemiyle çalışıyor. Prolog programı
yordamların tanımından ve onların değerlendirilmesinden
oluşuyor.
Örnek: a :- b, c.
Bu cümle yordamın tanımıdır. Biz a’yı değerlendirmeliyiz ve bunun için b ve
c’yi değerlendirmemiz gerekiyor..”Değerlendirme” , ifadenin doğru ve ya
yanlış olmasını belirlemektir. Bu cümle mantıksal olarak böyle de okuna
bilirdi:
a if (b and c)
anlıyor(bob, prolog) :- var(bob, mantık).
anne(X, Y) :- ebeveyn(X, Y),kadın(X).
mutlu(U) :- öğrenci(U), kayıtlıdır(U,yapay_zeka),
sınav_var(yapay_zeka).
“ve” ile bağlanmış tüm mantıksal birimler birinci dereceden yüklemlerdir.
Prolog’da “if“ “:-” ile , “ve” “virgülle” “veya” “;” ile ifade ediliyor.
Hesaplama
• Örnek:
•
•
•
•
a :- b, c. (bu örnekte a cümlenin başı, “b,c”
metnidir.
Sorgular ? -ile başlar (Prolog yorumlayıcıları çoğunlukla
böyle çalışıyor).
Yürütülmek için ilk çağrılan a’dır. Yordamın çağrılması
a’nın yerine cümlenin metin kısmını koymakla
gerçekleştiriliyor.
?- b, c, d, e.
Sorgu verildiği zaman Prolog, baş kısmı sorgunun baş kısmı
ile eşleşen cümleyi buluyor ve çağrıyı bu cümlenin metni ile
değiştiriyor. Bu anlamda Prolog yorumlayıcısı türeme
sorgular zinciri üretmiş oluyor ki, buna hesaplama denir.
Hesaplamanın her adımı bir yordam çağırma işlemidir.
Prolog dilinin sözdizimi
• Prolog programı yazarken ilk önce nesneler
ve onlar arasındaki ilişkiler tanımlanır.
Nesneler arasındaki ilişkiye yüklem denir.
Bilinen olgular ve ilişkiler gerçeklerdir.
Gerçekler (.) ile biter.
• insan(ahmet).
• kirmizi(gül).
• Sever(ahmet,gül).
Prolog dilinin sözdizimi-kurallar
• Kurallar, gerçek olguları kullanarak bir sonuca varmak için
kullanılır.
• sever(yasin,Hersey):-sever(esra,Hersey).
Yasin,Esra’nın sevdiği her şeyi sever
• (:- ) simgesi eğer anlamında olup bir kuralın iki parçasını
birleştirir.
• Sabitler,yani değeri sabit olan nesneler küçük harfle,
değişkenler büyük harfle başlar. Sabitler tırnak arasında da
(büyük-küçük harflere bakmaksızın) ifade edile
bilir.Değişkeni (_) ile de ifade etmek mümkündür
Prolog dilinin sözdizimi-sorgular
sever(cengiz, masa_tenis).
sever(mehmet,yüzme).
sever(yavuz,futbol).
sever(levent,Spor):-sever(yavuz,Spor).
Levent,bir spor türünü eğer Yavuz da seviyorsa sever
Levent’in yüzmeyi sevip sevmediğini öğrenmek için
sever(levent,yüzme) sorgusunu kullanmak yeterlidir.
GOAL satırına bu sorguyu yazarsak No yanıtını alırız
“Ders saati” bilgi tabanı
Nesne(tahta)
Yazmak(john,tahta,derssaati
Oturmak(rita,sandalya,derssaati)
Oturmak(mita,sandalya,derssaati)
Kişi(john)
Kişi(rita)
Kişi(mita)
“Ders saati” bilgi tabanı (devamı)
1. Hocanın yazı tahtası nesnesinde yazdığı zaman ders saatidir
Yüklemler mantığında bu cümle böyle yazılır:
Object (board) ∧ Writes-on ( X, board, Time ) ∧ Teacher (X)
→Equal (Time, classhour).
2. Hoca , ders saatinde yazı tahtası üzerinde yazı yazan kişidir
∀ X ( Person(X) ∧ Writes-on (X, board, classhour) → Teacher (X) )
3. Öğrenci ders saatinde sandalyede oturan kişidir
∀Y ( Person (Y) ∧ Sits-on (Y, bench, Time) ∧ Equal (Time, classhour)
→Student (Y) )
4. Eğer en azından bir kişi ders saatinde sandalyede oturmuşsa ve ikinci bir
kişi aynı zamanda yazı tahtasında yazı yazıyorsa bu zaman ders saatidir
∃ Y ( ( Person (Y) ∧ Sits-on (Y, bench, classhour )) ∧
∃ X (Person (X) ∧ Writes-on (X, board, Time)) → Equal (Time, classhour) )
Bilgi tabanındaki cümlelerin Prolog dilinde yazılışı
1. Object (board) ∧ Writes-on ( X, board, Time )
∧ Teacher (X)
→Equal (Time, classhour).
2. ∀ X ( Person(X) ∧ Writes-on (X, board,
classhour) → Teacher (X) )
3. ∀Y ( Person (Y) ∧ Sits-on (Y, bench, Time) ∧
Equal (Time, classhour) →Student (Y) )
4. ∃ Y ( ( Person (Y) ∧ Sits-on (Y, bench,
classhour )) ∧ ∃ X (Person (X) ∧ Writes-on
(X, board, Time)) → Equal (Time, classhour))
Prolog yorumlayıcısının
çalışması (örnek üzerinde)
Clauses
Object (board).
Writes-on (john, board, classhour).
Sits-on (mita, bench, classhour)
Sits-on (rita, bench, classhour).
Person (john).
Person (mita).
Person (rita).
1
2
3
4
5
6
7
Equal (Time, classhour):- Object (board), Writes-on (X, board,
Time), Teacher(X).
8
Equal (Time, classhour):-Person (Y),Sits-on (Y, bench, classhour),
Person (X ),Writes-on (X, board, Time). 9
Teacher (X):-Person (X),Writes-on (X, board, classhour).
10
Student (Y) :-Person (Y),Sits-on (Y, bench, Time),
Equal (Time, classhour).
11
geriye izleme (backtracking.)
sorgu: Teacher (X)?
Teacher (X) ←Person (X),Writes-on (X, board, classhour)
cümlesinin amacı (Teacher (X)) sağlaması için
altamac (Person (X)) sağlanmalıdır.
PROLOG Person (X) altamacı için Person( ) yüklemini arayacak.
5.cümlede eşleşme bulacak ve X’i john ile değişecek. PROLOG
5.cümleyi “işaretleyecek”.
Daha sonra kalan cümleler içinde Writes-on (X, board, classhour).
altamacının sağlanması için Writes-on (john, board, classhour)
aranacak. Ama bu yüklem 2.yerde olduğundan arama başarısız
olacak. Bu sebepten Prolog işaretlenmiş yerden yukarıya dönecek
ve Writes-on (john, board, classhour) yüklemini bulacak.
Altamaçlara ulaşıldığı için amaca da ulaşılmıştır.
Çözüm: Teacher (john).
Teacher (X) ←Person (X),Writes-on (X,
board, classhour).
Person (john).
Person(X)’ten aşağıdaki hükümlerde write_on(john,board,classhour)
eşlenmesi sağlanmadığından yukarıya (geriye) izleme
gerçekleştiriliyor
Eşleşme 2. cümlede sağlanıyor
Her iki altamaç sağlandığından başarılı amaca ulaşılmıştır
Goal: ?teacher (X)
Programın Yanıtı: teacher (john).
Goal: ?equal (Time, classhour)
Programın Yanıtı: Yes.
Goal: ?father (X,Y)
Yanıt: father(ratha,ram)
Goal: ?son(Y,X)
Yanıt: son(ram,ratha).
Liste (List)
• Liste karmaşık termlerin özel türüdür
[a,b,c]
[elma,portakal,kayısı]
[a,1,b,1,c,2]
[]
[ebeveyn (fred,mary), ebeveyn (sandra,mary)]
[ebeveyin (fred,mary),6,7,8]
• Listelerin kendileri listeler içere biliyor
[a,[1,2,3],b,[4,5,6]]
[[kırmızı,yeşil,mavi]]
[[]]
[1,2,[3,[4,5],6],7]
Liste (devamı)
•
“|” operatörü listenin başını onun diğer kısmından (kuyruktail) ayırıyor
•
•
•
•
•
•
•
•
•
•
| ?- [A|B]=[a,b,c,d].
A=a
B = [b, c, d]
yes
| ?- [a|Rest]=[a,b,c,d].
Rest = [b, c, d]
yes
| ?- [a,b|Rest]=[a,b,c,d].
Rest = [c, d]
yes
Liste (devamı)
• Liste (boş liste dışında) baş(head) ve kuyruk (tail)
kısımlardan oluşuyor
• [a,b,c]
• Listenin başı – a
• Listenin kuyruğu -[b,c]
• Listenin kuyruğu listedir ve listenin başı
öğedir(element).
• Yalnız bir öğeden oluşan listenin kuyruğu boş
öğedir.
• Örnek : [a] listesinde
baş a
kuyruk []
Liste-örnekler
•
•
•
•
•
| ?- [G,H|K]=[a,b,c,d].
G=a
H=b
K = [c, d]
Yes
• | ?- [A|B]=[].
• No
•
•
•
•
| ?- [A|B]=[x].
A=x
B = []
Yes
•
•
•
•
| ?- [A,B|[]]=[a,b].
A=a
B=b
yes
Liste-örnekler
•
•
•
•
•
•
| ?- [A,B,C|D]=[x,y,z,w].
A=x
B=y
C=z
D = [w]
Yes
•
•
•
•
•
•
| ?- [A,B,C|D]=[x,y,z].
A=x
B=y
C=z
D = []
Yes
• | ?- [A,B,C|D]=[x,y].
• no
Liste (örnekler)
•
•
•
•
•
•
•
•
•
•
•
| ?- X=[a,b,c],L=[d|X].
X = [a, b, c]
L = [d, a, b, c]
yes
| ?- X=[a,b,c],L=[d,e|X].
X = [a, b, c]
L = [d, e, a, b, c]
yes
| ?- L=[a|[M]].
L = [a, M]
yes
PROLOG dilinde basit örnekler
YOL programı
% Author:
% Date: 04/14/2005
yol(canakkale, izmir).
yol(izmir,aydin).
çanakkale
yol(izmir,bursa).
yol(bursa,izmir).
yol(aydin,antalya).
yol(canakkale,bursa).
uzunyol(X,Y):-yol(X,Y).
uzunyol(X,Y):-uzunyol(X,Z),yol(Z,Y),write(Z),!.
?- uzunyol(canak,Y).
Y = izmir ;
Y = bursa ;
izmir
Y = aydin ;
No
bursa
aydın
izmir
antalya
?- yol(izmir,X).
X = aydin ;
X = bursa ;
?- uzunyol(bursa,antalya).
izmiraydin
Yes
uzunyol(bursa,canak).
izmir
No
?- uzunyol(canak,X).
X = izmir ;
X = bursa ;
izmir
X = aydin ;
izmir
X = bursa ;
bursa
X = izmir ;
izmiraydin
X = antalya ;
izmirbursa
X = izmir ;
bursaizmir
X = aydin ;
izmir
X = bursa ;
izmiraydinizmirbursaizmir
X = aydin ;
izmir
X = bursa ;
bursaizmiraydin
X = antalya ;
izmirbursa
X = izmir ;
izmiraydinizmirbursaizmiraydin
X = antalya
…
Sonsuz döngünün (kendini
yineleme) önlenmemesi
durumu
Yol_araç programı
yol(canak, izmir,tren).
yol(izmir,aydin,araba).
yol(izmir,bursa,yaya).
yol(bursa,izmir,yaya).
yol(aydin,antalya,ucak).
yol(canak,bursa,araba).
uzunyol(X,Y):-yol(X,Y,K),write(K).
uzunyol(X,Y):-uzunyol(X,Z),yol(Z,Y,K),write(Z),write(K),!.
?- uzunyol(canak,antalya).
tren araba tren izmir araba aydin ucak
Örnek: Listenin eksi değerli elemanlarının elenmesi
Bu program listedeki eksi değerli elemanları eleyerek yeni liste oluşturuyor
liste=integer*.
eksileri_ele(liste,liste).
eksileri_ele([],[]).
eksileri_ele([Bas|Kuyruk],IslenmisKuyruk):Bas<0,!,eksileri_ele(Kuyruk,IslenmisKuyruk).
eksileri_ele([Bas|Kuyruk],[Bas|IslenmisKuyruk]):eksileri_ele(Kuyruk,IslenmisKuyruk).
SWI-Prolog console for thread 2
1 ?- eksileri_ele([2,-5],Yeni).
Yeni = [2].
2 ?- eksileri_ele([2,-45,3,3,4,-5,-45],Yeniliste).
Yeniliste = [2, 3, 3, 4].
Listenin Elemanlar sayısının hesaplanması
Programın temel çalışma mantığı böyledir: Liste boş [] ise, listedeki
eleman sayısı 0’dır. Boş değilse eleman sayısı Kuyruk_uzunluk+1 ile
bulunabilir. Liste _uzunluk yüklemi kendisini çağırarak listenin
uzunluğunu bulur.
liste=integer*.
liste_uzunluk(liste,integer).
liste_uzunluk([],0).
liste_uzunluk([_|Kuyruk],Eleman_sayisi):liste_uzunluk(Kuyruk,Kuyruk_uzunluk),
Eleman_sayisi is Kuyruk_uzunluk+1.
SWI-Prolog console for thread 2
1 ?- liste_uzunluk([1,2],Eleman_sayisi).
Eleman_sayisi = 2.
2 ?- liste_uzunluk([1,2,5,7],Eleman_sayisi).
Eleman_sayisi = 4.
“Patron” programı
amir(ali,ahmet).
amir(ahmet,mehmet).
amir(mehmet,veli).
amir(veli,fatma).
amir(ayse,ahmet).
amir(aysun,mehmet).
patron(X,Y):-amir(X,Y).
patron(X,Y):-amir(X,Z),patron(Z,Y).
?- patron(ali,X).
X = ahmet ;
X = mehmet ;
X = veli ;
X = fatma ;
No
% Author:
% Date: 04/14/2005
üç renk sorunu
d(red,blue).
d(red,green).
d(green,red).
d(blue,red).
d(blue,green).
colorable(W,NT,SA,Q,NSW,V):d(W,NT),d(W,SA),d(NT,Q),d(Q,NSW),d(NT,SA),d(NSW,V),
d(NSW,SA),d(V,SA).
?- colorable(W,NT,SA,Q,NSW,V).
W = red
NT = blue
SA = green
Q = red
NSW = blue
V = red
Üç renk sorunu (bir başka çözüm)
color(A,B,C,D,E):-next(A,B),
next(C,D),
next(A,C),
next(A,D),
next(B,C),
next(B,E),
next(C,E),
next(D,E).
next(X,Y):-selectcolor(X),selectcolor(Y), X \== Y.
selectcolor(red).
selectcolor(green).
selectcolor(blue).
selectcolor(yellow).
SWI-Prolog console for thread 2
1 ?- color(X,Y,Z,K,L).
X = red,
Y = green,
Z = blue,
K = green,
L = red |
örnek
kişi(ali).
kişi(ahmet).
kişi(mehmet).
kişi(fatma).
kişi(ayşe).
kişi(mahmut).
kişi(nesrin).
kişi(mustafa).
baba(ali,ahmet).
baba(ali,mehmet).
baba(mustafa,ayşe).
anne(fatma,mehmet).
kardeş(mahmut,fatma).
dayı(X,Y):-anne(Z,Y),kardeş(X,Z).
örnekler
1. toplama(C,X,Y):-C is X+Y.
2. student(ali).
student(ahmet).
ders(ali,fizik).
ders(ahmet,fizik).
ders(ali, matematik).
sinav(X,Y):-student(X),ders(X,Y).
3. factorial(0,1).
factorial(A,B) :A > 0,
C is A-1,
factorial(C,D),
B is A*D.
Düşmanımın düşmanı benim dostumdur
Bulmaca
• Ali,Akif ve Ahmet’in bazı özellikleri verilmiştir.Bu özelliklere göre
onların tüm özelliklerini(boyunu,arabasının rengini ve ne tür
müzik sevdiğini) bulmalı
• Ortaboylunun arabası sarıdır;
• Uzunboylu türkü sever;
• Alinin arabası mavidir;
• Ahmet uzunboyludur;
• Kırmızı arabası olan pop sever;
• Akif rep sever.
Bulmaca programı
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
ad(ali).
ad(akif).
ad(ahmet).
boy(uzun).
boy(orta).
renk(kirmizi).
renk(mavi).
renk(sari).
muzik(rep).
muzik(turku).
muzik(pop).
kisi1(X,Y,Z,K):-ad(X),boy(Y),renk(Z),muzik(K),Y=orta,Z=sari.
kisi2(X,Y,Z,K):-ad(X),renk(mavi),boy(Y),muzik(K),X=ali.
kisi3(X,Y,Z,K):-ad(ali),renk(mavi),muzik(K),boy(Y).
kisi4(X,Y,Z,K):-ad(X),boy(Y),renk(Z),muzik(K),X=ahmet,Y=uzun.
kisi(X1,Y1,Z1,K1,X2,Y2,Z2,K2,X3,Y3,Z3,K3):kisi1(X1,Y1,Z1,K1),kisi2(X2,Y2,Z2,K2),kisi3(X3,Y3,Z3,K3),!.
Prolog’da aritmetik işlemlere örnek
carpı,toplam=integer.
toplama_yap(toplam,toplam,toplam).
carpı_yap(carpı,carpı,carpı).
toplama_yap(X,Y,Toplam):-Toplam is X+Y.
carpı_yap(X,Y,Carpı):-Carpı is X*Y.
ishlem(X,Y,Son):-toplama_yap(X,Y,Son);carpı_yap(X,Y,Son)
Örnek:
1 ?- ishlem(10,34,X).
X = 44 ;
X = 340.
islem yüklemi 10 ve 34 sayıları üzerindeki işlemlerin sonuçlarını gösteriyor. 44
sayısından sonraki “;” sonraki çözümü göstermek içindir.
eşitlik “is” ile ifade ediliyor
Prolog yorumlayıcıları
Bu adreslerden prolog yorumlayıcılarını
indire bilirsiniz:
http://goanna.cs.rmit.edu.au/~winkoff/wp/
W-Prolog , Java’da çalışan basit yorumlayıcıdır. W_Prolog’un
grameri çok sınırlıdır.Çevrimiçi çalıştırıla bilir.
http://www.swi-prolog.org
SWI özgür yazılımdır, bedava indirilip kurula bilir. Geniş imkanlı
yorumlayıcıdır.