Uvod Prolog

  • Published on
    10-Oct-2015

  • View
    11

  • Download
    0

Embed Size (px)

DESCRIPTION

Prolog

Transcript

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

Recommended

View more >