Upload
nathan-malone
View
42
Download
0
Embed Size (px)
DESCRIPTION
Prolog
Citation preview
Prolog
Vjebe iz umjetne inteligencijeMatko Bonjak, 2010
Uvod
Programiranje Deklarativno Postupkovno (imperativno) (Prolog, SQL, Mathematica*, R, ...) (C, Java, C++, ...)
Prolog Programski jezik za simboliku nenumeriku obradu Programski jezik za simboliku nenumeriku obradu Temelji se na FOL, koristi ogranienu verziju klauzalnog oblika
Hornov klauzalni oblik
Pogodan za rjeavanje problema koji se mogu opisati objektima i relacijama meu njima Opii problem Pitaj to tono eli doznati (Prolog sam zakljuuje nove injenice)
VJEBE: SWI-Prolog (implementacija)
Sintaksa prologa
Izraz
Jednostavan izraz Sloeni izraz
Konstanta VarijablaKonstanta Varijabla
Atom Broj
kriptonpivo:-===>vau vaujabuka
2.717.7e-7
42-999
XKlokan_545_M_
f(x, y)uci(marko,ui)
[1, [5, g, 9], [], 9][f(g, H), 5, +(5, 5+5)]
Poinje s _ ili svelikim slovom
Opis problema
radi(petra).studira(petra).
zaposlen(X):-studira(X); radi(X).prezaposlen(X):-studira(X), radi(X).
injenice- opisuju pojedinane elemente relacije
Pravila- definiraju nove relacije na temelju postojeih
Stavak- Temeljna graevna jedinica programa (injenica, pravilo)
Prolog: prezaposlen(X) :- radi(X) , studira(X).FOL: prezaposlen(X) radi(X) studira(X)
(Hornova klauzula klauzula s najvie jednim pozitivnim literalom)
prezaposlen(X):-studira(X), radi(X). - definiraju nove relacije na temelju postojeih
glava tijelo
kupujeKod(X, Y, Z).
funktor argumenti
Toka na kraju svakog stavka!
3-mjesni (arity) predikat: kupujeKod/3
Upiti
?- radi(petra).
studira(ana).studira(petra).radi(petra).
zaposlen(X):-studira(X); radi(X).prezaposlen(X):-studira(X), radi(X).
Doseg varijable-jedan stavak
?- radi(petra).
?- studira(X),radi(X).
?- prezaposlen(ana).
?- zaposlen(X).
?- listing.
Poseban predikat za ispis klauzula u bazi znanja:
UnifikacijaProlog instancira (pretrauje prostor potrebnih supstitucija) tako da
se postigne identinost dva izraza.
Detaljnija definicija unifikacije:
1. Ako su I1 i I2 konstante, onda se one mogu unificirati ako predstavljaju isti atom ili brojpredstavljaju isti atom ili broj
2. Ako je I1 varijabla, a I2 bilo koji tip izraza, onda je I1 i I2 mogue unificirati i I1 se instancira u I2.
3. Ako su I1 i I2 kompleksni izrazi onda se mogu unificirati ako:a) predstavljaju isti predikat ili funkciju i imaju isti broj argumenata (arity)b) korespondirajui argumenti predikata ili funkcija se mogu unificiratic) instanciranje varijabli je kompatibilno
Unifikacijaoprezan(pero).oprezan(ivo).oprezan(stef).trijezan(pero).trijezan(stef).koncentriran(ivo).koncentriran(stef).pijan(ivo).
?- dobar_vozac(Z).
pijan(ivo).dobar_vozac(X) :- oprezan(X), trijezan(X), koncentriran(X).
?- trace.
?- notrace.
trace mod, prikazuje svaki korak zakljuivanja (stabla pretraivanja)
Rekurzija
monika
lucija marijan
roditelj(ivan, petra).roditelj(ivan, tihana).roditelj(lucija, ivan).roditelj(marijan, ivan).roditelj(monika, marijan).
Naredbe pridruivanja, programske petlje? Rekurzija!
?- predak(ivan, petra).
?- predak(X,petra).
?- predak(lucija,X).
ivan
petra tihana
roditelj(monika, marijan).
predak(X,Y):-roditelj(X,Y).predak(X,Y):-roditelj(X,Z),predak(Z,Y).
...ukljuite trace mod, pogledajte stablo pretraivanja
Rekurzijapredak1(X,Y):-roditelj(X,Y).predak1(X,Y):-roditelj(X,Z),predak1(Z,Y).
predak2(X,Y):-roditelj(X,Y).predak2(X,Y):-predak2(Z,Y),roditelj(X,Z).
predak3(X,Y):-predak3(X,Z),roditelj(Z,Y).predak3(X,Y):-roditelj(X,Y).
Prolog ima ugraeni redoslijed obavljanja operacija- pretraga baze znanja odozgo prema dolje- procesiranje klauzula s lijeva na desno- backtracking, povratak iz neuspjelih unifikacija
?- predak1(X, petra)
?- predak2(X, petra)
?- predak3(X, petra)
?- predak4(X, petra)
predak3(X,Y):-roditelj(X,Y).
predak4(X,Y):-roditelj(Z,Y),predak4(X,Z).predak4(X,Y):-roditelj(X,Y).
unifikacija
Neto od ovoga ne valja...
...zato?
Nije isto deklarativan jer:A B C B A C
Liste?- X = [kvasac, klokan, krmenadl].
?- X = [Y, 2, 3+3, 2, mama(ana)].
?- X = [].
?- X = [[], [2, [x, Y, [3, z]], 7]].
Elementi liste odvojeni zarezomElementi liste svi prolog objektiponavljanja dozvoljenaPrazna lista
Liste mogu sadravati druge liste
?- [G|R] = [martin, matej, mihajlo].Svaka neprazna lista se sastoji od glave i repa
Glava elementRep lista
| iznimno vaan operator!?- [X1,X2|R] = [1, 2, 3, 4, 5].
?- [X1,X2,X3|R] = [1, 2, 3, 4, 5].
?- [_,X2,_|R] = [1, 2, 3, 4, 5]._ anonimna (dont care) varijabla
Liste
?- clan(5,[1,2,3,4,5]).?- clan(X,[1,2,3,4,5]).?- clan(7,[1,2,3,4,5]).
clan(X,[X|_]).clan(X,[_|R]):-clan(X,R).
Da li je element lan liste
?- clan(7,[1,2,3,4,5]).
spoji([],L,L).spoji([G|R1],L,[G|R2]):-spoji(R1,L,R2).?- spoji([1,2,3],[4,5,6],[1,2,3,4,5,6]).?- spoji([1,2,3],[4,5,6],X).?- spoji([1,2,3],X,[1,2,3,4,5]).
Spajanje dvije liste u jednu
?- spoji([1,2,3],4,L).Problem?
Aritmetika?- X = 2 + 2.
?- X is 2 + 2.
(implicitno X = +(2,2) )- infiksna notacija je samo sintaksni eer
predikat is vri evaluaciju
?- X is Y + 2.Varijable s desne strane moraju biti instancirane u trenutku izrauna
?- 2 + 2 = X.
Operatori (predikati) koji ne vre izraun+, -, *, /, mod(X, Y)Operatori (predikati) koji vre izraunis,
izrauna?- Y=5, Z=8, X is Z*Y+2.
?- 4 = 2 + 2.
?- 4 =:= 2 + 2.
?- 2 + 2 is 4. Problem?
Aritmetika
f(X,Y,Rez):-Rez is X*X + Y*Y + 7.
fakt(0,1).fakt(N,Rez):-
N>0,
Proizvoljna funkcija
Faktorijel
len([],0).len([_|R],N):-
len(R,N1),N is N1+1.
N>0,X is N-1,fakt(X,R),Rez is R*N.
Duljina liste
Akumulator
lenAkk(L,N):-lenAkk(L,0,N).
lenAkk([],Ak,Ak).
Duljina liste (2)
Akumulator analogija varijable koja uva privremeni rezultat
Wrapper predikat
lenAkk([],Ak,Ak).lenAkk([_|R],Ak,N):-
Ak1 is Ak+1,lenAkk(R,Ak1,N).
Unifikacija akumulatora i rezultata i kriterij zaustavljanja
Tail recursive rezultat je izraunat kada smo doli do dna rekurzije i jednostavno ga treba prenijeti dalje
U prethodnom sluaju se rezultat gradi izlaskom iz rekurzije Head recursive
to dalje...? Rez
Negacija
NLP
Operatori Operatori
... (da barem imamo vremena)
Literatura
S. egvi: Uvod u programski jezik Prolog, http://www.zemris.fer.hr/~ssegvic/pubs/prolog.pdfprolog.pdf
P. Blackburn, J. Bos, K. Striegnitz: Learn Prolog Now!, http://www.learnprolognow.org/
Zadaci Zadatak 1. to e Prolog vratiti kao rezultat na sljedee upite?
[] = [_|_]. fun(X, [b, c, d]) = notfun(a, [Y|R]). [1, 7, X, 9] = [X|R]. [[X, 2], 6, m, 9, [1, 45, 7]] = [Y, _, _|R], R = [_, Z|R2].
Zadatak 2. Napiite predikat dodaj/3 koji dodaje element na kraj liste.
Zadatak 3. Napiite predikat usporedi/2 koji vraa true ukoliko su njegovi argumenti dvije liste jednakih duljina.
Zadatak 4. Napiite predikat pot/3 koji rauna potenciju dvaju brojeva
Zadatak 5. Napiite predikat zbroji/2 koji rauna zbroj vrijednosti elemenata liste.
Zadatak 6. Napiite predikat okreni/2 koji vraa true ukoliko su njegovi argumenti dvije zrcalne liste. Po mogunosti koristite akumulator
Rjeenjaa) false.b) false.c) X = 1, R = [7, 1, 9].d) Y = [X, 2], R = [9, [1, 45, 7]], Z = [1, 45, 7], R2 = [].
dodaj([],X,[X]).dodaj([G|L],X,[G|L2]):-dodaj(L,X,L2).usporedi([],[]).
1
2
usporedi([],[]).usporedi([_|L1],[_|L2]):-usporedi(L1,L2).pot(_,0,1).pot(X,Y,Rez):-Y>0, Temp is Y-1, pot(X,Temp,R), Rez is R*X.
zbroji([],0).zbroji([H|T],Rez):-
zbroji(T,R),Rez is R + H.
okreni2(X,Y):-okreni2(X,[],Y).okreni2([],X,X).okreni2([G|R],L,Y):-okreni2(R,[G|L],Y).
3
4
5
6
Dodatni zadaci (1) Zadatak 1. to e Prolog vratiti kao rezultat na sljedee upite?
a) +(+(3,3),2) =:= +(3,+(2,3)).b) [a(X),42,brom,n,5] = [Y,_,X|R].c) [m(X),[],Y,k,1,3]=[Y,_,X+1|R].d) X=_veselo(mama(X),tata(Y)).e) Slon=Slon.
Zadatak 2. Realizirati predikat fibonacci/2 koji rauna n-ti lan fibonaccijevog niza definiranog s:
Zadatak 2. Realizirati predikat fibonacci/2 koji rauna n-ti lan fibonaccijevog niza definiranog s:
Zadatak 3. Realizirati predikat kompresiraj/2 koji uklanja jednake uzastopne elemente u listi npr.:
?- kompresiraj([1,1,1,1,2,2,2,3,3,4,4,4,4,4,5,5,6],X).
>
=
=
+
=
110
10
21 n
n
n
FFF
nn
n
&
Dodatni zadaci (2) Zadatak 4. Napisati predikat twice/2 koji vraa true ukoliko je drugi
argument jednak prvom s podvojenim lanovima.
Zadatak 5. Napisati predikat nzd/3 koji rauna najvei zajedniki djelitelj dvaju brojeva euklidovim algoritmom:Za dva cijela broja a i b:Za dva cijela broja a i b:Ako je b jednak 0a je nzdinae
a=b, b = a mod b
Zadatak 6. Napisati predikat dot/3 koji rauna skalarni produkt dvaju vektora (listi brojeva).
Zadatak 7. Napisati predikat palindrom/1 koji vraa true ukoliko mu je argument palindrom.
Dodatni zadaci (3) Zadatak 8. Napisati predikat koji listu s podlistama izravnava u jednu
listu tako da nrp. Vrijedi:?- izravnaj([1, 2, 3, [4, [5, 6], 7]],[1, 2, 3, 4, 5, 6, 7])True
Zadatak 9. Napisati predikat split/4 koji zadanu listu podijeli na dvije liste s time da je duljina prve zadana, npr:?- split([1, 2, 3, 4, 5, 6], 2, X, Y).X = [1, 2]Y = [3, 4, 5, 6]
Zadatak 10. Napisati predikat slijed/3 koji kreira listu koja sadri sve cijele brojeve iz intervala zadanog s prva dva argumenta?- slijed(2, 5, X).X = [2, 3, 4, 5]