8
Predmet: Sistemi veštačke inteligencije VEŽBE: LOGIČKO PROGRAMIRANJE - PROLOG Ove vežbe su bazirane na online radu u SWI Prologu. Kliknite na dugme Program: Dobije se:

VEŽBE: LOGIČKO PROGRAMIRANJE - PROLOG Prolog.pdf · Pre nego što počenemo sa unosom programa, mali podsetnik o sintaksi i prolog rečenicama: 1. vrsta rečenica su činjenice

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

  • Predmet: Sistemi veštačke inteligencije

    VEŽBE: LOGIČKO PROGRAMIRANJE - PROLOG

    Ove vežbe su bazirane na online radu u SWI Prologu. Kliknite na dugme Program:

    Dobije se:

  • Pre nego što počenemo sa unosom programa, mali podsetnik o sintaksi i prolog rečenicama:

    1. vrsta rečenica su činjenice (predikat(argument1, argument2, ..., arguimentN).) i one

    predstavaljaju bazu

    2. vrsta rečenica su pravila (glava:-telo.) i to je ustvari implikacija zapisana suprotno od desne ka

    levoj strani implikacije

    3. vrsta rečenica su upiti (?-upit.)

    i nema više nikakvih drugih vrsta rečenica!!!!

    Ako ukucamo program:

    student(petar, petrovic, 22, 3, fizika).

    student(petar, petrovic, 22, 2, matematika).

    student(mirko, mirkovic, 23, 4, geografija).

    student(djordje, djukic, 23, 2, it).

    student(ana, anovic, 25, 5, fizika).

    student(ana, anovic, 25, 3, geografija).

    izdvoj1(X,Y):- student(Y, X, Z, _, it),Z>22.

    izdvoj2(X,Y):- student(X, Y, _, _, Z),Z=matematika,student(X, Y,

    _, _, W),W=fizika.

    Primećujemo da su prvih 6 redova rečenice tipa činjenica sa 5 argumenata. Nakon njih su zapisana dva

    pravila i to:

    izdvoj1(X,Y):- student(Y, X, Z, _, it),Z>22.

    gde je glava pravila izdvoj1(X,Y)

    separator (razdvaja glavu od tela pravila): :-

    telo pravila: student(Y, X, Z, _, it),Z>22.

    Zaraz označava konjukciju, tako da zapis student(Y, X, Z, _, it),Z>22. znači studenti kod

    kojih se posmatra prvi, drugi, treći i peti argument i kod kojih je treći argument veći od 22.

    Dobijamo:

  • Zatim upisujemo željeni upit i pokrećemo izvršavanje (Run – dole desno), gde se sva pravila transformišu

    u disjunkcije i primenjuje se rezolucijska metoda pobijanja. Više o unifikaciji i algoritmu pobijanja možete

    pročitati u materijalu sa predavanja.

    Ako je upit na primer činjenica:

    student(djordje, djukic, 23, 2, it).

    koju imamo u bazi programa, a pošto će Prolog na svaki upit automatski dodati negaciju, doći će odmah

    do pobijanja metodom rezolucije i to će izgledati ovako:

    Kliknemo na Run:

  • Znači svaki put kad dođe do pobijanja metodom rezolucije, odgovor je true ili yes (zavisno od vrste

    Prologa).

    Ako bi u upitu napisali činjenicu koju nemamo u bazi, na primer:

    student(djordje, djukic, 27, 2, it).

    tada ne bi doško do pobijanja, jer iako se doda automatski negacija mne upit, i postoji suprotan predikat

    u bazi (među činjenicama), nisu svi argumenti jednaki!!! Znači do pobijanja dolazi samo kada uspeju svi

    argumenti da se ujednače (odnosno unifikuju).

  • Ako bi u upitu napisali:

    student(djordje, djukic, X, 2, it).

    gde je sa velikim slovom X označena promenljiva, onda bi se pri proveri argumenata pokrenuo algoritam

    unifikacije koji pokušava da ujednači argumente i onda bi rezultat unifikacije bio da je moguće

    ujednačavanje argumenata u slučaju kada X uzme vrednost 23. U tom slučaju dolazi do pobijanja

    metodom rezolucije, i pošto dolazi do pobijanja, Prolog štampa odgovor unifikacije:

    Može se napraviti komponovani upit (ako se zaboravi zagrada ili tačka na kraju upit se neće izvršiti):

  • Evo upita pomoću pravila:

    ?-izdvoj1(X,Y).

    Evo rezultata:

    A može se kombinovati i konstanta u upitu sa glavom pravila:

    ?- izdvoj2(X,petrovic).

    pa se dobija rezultat:

    Možete pokrenuti i ugrađene primere sa glavnog menija Examples/..

  • Na ispitu je 4. zadatak iz oblasti Knowledge bases, a 5 zadatak iz oblasti Lists i dolazi u obzir samo neki od

    ovih zadataka sa malim modifikacijama:

    1. poslednji element liste

    poslednji([X],X).

    poslednji([H|T],R):-poslednji(T,R).

    2. n-ti element liste

    nti([H|T],1,H).

    nti([H|T],N,R):-N1 is N-1, nti(T,N1,R).

    3. duzina liste

    duzina([],0).

    duzina([H|T],N1):-duzina(T,N),N1 is N+1.

  • 4. povezivanje listi

    povezi([], L, L).

    povezi([H1|T1], L2, [H1|T3]) :-povezi(T1, L2, T3).

    5. obrtanje liste

    obrni([],[]).

    obrni([H|T],R):-obrni(T,OT), povezi(OT,[H],R).

    povezi([], L, L).

    povezi([H1|T1], L2, [H1|T3]) :-povezi(T1, L2, T3).

    6. eliminacija uzastopnih duplikata

    dup([],[]).

    dup([H],[H]).

    dup([H1,H1|X],X1):-dup([H1|X],X1).

    dup([H1,H2|X],[H1|X1]):-dup([H2|X],X1).

    7. traženje podliste

    povezi([], L, L).

    povezi([H1|T1], L2, [H1|T3]) :-povezi(T1, L2, T3).

    podlista(L1, L) :-povezi(_, X, L),povezi(L1, _, X).

    8. obrisati traženi element liste

    obrisi(X, [X|Ostali], Ostali).

    obrisi(X, [Y|Ostali], [Y|OstaliBezX]) :- obrisi(X, Ostali, OstaliBezX).