Download pdf - Uvod Prolog

Transcript
  • 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]


Recommended