Prolog`la 5.Hafta İçerik soru

advertisement
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
Download