45
PROLOG ˇ Zeljko Vrba veljaˇ ca 2000.

PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

PROLOG

Zeljko Vrba veljaca 2000.

Page 2: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija
Page 3: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

1

Sadrzaj

Sadrzaj 1

Predgovor 2

Popis predikata 4

1 Uvod u Prolog 71.1 Jednostavan program 71.2 Formalna definicija Prologa 101.3 Liste 121.4 Operatori 161.5 Aritmeticke operacije 17

2 Neke tehnike programiranja 192.1 Prenosenje akumulatora 192.2 Optimizacija posljednjeg poziva 192.3 Upravljanje postupkom vracanja 192.4 Nepotpuno instanciranje objekata 222.5 Argumenti konteksta 23

3 Primjena Prologa 253.1 Pretrazivanje baze podataka 253.2 Problem osam kraljica 273.3 Problem slagalice 293.4 Ekspertni sustavi 32

4 Ugradeni predikati 364.1 Ispitivanje tipa izraza 364.2 Usporedba i unifikacija izraza 364.3 Kontrolni predikati 374.4 Ugradeni operatori 384.5 Aritmetika 394.6 Manipulacija listama 394.7 Skupovi 404.8 Sortiranje listi 414.9 Sva rjesenja 414.10 Baza podataka 42

Page 4: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

2

Predgovor

Ovaj dokument se moze smatrati vrlo kratkim uvodom u Prolog. Iako kratak, ipak pokriva i nekenapredne stvari, poput reza. Tekst je baziran na auditornim vjezbama kolegija “Inteligentni sustavi”koje je u akademskoj godini 1999./2000. odrzao Sinisa Segvic na Fakultetu elektrotehnike i racunarstvau Zagrebu. Neke stvari sam i sam dodao, poput metoda pretrazivanja ili pregleda ugradenih predikata(vrlo cesto sam bio svjedokom kako ljudi otkrivaju toplu vodu, umjesto da upotrijebe ugradeni predikat).Slijedi upozorenje (samo za FER-ovce):

Profesor dr. sc. Slobodan Ribaric, asistent Sinisa Segvic, Zavodza elektroniku, mikroelektroniku, racunalne i inteligentne sustave(ZEMRIS) kao niti Fakultet elektrotehnike i racunarstva (FER)nisu ni na kakav nacin sudjelovali u izradi ovog dokumenta. Ovajdokument je rezultat iskljucivo moje vlastite inicijative i zelje dabuducim generacijama FER-ovaca (kao i drugim zainteresirani-ma) olaksam svladavanje Prologa. Drugim rijecima, ako je iz ovogdokumenta izostavljeno nesto sto je obradeno na predavanjima,auditornim vjezbama ili labosima, ne znaci da se to ne mora znati.Nedostatak tog materijala u ovom dokumentu NIJE i NE MOZEbiti izgovor za neznanje na ispitu ili labosu.

Gotovo nijedan primjer koda nije isproban, pa ako ne radi. . . zao mi je, tough luck! Javite se mailom,ali jedino u slucaju da ste popravili kod tako da radi! Moja e-mail adresa je

[email protected]

Zasto bi netko htio nauciti Prolog? Nemam pojma. Kolegij na FER-u je ukljucivao i vjezbe na kojimasu se razni zadaci trebali rijesiti u Prologu. Medutim, svaki od tih zadataka je puno kompliciranije iteze rijesiti u Prologu nego u C-u. Da ne govorim da se kod sporije izvrsava, trosi vise memorije itd.U svakom slucaju, nakon napisanih cca. 600 linija koda i razno raznih programa, nisam se uvjerio uprednost Prologa nad C-om ili nekim drugim “klasicnim” jezikom. Stovise, nakon mukotrpnog rjesavanjau Prologu, odmah mi je pala na pamet vrlo jednostavna implementacija u C-u koju sam vrlo cestorealizirao u 2-5 puta kracem vremenu nego sto mi je trebalo da natjeram Prolog program da radi.Jedina prednost Prologa je sto su programi kratki. Ali isto tako i vrlo nerazumljivi.

Odjeljak 3.4 nije zanimljiv za siru javnost koja mozda zeli nauciti Prolog zato sto je to samo generalnadiskusija ekspertnih sustava. Pripadajuci kod je predugacak da bi bio ukljucen u ovaj dokument. Tajodlomak je ipak ukljucen radi kompletnosti za buduce generacije FERovaca koje ce se muciti Prologom.

Svi primjeri u ovom dokumentu radeni su za SWI Prolog. Relativno dobar (besplatan) Prolog uz vrlomalo bugova ali jedan koji jako zivcira: kad ga se na Unixu prvi put prekine iz beskonacne petlje sa ^C,na slijedece prekide uopce ne reagira. Drugi put iz beskonacne petlje mozete izaci samo sa ^\ ili killnaredbom shella. Ovaj Prolog preporucujem FER-ovcima jer se labosi rade upravo na SWI Prologu, aprogrami koje je asistent napisao koriste upravo one predikate koji se razlikuju u GNU i SWI Prologu(vidi dolje), pa bi bilo potrebno mijenjati source programa.

Odlicna besplatna implementacija Prologa je GNU Prolog. Odlican Prolog, nema gore spomenuti bug,kompajlira u native-code, dakle i vrlo brzo izvrsava programe. Jedina je mana sto neki predikati iz SWI

Page 5: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

3

Prologa fale, a neki se jednako zovu, ali imaju razlicitu semantiku. Osim toga ima ugraden i finite-domain solver. Ne znam puno o tome, ali primjeri su vrlo impresivni (vrlo malo pisanja za rjesavanjeprilicno slozenih problema). Ovu implementaciju Prologa preporucam svima.

Za kraj, ako zaista zelite nauciti Prolog, nabavite puno zivaca, odreknite se zivota za slijedeca dvamjeseca i pocnite rjesavati probleme. Dobar izvor problema koji prate ovaj tekst je slijedeci URL:

http://www.zemris.fer.hr/~ssegvic/prolog

Na kraju, copyright:

Ovaj tekst je C©2000 Zeljko Vrba i ovime ga stavljam na raspolaganjesvima bez naknade. Ovaj dokument se neograniceno smije distribuiratiu bilo kojem obliku (elektronickom ili papirnatom), uz uvjet da nije ni nakoji nacin promijenjen te da se distribucija ne naplacuje (dozvoljenaje nominalna naplata umnozavanja).Drugim rijecima, ukoliko vam je ovaj dokument netko prodao za cijenuvecu nego sto biste platili umnozavanje (fotokopiranje/disketa), tada steprevareni. U tom slucaju molim da me obavijestite na e-mail.

Page 6: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

4

Popis predikata

Ovaj popis predikata sadrzi sve predikate koji se koriste ili je dan njihov kod u ovom dokumentu. Ovdjesu ukljuceni i ugradeni predikati. Ukoliko je broj stranice boldan, tada se na toj stranici nalazi definicijapredikata. Na ostalim stranicama se nalaze programi u kojima se navedeni predikat koristi.

!/0 19, 20, 21, 21, 22, 24, 37->/2 37\+/1 30, 37\=/2 9\==/2 37</2 18<=/2 24=../2 38=/2 11, 22, 23, 37=\=/2 18, 22, 27, 28=:=/2 18=</2 18==/2 37>/2 18>=/2 18

aabolish/1 42append/3 30, 39arithmetic function/1 18assert/1 42asserta/1 42assertz/1 42atom/1 36

bbagof/3 41between/3 39bfs/4 30

ccall 30, 38call/1 38call with args 38consult/1 16current arithmetic function/1 17

ddatum/3 25delete/3 39dfs/4 30

djeca/1 26djeca/2 26djed/2 9dodaj/3 14dohodak/2 26duljina/3 18, 19dynamic/3 42dijete/1 26dijete/2 26

eelement/2 12, 28

ffail/0 21, 37findall/3 30, 41flatten/2 40

iime/2 26intersection/3 40is/2 17, 18, 19, 22, 23, 27is set/1 40

kkategorija/2 21keysort/2 41

llast/2 40length/2 40list to set/2 40

mmajka/1 26majka/2 9, 26member/2 30, 39memberchk/2 39merge/3 40merge set/2 41mnozi/3 23

Page 7: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

5

msort/2 41musko/1 9

nnapravi stablo/4 22ne napada/2 28ne napada/3 27nonvar/1 36not/1 21nth/3 40nth0/3 40nth1/3 40number/1 22, 36nzd/3 18

oobrisi/3 14, 15, 29op/3 16osoba/4 25otac/1 26otac/2 26

ppermutacija/2 15, 27permutation/2 39placa/2 26plus/3 39podlista/2 14pojednostavi sumu/2 22porodica/1 25postoji/1 26povezi/3 13, 14, 23predak/2 9predsort/3 41prefix/2 39prezime/2 26

rrepeat/0 37retract/1 42reverse/2 40rjesenje/1 27, 28rjesenje1/1 27rjesenje3/1 29roden/2 26roditelj 7rijesi/4 29

sselect/3 39sestra/2 9setof/3 41sort/2 41sort0/2 41spol/1 8sredi/1 28subset/2 41subtract/3 40succ/2 39suffix/2 40

ttrue/0 21, 37

uumetni/3 15, 15union/3 41

vvar/1 22, 36veliki/3 24

zzensko/1 9

Page 8: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

6

Page 9: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

7

1 Uvod u Prolog

1.1 Jednostavan program 71.1.1 Prosirivanje programa s pravilima 81.1.2 Rekurzivno definirana pravila 91.1.3 Znanje programa u Prologu 101.2 Formalna definicija Prologa 101.2.1 Tipovi podataka 101.2.1.1 Atomi i brojevi 101.2.1.2 Varijable 101.2.1.3 Strukture 101.2.2 Unifikacija 111.2.3 Deklarativno znanje programa 111.2.4 Proceduralno znanje programa 121.3 Liste 121.3.1 Operacije nad listama 121.3.1.1 Pripadnost 121.3.1.2 Povezivanje 131.3.1.3 Trazenje podliste 141.3.1.4 Dodavanje, brisanje i umetanje 141.3.1.5 Permutacije 151.4 Operatori 161.5 Aritmeticke operacije 171.5.1 Predikati usporedbe 18Dva osnovna pristupa pri projektiranju programske podrske za inteligentne sustave su proceduralnoi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2

Americki istrazivaci i industrija tradicionalno koriste LISP, a u Europi se koristi Prolog. U novijevrijeme Prolog je sve popularniji i u Americi pa se cini da se radi o jeziku izbora za podrucje AI.3

Odnos deklarativnog i proceduralnog programiranja moze se slikovito izreci na slijedeci nacin:Neka je problem koji treba rijesiti predstavljen labirintom, a izlaz iz labirinta je rjesenje problema.Proceduralni program bi tada odgovarao nizu uputa za kretanje po labirintu, a deklarativni programbi bio mapa labirinta.

Deklarativni programski jezici u sebi sadrzavaju mehanizme za obradu pa se programom specifi-cira sto se zeli postici, a ne kako do tog rezultata doci. Rezultat oba programa (proceduralnog ideklarativnog) je isti – put od ulaska u labirint do izlaska.

1.1 Jednostavan program

Prolog je programski jezik pogodan za simbolicku (nenumericku) obradu, a posebno za rjesavanjeproblema koji se mogu opisati objektima i relacijama medu njima (sto vodi na opis problemagrafom), kao na primjer cinjenica da je Kresimir Lucijin roditelj. Ta cinjenica se u Prologu mozepredstaviti slijedecim stavkom:

LISP = LISt Processing1

Prolog = PROgramming in LOGic2

AI = Artificial Intelligence; umjetna inteligencija3

Page 10: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

8

roditelj(kresimir, lucija).

Ovdje je roditelj ime relacije, a kresimir i lucija su atomi. Atomi pocinju malim slovom.

Porodicno stablo (vidi sliku 1.1) neke obitelji moze se opisati slijedecim programom (Program uPrologu se sastoji od cinjenica i pravila):

roditelj(kresimir, darko).roditelj(tereza, darko).roditelj(darko, vigor).roditelj(darko, goran).roditelj(vigor, ruzica).roditelj(vigor, suncana).

K T

L D

V G

R S

Slika 1.1 Porodicno stablo

Nakon unosa programa mogu se postavljati upiti,4 na primjer:

?- roditelj(X, ruzica).X = vigor

?- roditelj(kresimir, Y).?- roditelj(kresimir, X), roditelj(X, Y).?- roditelj(X, darko), roditelj(X, lucija).

Prvi upit pita tko su Kresimirova djeca, drugi upit daje odgovor tko je Kresimirov unuk, a treciupit pita da li su Darko i Lucija brat i sestra. U ovom primjeru su koristene varijable: imena kojapocinju velikim slovom su varijable.

U Prologu se relacije mogu definirati eksplicitnim navodenjem n-torki koje relaciju zadovoljavaju.Programiranje se odvija u fazama opisa problema i upita. U fazi upita postavljaju se pitanja oproblemu opisanom u fazi opisa.

Opis problema u Prologu (“program”) sastoji se od stavaka; svaki stavak se zakljucuje tockom(.). Argumenti relacija mogu biti atomi i varijable. Upiti se sastoje od vise ciljeva; ako su ciljeviodvojeni zarezom (,), upit je njihova konjunkcija (logicko I). Ako ima vise mogucih odgovora naupit, Prolog ih moze potraziti.

1.1.1 Prosirivanje programa s pravilima

Pravilima se na temelju postojecih relacija modeliraju nove. Svako pravilo pri tome definira jednuuzrocno-posljedicnu vezu. Na primjer, porodicno stablo (od prije) prosirujemo informacijom o spoluljudi:

?- je prompt Prologa4

Page 11: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

9

spol(kresimir, muski).spol(tereza, zenski).spol(lucija, zenski).

...

Na temelju relacije spol/25 mozemo definirati nove relacije musko/1 i zensko/1 slijedecim stavci-ma:

musko(X) :- spol(X, muski).zensko(X) :- spol(X, zenski).

Ovdje :- oznacava grananje (moze se citati kao “ako”). musko je posljedica (glava) stavke, a ciljdesno od :- je uzrok (tijelo) stavke. Svaki stavak ima glavu i tijelo. Glava stavka je modeliranarelacija (nova). Tijelo se sastoji od niza ciljeva (sintaksa im je ista kao i kod upita). Stavak mozebiti cinjenica ili pravilo. Cinjenice imaju samo glavu. Jos neki primjeri pravila:

majka(X, Y) :- zensko(X), roditelj(X, Y).djed(X, Z) :- musko(X), roditelj(X, Y), roditelj(Y, Z).

Stavci u izvornom programu mogu se proizvoljno formatirati, medutim, obicno se glava stavkapocinje pisati od 0. kolone, a pojedini dijelovi tijela se uvlace za nekoliko znakovnih mjesta:

sestra(X, Y) :-zensko(X),roditelj(Z, X), roditelj(Z, Y),\=(X, Y).

\= je relacija ugradena u Prolog; dvije varijable su u relaciji \= ako nisu vezane za isti objekt.

1.1.2 Rekurzivno definirana pravila

Rekurzija je temeljni pristup programiranju u Prologu. Kao primjer, modelirat cemo relacijupredak/2 na temelju relacije roditelj/2:

predak(X, Z) :-roditelj(X, Z).

predak(X, Z) :-roditelj(X, Y),predak(Y, Z).

Relacija predak/2 je definirana sa dva stavka i vrijedi ako je zadovoljen bilo koji od njih. Proce-duru cini vise stavaka koji definiraju jednu relaciju.

Apstrakcija relacija roditelj/2 i predak/2 je model opceg algoritma za pretrazivanje aciklickogusmjerenog grafa.

Tokom izvodenja programa Prolog istrazuje da li korisnikov upit sljedi iz cinjenica i pravila zadanihprogramom. Ako se u upitu javljaju varijable, Prolog ce potraziti takve objekte za koje bi upitslijedio iz programa.

Oznaka /2 govori da relacija prihvaca dva argumenta5

Page 12: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

10

1.1.3 Znanje programa u Prologu

Sasvim opcenito, programi sadrzavaju deklarativno i proceduralno znanje. Primjer deklarativnogznanja kod Prologa su definicije relacija, dok je proceduralno znanje sadrzano u algoritmima pre-trazivanja podatkovnih struktura kojima se relacije interno predstavljaju.

Osnovna karakteristika Prologa kao deklarativnog jezika je da se cesto moze programirati i bezspecificnog proceduralnog znanja. Dakle, za neke primjene je jednostavnije programirati u Pro-logu nego u nekom proceduralnom jeziku. Na zalost, samo deklarativno znanje nije dovoljno zarjesavanje nekih problema jer kod tih problema malo proceduralnog znanja puno utjece na efikas-nost programa.

1.2 Formalna definicija Prologa

1.2.1 Tipovi podataka

Prolog od tipova podataka razlikuje strukture i jednostavne objekte. Jednostavni objekti sepak dijele na varijable i konstante. Konstante mogu biti atomi i brojevi. Prolog tip podatkaraspoznaje po sintaksi (nema deklaracija).

1.2.1.1 Atomi i brojevi

Atomi mogu imati jedan od slijedeca tri oblika:

• Niz slova, brojeva i _ (underscore) koji pocinje malim slovom• Niz specijalnih znakova, npr. <--->, ..., =, ;• Niz znakova unutar jednostrukih navodnika (’), npr: ’Slovenija’ (ako je unutar literala, smije

zapoceti i velikim slovom ili _)

1.2.1.2 Varijable

Imena varijabli se sastoje od slova, brojeva i _, a obavezno zapocinju sa _ ili velikim slovom. Ukolikose varijabla u stavku javlja tocno jednom, moze se oznaciti specijalnom neimenovanom varijablom_. Ukoliko se neimenovana varijabla pojavi u upitu, Prolog pri odgovoru ne navodi njenu vrijednost.Leksicki doseg varijable je stavak.

Primjer upotrebe neimenovane varijable:

ima_dijete(X) :-roditelj(X, _).

1.2.1.3 Strukture

Strukture su objekti s vise komponenata, na primjer:

datum(1, svibanj, 1907)

Ovdje je datum ime strukture,6 a elementi u zagradi su komponente.

functor6

Page 13: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

11

datum

1 svibanj 1907

Slika 1.2 Struktura kao stablo

Opcenito, struktura je definirana imenom (ima sintaksu atoma) i brojem argumenata.7 Struk-ture se mogu dobro predstaviti stablom (vidi sliku 1.2).

1.2.2 Unifikacija

Unifikacija (prilagodenje) je temeljna operacija nad objektima. Dva izraza se mogu medusobnounificirati ako su:

• identicni• ako se varijablama koje se u izrazima javljaju mogu pridijeliti vrijednosti tako da izrazi postanu

identicni

Primjer:

?- datum(D, M, 1983) = datum(D1, svibanj, Y).D = D1 = _G283M = svibanjY = 1983

Druga linija pokazuje da su D i D1 svedene na neku istu internu varijablu. Vidimo da operator =ne odgovara samo da li se dva izraza mogu unificirati, vec tu unifikaciju i provede.

Postupak prilagodavanja dva objekta S i T se precizno moze opisati na slijedeci nacin:

• Ako su S i T konstante, prilagodavanje je moguce ukoliko su S i T identicni• Ako je S varijabla, a T proizvoljan objekt, tada je prilagodavanje moguce, a S postaje vezan s

vrijednoscu T• Ako su S i T strukture, unifikacija je moguca ako obje imaju isti funktor te se pojedine kompo-

nente daju unificirati

1.2.3 Deklarativno znanje programa

Program

P :-Q, R.

ima slijedecu deklarativnu interpretaciju: “P vrijedi ako vrijede Q i R” , ili alternativno, “iz Q iR slijedi P”. Formalno, deklarativno znanje za proizvoljnu tvrdnju govori da li iz programa slijedinjena istinitost.

Deklarativno znanje danog programa o nekom cilju G definirano je na slijedeci nacin: Cilj G logickislijedi iz programa ako i samo ako u programu postoji stavak C za ciji primjer I vrijedi da imaistu glavu kao i G i svi ciljevi tijela od C su istiniti.

arity7

Page 14: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

12

Primjer stavka8 C je stavak C’ u kojem je svaka varijabla zamijenjena s nekim izrazom.

Unifikacija je funkcija koja svakoj varijabli iz C pridruzuje izraz iz C’.

Niz ciljeva (upit) logicki slijedi iz programa ako postoji neki skup vrijednosti varijabli iz upita zakoji su svi ciljevi upita izracunljivi. Pri tome “,” oznacava konjunkciju. Disjunkcija se mozeopisati s vise stavaka ili s “;” izmedu dva dijela. Pri tome “,” ima veci prioritet od “;”.

1.2.4 Proceduralno znanje programa

Proceduralno znanje definira kako dolazi do odgovora na upit. Ono je postupak za izvodenje danogupita definiran programom. Imenujmo taj postupak execute. Slijedi formalni opis izvodenja pro-grama.

Neka upit cini niz ciljeva G1, . . . Gm.

1. [execute]: Ako je upit prazan, zavrsi s uspjehom2. [pretrazivanje]: Odozgo nadolje trazi stavak koji se moze unificirati s G1; neka je to stavak Sx3. Neka Sx ima oblik Sx ≡ H:- B1,...,Bn., S neka je unifikacija H i G1, a Sx’ primjer stavka

Sx dobiven unifikacijom S. Neka Sx’ ima oblik Sx’ ≡ H’ :- B1’,...,Bn’.4. Formira se novi upit B1’,...,Bn’,G2,...,Gm5. Rekurzivno pozovi [execute] s novim upitom6. Ako je izvrsavanje uspjelo, zavrsi uspjehom7. Inace, vrati se na [pretrazivanje], s tim da se pretrazuju stavci od Sx nadalje.

Napomena: povratak na [pretrazivanje] moze inicirati korisnik nakon uspjesnog zavrsetka pro-grama, ako zeli znati ima li jos koje rjesenje.

1.3 Liste

Lista je rekurzivno definirana struktura za pohranjivanje podataka koja je prirodena Prologu kaosto je polje prirodeno C-u, a cesto se koristi i za modeliranje skupova i operacija nad njima.

Lista opcenito moze biti prazna (oznaka: []) ili par [glava|rep] gdje je glava prvi element liste,a svi ostali elementi su sadrzani u listi rep. Radi jednostavnosti, lista se moze zapisati tako da jojse pobroje elementi. Tako su slijedeca tri zapisa ekvivalentna:

[l1 | [l2 | [l3 | [l4 | []]]]][l1, l2, l3, l4][l2, l2 | [l3, l4]]

Formalno, u Prologu se lista predstavlja kako dvoclana struktura sa funktorom “.” (tocka), pavrijedi [H|T] ≡ .(H, T). Prazna lista nema zapisa pomocu funktora, a [] ima sintaksu atoma.

1.3.1 Operacije nad listama

1.3.1.1 Pripadnost

Zelimo definirati predikat (relaciju) oblika element(X, L) koja vrijedi ako je objekt X clan liste L.Tako zelimo da od slijedecih upita:

instance8

Page 15: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

13

element(b, [a, b, c]).element([b, c], [a, [b, c]]).element(b, [a, [b, c]]).

prva dva uspiju, a treci ne. Rjesenje:

element(X, [X|_]). % uspije ako je X prvi u listielement(X, [_|Ostali) :-

element(X, Ostali).

Alternativno, mogli smo (duze) pisati i:

element(X, L) :-L = [X|_].

element(X, L) :-L = [_|Ostali], element(X, Ostali).

1.3.1.2 Povezivanje

Neka predikat ima oblik povezi(L1, L2, L3) i neka vrijedi ako se lista L3 moze dobiti povezivan-jem listi L1 i L2. Tako zelimo da od slijedecih upita:

povezi([a, b], [c, d], [a, b, c, d]).povezi([a, b], [c, d], [a, a, b, c, d]).

prvi uspije, a drugi ne.

Rjesenje gradimo tako da najprije ispitamo jednostavan slucaj koji zavrsava rekurziju (u 4. redu +treba shvatiti kao povezivanje listi).

% L1 = [] ==> L2 = L3 = Lpovezi([], L, L).

% L1 = [H1|T1] ==> L3 = [H1|T1+L2]povezi([H1|T1], L2, [H1|T3]) :-

povezi(T1, L2, T3).

Primjeri upotrebe predikata povezi/3:

?- povezi([a, [b, c], d], [a, [], b], L).L = [a, [b, c], d, a, [], b]

?- povezi(L1, L2, [a, b, c]).L1 = []L2 = [a, b, c]

L1 = [a]L2 = [b, c]...

Page 16: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

14

?- povezi(Prije, [svibanj|Poslije], [sijecanj, ..., prosinac]).Prije = [sijecanj, ..., travanj]Poslije = [lipanj, ..., prosinac]

?- povezi(_, [X, svibanj, Y], [sijecanj, ..., prosinac]).X = travanjY = lipanj

?- povezi(L, [z, z, z|_], [a, b, z, z, c, z, z, z, d, e]).L = [a, b, z, z, c]

Rezultat drugog upita su sve moguce liste L1 i L2 koje zadovoljavaju relaciju (tj. svojim povezi-vanjem daju listu [a, b, c]). Pretposljednji upit pokazuje odredivanje prethodnika i sljedbenika.Posljednji upit brise sve elemente liste koji se pojavljuju nakon trostrukog pojavljivanja elementaz.

1.3.1.3 Trazenje podliste

Zelimo definirati predikat podlista(P, L) koji vrijedi ako je lista P sadrzana u listi L. Tako prviupit vrijedi, a drugi ne:

podlista([c, d, e], [a, b, c, d, e, f]).podlista([c, e], [a, b, c, d, e, f]).

Program se ostvaruje jednostavno s dva poziva predikata povezi/3:

podlista(Podlista, Lista) :-povezi(_, Sufiks, Lista),povezi(Podlista, _, Sufiks).

1.3.1.4 Dodavanje, brisanje i umetanje

Novi element X se najlakse dodaje na pocetak liste L; novodobivena lista tada ima oblik [X|L].

dodaj(X, L, [X|L]).

Za brisanje elementa X zelimo predikat oblika obirisi(X, L, Nova); taj predikat uspije ako sebrisanjem elementa X iz liste L dobije lista Nova.

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

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

Primjeri upotrebe:

?- obrisi(a, [a, b, a, a], L).L = [b, a, a]L = [a, b, a]L = [a, b, a]

Page 17: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

15

?- obrisi(a, L, [1, 2, 3]).L = [a, 1, 2, 3]L = [1, a, 2, 3]L = [1, 2, a, 3]L = [1, 2, 3, a]

U prvom primjeru, drugi i treci odgovor su jednaki: prvi je rezultat brisanja drugog a, a treci jerezultat brisanja treceg a.

Drugi primjer je inspiracija za definiciju predikata umetni(X, L, Nova) koji umece element X naproizvoljno mjesto liste L, a rezultat unificira s listom Nova:

umetni(X, Lista, Nova) :-obrisi(X, Nova, Lista).

1.3.1.5 Permutacije

U nekim programima potrebno je generirati sve permutacije zadane liste. Definirajmo zato predikatpermutacija/2 koji vrijedi ako je lista iz drugog argumenta (arg2) permutacija liste iz prvogargumenta (arg1); na primjer (drugi upit daje ukupno 6 rezultata, koliko ima permutacija liste od3 elementa):

?- permutacija([a, b, c], [b, c, a]).Yes

?- permutacija([a, b, c], P).P = [a, b, c]P = [a, c, b]...

Kod implementacije razlikujemo dva slucaja:

• arg1 je []: permutacija prazne liste je prazna lista• arg1 ima oblik [Prvi|Ostali]: tada sve permutacije od arg1 dobijemo umetanjem elementa

Prvi na sve pozicije svih permutacija liste Ostali

% prvi slucajpermutacija([], []).

% drugi slucajpermutacija([Prvi|Ostali], P) :-

permutacija(Ostali, P1),umetni(Prvi, P1, P).

Napomena: treba razlikovati slijedeca dva upita:

?- permutacija([r, g, b], P).?- permutacija(P, [r, g, b]).

Prvi ce dati sve permutacije. Medutim, drugi ce se, nakon sto izlista sve permutacije, zaglaviti.Kazemo da predikat permutacija/2 ne podrzava obrazac instancijacije (engl. instantiation pat-tern) u kojem je prvi argument neinstancirana varijabla (ona koja nije vezana za neku konkretnuvrijednost).

Page 18: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

16

Zato nas predikat permutacija/2 dokumentiramo na slijedeci nacin:

permutacija(+Lista, ?Permutirana)

Ovdje “+” znaci da je argument ulazni: mora biti objekt ili vezana varijabla. “?” oznacava daargument moze biti i ulazni i izlazni (tj. nevezana varijabla). U ovoj notaciji se izlazni argumenti(oni koji moraju biti nevezane varijable) oznacavaju sa “-”, kao npr. -izlazni.

1.4 Operatori

Operatorski zapis izraza je uobicajen u matematici:

2*a + b*c+(*(2, a), *(b,c))

u ovom izrazu su + i * operatori, a 2, a, b i c su argumenti. U Prologu se ovaj izraz mozeprikazati i u standardnom obliku sa zagradama (formula u drugom redu: ovo je oblik strukturegdje su + * funktori).

Zbog bolje citljivosti Prolog dozvoljava i operatorski zapis strukturiranih objekata i predikata.Prologu se moze reci da operatorski zapis pojedinacnih funktora interpretira kao da su oni zadanistandardnim oblikom. Neki operatori su unaprijed definirani pa su prvi i drugi izraz za Prologekvivalentni (ako programer ne odredi drukcije).

Operatorski zapis funktora se omogucuje pozivom ugradenog predikata op/3:

:- op(600, xfx, ima).

Ovdje smo uveli i stavak bez glave: on se izvrsava prilikom ucitavanja programa (consult). 600 jeprioritet operatora, xfx je tip operatora, a “ima” je funktor. Nakon definicije operatora mozemopostavljati upite poput:

ima(marko, zir).

?- X ima Y.X = markoY = zir

?- ima(mirko, X) = Y ima loptu.X = loptuY = mirko

Omogucavanje operatorskog zapisa funktora utjece samo na dozvoljenu sintaksu pisanja programai nije povetano ni sa kakvom operacijom na podacima. Zato je omogucavanje operatorskog zapisaslicno pretprocesorskoj direktivi #define u C-u.9

Prioritet operatora je broj 1. . . 2000: veci broj oznacava veci prioritet u smislu da operator snajvecim prioritetom postaje glavni funktor izraza. Alternativno, moze se reci da operator s manjimprioritetom veze jace. Tako se npr. a+b*c interpretira kao +(a, *(b, c)) jer + ima veci prioritetod *.10

engl. “syntactic sugar”9

Dakle, ovo je obrnuto nego matematicki prioritet operatora: veci broj znaci manji prioritet u matematickom smislu.10

Page 19: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

17

Tip operatora moze biti xfx, xfy, yfx, fx, fy, xf, yf. Slovo f u oznaci tipa oznacava polozaj operatorau odnosu na argumente. Slovo x se interpretira tako da prioritet odgovarajuceg argumenta morabiti manji od prioriteta operatora, inace ce biti prijavljena sintaksna greska. Slovo y znaci daje prioritet odgovarajuceg operatora proizvoljan. Prioritet argumenta je 0, osim ako je argumentoperatorski izraz (tada je prioritet jednak prioritetu glavnog operatora). Izraz u zagradama takoderima prioritet 0. Posljednji primjer ovog poglavlja neformalno i jasno objasnjava razliku tipovaoperatora.

Primjer: xf i yf su postfiksni operatori, a fx i fy su prefiksni operatori.

:- op(600, xf, ^^). :- op(600, fx, ^^).[H|_]^^ :- H = b. ^^([H|_]) :- H = b.

?- [b, s]^^ ?- ^^[b, s].Yes. Yes.

Primjer: Izraz a-b-c obicno interpretiramo kao (a-b)-c, a ne kao a-(b-c). To Prologu mozemoreci tako da tip operatora - definiramo kao yfx. Time zabranjujemo interpretacije u kojima jedesni argument operatorski izraz istog prioriteta. Tako je jedino ispravno tumacenje: -(-(a, b),c) (prvi argument je y, a drugi argument je x).

Upotrebom operatora citljivost programa se moze povecati: pretpostavimo da u Prologu zelimozapiasti deMorganovo pravilo: AB ⇐⇒ A + B. Standardno, to mozemo uciniti na slijedeci nacin:

equivalence(not(and(A, B)), or(not(A), not(B))).

Upotrebom operatorskog zapisa izraz izgleda

~(A & B) <==> ~A v ~B

uz slijedece definicije operatora:

:- op(800, xfx, <==>).:- op(700, xfy, v).:- op(600, xfy, &).:- op(500, fy, ~).

Definicija ekvivalencije ne dozvoljava izraz poput: A <==> B <==> C. Dakle, xfx je definicija ne-asocijativnog operatora: u izrazima poput ovog, obavezna je upotreba zagrada.

Definicija za v i & ima tip xfy. To znaci da ce izraz poput A v B v C biti interpretiran kao Av (B v C). Dakle, tip xfy je definicija desno-asocijativnog operatora. Analogno, tip yfx oznacavalijevo-asocijativan operator.

1.5 Aritmeticke operacije

Prolog nije namijenjen za opisivanje matematickih postupaka. Zato je programska podrska za ar-itmeticke operacije u Prologu skromna. Kljucni predikat za aritmeticke operacije je is/2. Predikatis/2 vraca istinu ako mu se prvi argument moze unificirati s aritmetickom vrijednoscu drugog.Aritmeticka vrijednost izraza se pronalazi ugradenim procedurama koje su pridruzene aritmetickimfunktorima (+-*/ i ostali). Ugradeni operatori su definirani kao lijevo asocijativni (yfx). Ugradenipredikat current_arithmetic_function/1 vraca sve funktore za koje su aritmeticke funkcijedefinirane. Primjer:

Page 20: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

18

?- X = 1+2.X = 1+2

?- X is 1+2.X = 3

Skup funktora koje predikat is/2 moze izracunati se moze prosiriti ugradenim predikatomarithmetic\_function/1, npr:

:- arithmetic_function(kvadrat/1).kvadrat(X, Rez) :- Rez is X*X.

?- X is kvadrat(12).X = 144

1.5.1 Predikati usporedbe

Pored predikata is/2 aritmeticku vrijednost izraza odreduju i predikati usporedbe: >, <, >=, =<,=\= (razlicito) i =:= (jednako).11 To su dvomjesni predikati cije je vrijednost istinita ako su ar-itmeticke vrijednosti operanada u odgovarajucoj relaciji, npr: Programom je definirana realacijagodiste(Covjek, Godina), a zeljeli bismo pronaci sve ljude koji su rodeni izmedu 1950. i 1960.godine.

?- godiste(Ime, Godina),Godina >= 1950,Godina < 1960.

Racunanje najveceg zajednickog djelitelja (modificirani Euklidov algoritam; ne racunaju se ostacidirektno vec uzastopno oduzimanje):

nzd(X, X, X).nzd(X, Y, D) :-

X < Y,Y1 is Y-X,nzd(X, Y1, D).

nzd(X, Y, D) :-X > Y,nzd(Y, X, D).

Racunanje duljine liste:

duljina([], 0).duljina([_|Rep], D) :-

duljina(Rep, D1),D is D1+1.

Operator = je operator unifikacije, == testira jednakost atoma, is je aritmeticki jednako (pri racunanju vrijednosti),11

a =:= je aritmeticka jednakost.

Page 21: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

19

2 Neke tehnike programiranja

2.1 Prenosenje akumulatora 192.2 Optimizacija posljednjeg poziva 192.3 Upravljanje postupkom vracanja 192.3.1 Formalna definicija reza 202.3.2 Primjeri 212.3.2.1 Negacija 212.3.2.2 Razvrstavanje u klase 212.4 Nepotpuno instanciranje objekata 222.4.1 Pojednostavljivanje izraza 222.4.2 Povezivanje liste 222.5 Argumenti konteksta 23

2.1 Prenosenje akumulatora

U konvencionalnim jezicima (C, Pascal) procedure mogu imati parametre cije promjene se vide iu glavnom programu. U Prologu se takav poziv postize tehnikom koja se zove prenosenje pomocuakumulatora.

U toj tehnici predikat prima ulaznu vrijednost varijable u jednom argumentu (Pobrojac), a novuvrijednost veze s drugim argumentom (Ukupno), na primjeru za duljinu liste:

duljina(Lista, Duljina) :-d(Lista, 0, Duljina).

d([], Ukupno, Ukupno).d([_|T], Pobrojac, Ukupno) :-

Pobrojac1 is Pobrojac+1,d(T, Pobrojac1, Ukupno).

2.2 Optimizacija posljednjeg poziva

U toj tehnici optimizacije posljednji cilj u tijelu predikata se ne izvodi kao poziv procedure (call)vec kao obicno grananje (jump). Time se smanjuje potrebna velicina stoga za izvodenje programai povecava brzina izvodenja programa.

Drugi oblik predikata duljina/2 ima rekurzivni poziv kao posljednji cilj drugog stavka, pa seoptimizacijom posljednjeg poziva procedura moze provesti iteracijom umjesto rekurzijom.

2.3 Upravljanje postupkom vracanja

Kad Prolog prilikom izvodenja programa ne uspije razrijesiti upit, automatski se vraca na mjestoposljednjeg izbora i upit pokusava rijesiti na neki drugi nacin. Taj ugradeni mehanizam vracanjaje jedno od osnovnih svojstava Prologa. No, povremeno je zgodno imati mogucnost da izbjegnemovracanje preko nekih grana stabla izvodenja programa u Prologu.

Na primjer, definirajmo relaciju koja je zadana funkcijom:

Page 22: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

20

f(x) =

{ 0, x < 32, 3 ≤ x < 64, 6 ≤ x

Ovu relaciju ostvaruje slijedeci program:

f(X, 0) :- X < 3.f(X, 2) :- X >= 3, X < 6.f(X, 4) :- X >= 6.

Stablo izvodenja za upit f(1,Y), Y > 2 prikazano je na slici ??. Prvo i trece pravilo se medusobnoiskljucuju pa bismo htjeli da se, nakon sto je jednom razrijesen prvi stavak, stavci 2 i 3 uopce nepokusaju razrijesiti jer je to gubljenje vremena. Za takve namjene u Prologu postoji naredba !(rez). Nova definicija programa:

(S1) f(X, 0) :- X < 3, !.(S2) f(X, 2) :- X >= 3, X < 6, !.(S3) f(X, 4) :- X >= 6.

Primijetimo da tokom izvodenja S2 i S3 provjeravamo jedan nepotreban cilj. Ako je X < 3, rez upravilu ce onemoguciti upravljanje u slijedeci stavak. Zato pisemo najefikasniju verziju programa:

f(X, 0) :- X < 3, !.f(X, 2) :- X < 6, !.f(X, 4).

2.3.1 Formalna definicija reza

Neka polazni cilj bude cilj koji je u toku izvodenja prilagoden glavi stavka u kojem se nalazi rez.Ako cilj ! dode na red za izvodenje, on ce uspjeti, a pored toga ce se zabraniti vracanje u sve dotada pozvane ciljeve stavka (tj. one ciljeve koji se u definiciji stavka nalaze lijevo od reza).

Zadan je slijedeci program:

(P1) c :- p, q, r, !, s, t, u.(P2) c :- v.(P3) a :- b, c, d.

Prilikom izvodenja stavka P1 vracanje na pocetak je moguce samo iz ciljeva p, q i r. Jednom kad seniz predikata p, q, r razrijesi, nece se razmatrati nijedno razrjesavanje na drugi nacin. Koristenjepravila P2 ce u tom slucaju takoder biti onemoguceno, dok ce vracanje unutar ciljeva s, t, ubiti dozvoljeno (npr. ako t ne uspije). Rez utice samo na izvodenje predikata u cijoj se definicijinalazi. U zadanom primjeru, rez u pravilu P1 ne utjece na pravilo P3, pa se u tom pravilu vracanjenormalno odvija.

Rezom se cesto moze poboljsati efikasnost programa. Prologu se tako moze izricito reci da nepokusava razrijesiti alternative za koje je poznato da ne mogu uspjeti, ili jos gore, vode nabeskonacnu petlju.

Upotrebom reza mogu se izreci pravila koja se medusobno iskljucuju, poput klasicnog if P thenQ else R, na primjer:

f :- P, !, Q.f :- R.

Page 23: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

21

U tom smislu rez povecava izrazajnu moc Prologa. Medutim, unosenjem rezova mijenjaju se odnosideklarativnog i proceduralnog znanja programa. U programu bez rezova deklarativno znanje ovisiiskljucivo o sadrzaju stavaka, a ne i o njihovom redoslijedu. U programu sa rezovima, redoslijedstavaka bitno utjece na deklarativno znanje. Na, primjer:

p :- a, b.p :- c.

p :- c.p :- a,b.

Ova dva programa su ekvivalentna i izrazavaju logicku formulu (a ∧ b) ∨ c⇒ p.

Medutim, uvodenjem reza, dva programa se nakon promjene redoslijeda bitno razlikuju:

p :- a, !, b.p :- c.

p :- c.p :- a, !, b.

Prvi program ekvivalentan je formuli (a ∧ b) ∨ (a ∧ c)⇒ p. Medutim, drugi program ekvivalentanje formuli c ∨ (a ∧ b)⇒ p. Zato rez valja koristiti samo kad je nuzno potreban.

2.3.2 Primjeri

2.3.2.1 Negacija

Do sada je predikat not (\+) koristen u standardnom i operatorskom zapisu, ali bez razmatranjanjegove izvedbe. Predikat not se izvodi preko reza te specijalnih predikata fail i true. Vrijednostpredikata true je uvijek istina, dok predikat fail uvijek vraca neuspjeh.

not(P) :- P, !, fail ; true.

2.3.2.2 Razvrstavanje u klase

Zadatak je razvrstati igrace nekog teniskog kluba u kategorije na temelju susreta odrzanih jednenedjelje po slijedecem principu:

• kategorija borac – igraci koji su i dobili i izgubili bar po jedan susret• kategorija pobjednik – igraci koji su pobijedili u svim susretima• kategorija sportas – igraci koji su izgubili u svim susretima

Rezultati neka su opisani relacijom pobijedio(X, Y) koja oznacava da je X pobijedio Y.

pobijedio(ivo, tin). pobijedio(ana, ivo). pobijedio(eva, tin).

kategorija(X, borac) :-pobijedio(X, _),pobijedio(_, X), !.

kategorija(X, pobjednik) :-

Page 24: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

22

pobijedio(X, _), !.kategorija(X, sportas) :-

pobijedio(_, X).

Rez u prvom stavku je potreban jer bi tada svaki borac bio proglasen i pobjednikom zbog drugogstavka. Rez u drugom stavku je samo zbog efikasnosti kako se ne bi ispitivao treci stavak.

2.4 Nepotpuno instanciranje objekata

Lijepo svojstvo Prologa je i da podrzava objekte koji su samo djelomicno instancirani. Takviobjekti u svojoj strukturi sadrze varijable koje naknadno tokom izvrsavanja programa mogu bitiinstancirane, ili, sto je cesci slucaj, unificirane s novim, cesto instanciranim objektom. Da bi seto omogucilo, potrebno je uz ovakav djelomicno instancirani objekt pamtiti i sve neinstanciranevarijable koje se u njegovoj strukturi javljaju.

2.4.1 Pojednostavljivanje izraza

Na primjer, razmotrimo strukturu za pojednostavljivanje aritmetickih izraza. U ovoj jednostavnojverziji preocedura radi samo za izraze u kojima je jedina dozvoljena operacija zbrajanje, npr:3+a+b+5 daje 8+a+b. Aritmeticki izraz se u toj proceduri predstavlja stablom na cijem je jednomkraju neinstancirana varijabla zvana Rupa. Varijabla O ulazna suma, a N je izracunata suma brojevau danom izrazu.

pojednostavi_sumu(Suma, Jednostavna) :-napravi_stablo(Suma, Stablo:Rupa, O, N),N =\= 0, !, % if N != 0 thenRupa = N,Jednostavna = Stablo; % elsevar(Stablo), !, % if var(Stablo) thenJednostavna = 0; % elseStablo = Jednostavna + Rupa.

napravi_stablo(A+B, Stablo:Rupa, NO, N) :-!,napravi_stablo(B, Stablo:Rupa1, NO, N1),napravi_stablo(A, Rupa1:Rupa, N1, N).

napravi_stablo(C, Rupa:Rupa, NO, N) :-number(C), !,N is NO + C.

napravi_stablo(X, Rupa+X:Rupa, N, N).

2.4.2 Povezivanje liste

Dosada smo za povezivanje nizova koristili proceduru povezi/3 (vidi odjeljak 1.3.1.2). Razmot-rimo izvodenje te procedure:

Page 25: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

23

?- povezi([a, b, c], [d, e], L).povezi([a, b, c], [d, e], L).povezi([b, c], [d, e], L1) % L = [a|L1]povezi([c], [d, e], L2) % L1 = [b|L2]povezi([], [d, e], L3) % L2 = [c|L3]L3 = [d, e] % L3 = [d, e]

Vidimo da je slozenost O(n), dakle linearna.

Procedura se moze bitno poboljsati ako primijenimo alternativan prikaz listi. U tom prikazu listase prikazuje parom Lista i Rupa gdje je Lista lista koja zavrsava sa rupom koja je varijabla Rupa.Na, primjer, alternativni prikaz liste [1, 2, 3] bio bi

[1, 2, 3 | Rupa] : Rupa

Sada mozemo definirati povezivanje na mnogo efikasniji nacin:

povezi_a(Al:Ar, Bl:Br, Cl:Cr) :-Ar = Bl, Cl = Al, Cr = Br.

Ocito je da ova procedura ima konstantnu slozenost O(1).

2.5 Argumenti konteksta

Problemi koji se u konvencionalnim jezicima rjesavaju petljom, u Prologu se obicno izrazavajurekurzivnim predikatom. Lokalne varijable ciji doseg obuhvaca petlju proceduralnog jezika, u Pro-logu se moraju izvesti kao argumenti rekurzivnog predikata jer je leksicki doseg varijable u Prologujedan stavak.

Kao primjer razmatramo proceduru koja vektor iz prvog argumenta mnozi skalarom iz drugog, arezultat vraca u trecem argumentu. Rjesenje u C++:

#include <vector>

void mnozi(const vector<double>& x, double m, vector<double>& r){

int n = x.size();

r.resize(n);while(--n >= 0) {

r[n] = x[n]*m;}

}

Rjesenje u Prologu:

mnozi([], _, []).mnozi([X|X1], M, [R|R1]) :-

R is X*M,mnozi(X1, M, R1).

Ovakav zapis algoritma u Prologu se cini neefikasnim jer se parametar M beskorisno prenosi usvaki novi rekurzivni poziv. Medutim, postoji tehnika optimizacije koja moze utvrditi da je drugi

Page 26: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

24

argument predikata mnozi jednak u svim rekurzivnim pozivima, pa se u izvrsnom kodu M mozeizvesti kao staticka lokalna varijabla na razini predikata.

Konacno, ako prevodilac primijeni optimizaciju posljednjeg poziva, teoretski nema razloga daizvrsni kod procedure u Prologu bude sporiji od izvrsnog koda procedure u nekom konvencionalnomjeziku.

Opcenito, vrijedi slijedece pravilo: odsjecak konvencionalnog programa koji referencira N razlicitihvarijabli koje nisu lokalne za taj odsjecak moze se prevesti u predikat u Prologu sa N argumenatakoji se onda nazivaju argumenti konteksta. To pravilo je zgodno znati prilikom citanja programau Prologu: ako u nekoj proceduri postoje varijable koje se nepromijenjene javljaju kao argumentiu pozivima raznih predikata, njih valja smatrati varijablama koje nisu lokalne za tu proceduru.

Primjer: iz zadane liste brojeva treba odabrati one koji su veci od zadane granice:

veliki([], _, []).veliki([X|X1], Granica, Veliki) :-

X <= Granica, !,veliki(X1, Granica, Veliki).

veliki([X|X1], Granica, [X|JosVeliki]) :-veliki(X1, Granica, JosVeliki).

U standardnim jezicima predikat veliki bio bi izrazen petljom, dok bi varijabla Granica biladeklarirana prije te petlje.

Prilikom koristenja argumenata konteksta ponekad se javlja problem da ih je potrebno puno.U takvom slucaju standardno se koristi idiom u kojem su svi argumenti konteksta objedinjenizajednickom strukturom. Pojedinacnim argumentima se tada pristupa pomocnim predikatom kojiiz strukture vadi zeljenu vrijednost.

Page 27: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

25

3 Primjena Prologa

3.1 Pretrazivanje baze podataka 253.2 Problem osam kraljica 273.2.1 Prvi pristup 273.2.2 Drugi pristup 283.2.3 Treci pristup 283.2.4 Formalni opis problema 283.3 Problem slagalice 293.3.1 Metode pretrazivanja 293.3.2 Rjesenje problema 313.3.3 Drugi pristup 323.4 Ekspertni sustavi 323.4.1 Osnovna struktura ekspertnog sustava 323.4.2 Formalizam za prikaz znanja 333.4.3 Struktura programa 35U prvom dijelu vjezbi opisane su temeljne tehnike programiranja u Prologu: unifikacija, vracanje(backtracking), strukturiranje podataka i aritmetika. Primjenom tih tehnika u drugom dijelu vjezbice biti pokazana primjena Prologa na rjesavanju (nesto) slozenijih problema.

3.1 Pretrazivanje baze podataka

Programom u Prologu zelimo pristupati skupu objekata sa strukturom prikazanoj na slici 3.1.

porodica

osoba (muz) osoba (zena) [osoba, ...] (djeca)

osoba

ime prezime datum rodjenja posao

datum

dan mjesec godina

posao

poduzece dohodak

Slika 3.1 Elementi strukture porodica

Prirodni nacin predstavljanja baze podataka u Prologu je skup cinjenica. Svaku porodicu iz zeljenogskupa mozemo opisati jednim stavkom, na primjer:

porodica(osoba(jerko, duplencic, datum (1, svibanj, 1950),

posao(cementara, 4000)) -osoba(vesna, krstic, datum(23, rujan, 1947),

posao(kolodvor, 4000)) -[ osoba(suncana, duplencic, datum(31, listopad, 1971),

nezaposlen),osoba(darko, duplencic, datum(6, 11, 1975), nezaposlen)]

).

Prolog je posebno prikladan za asocijativni dohvat podataka, tj. kada zelimo dohvatiti objekt izskupa ne na temelju njegovog fizickog smjestaja u memoriji (pointer ili indeks) nego na temeljunjegovog djelomicno specificiranog sadrzaja.

Page 28: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

26

Na primjer, zelimo dohvatiti sve obitelji u kojima se majka i otac prezivaju Zoranic. Korisno jedefinirati pomocni predikat prezime/2:

prezime(osoba(_, Prezime, _, _), Prezime).?- porodica(P), P=(O-M-_),

prezime(O, zoranic), prezime(M, zoranic).

Imena i prezimena svih zena koje imaju troje ili vise djece:

ime(osoba(Ime, _, _, _), Ime).?- porodica(_-M-[_, _, _|_]), ime(M, Ime), prezime(M, Prezime).

U vecim programima stabilnost sustava se postize skrivanjem informacija. Jedan od vidova skri-vanja informacije je i apstrakcija podataka. Podatkovnom apstrakcijom osiguravamo da korisnikmoze (jos bolje — mora) pristupati podacima bez poznavanja detalja fizicke organizacije podata-ka u memoriji racunala. Time se postize mogucnost nezavisnog razvijanja struktura podataka iprocedura za njihovu obradu.

Na primjeru vec opisanih ime/2 i prezime/2, a u cilju apstrakcije podataka bilo bi korisno dodatii slijedece predikate:

otac(P, O) :- porodica(P), P=O-_-_.otac(O) :- otac(_, O).majka(P, M) :- porodica(P), P=_-M-_.majka(M) :- majka(_, M).djeca(P, Djeca) :- porodica(P), P=_-_-Djeca.djeca(Djeca) :- djeca(_, Djeca).dijete(P, D) :- djeca(P, Djeca), clan(D, Djeca).dijete(D) :- dijete(_, D).postoji(X) :- otac(X) ; majka(X) ; dijete(X).roden(osoba(_, _, D, _), D).placa(osoba(_, _, _, posao(_, P)), P).placa(osoba(_, _, _, nezaposlen), 0).dohodak([], 0).dohodak([Prvi|Ostali], Ukupno) :-

placa(Prvi, P),dohodak(Ostali, Po),Ukupno is P+Po.

Predikat dohodak/2 racuna dohodak liste osoba.

Koristeci pomocne procedure mozemo zadati slijedece upite: djeca mlada od 14 godina (prvi upit),ljudi stariji od 30 godina koji zaraduju manje od 3000 (drugi upit) ili porodicni dohodak za porodicuJerka Duplencica (treci upit):

?- dijete(X), roden(X, D), D=datum(_, _, G), G >= 1985.

?- postoji(X), roden(X, datum(_, _, G)), G =< 1969,placa(X, P), P < 3000.

?- porodica(P), otac(P, O), prezime(O, duplencic), ime(O, jerko),majka(P, M), djeca(P, D),dohodak([O, M | D], Dohodak).

Page 29: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

27

3.2 Problem osam kraljica

Opcenito, n kraljica u sahovskom polju dimenzija n× n treba rasporediti tako da se nijedne dvijekraljice medusobno ne napadaju. Skup svih razmjestaja je ogroman. Ima

(n2

n

)kombinacija koje

nije prakticno sve ispitati. Razliciti pristupi rjesavanju problema provjeravaju razlicite podskupovesvih rjesenja i zato imaju razlicite slozenosti.

3.2.1 Prvi pristup

Za svaki dozvoljeni polozaj vrijedi da se u svakom stupcu ploce nalazi tocno jedna kraljica. Rjesenjemozemo prikazati listom koordinata redaka kraljica uz konvenciju da koordinata stupca odgovarapolozaju kraljice u listi. Za primjer sa slike 3.2 lista je [2, 0, 3, 1].

0

0

1

1

2

2

3

3

4

4

5

5

6

6

7

7

Slika 3.2 Pocetakrasporedivanja kraljica

Skup svih rjesenja je podskup skupa svih permutacija liste s elementima od 0 do n − 1; ima ihukupno n!.

rjesenje(R) :-permutacija([0, 1, 2, 3, 4, 5, 6, 7], R),rjesenje1(R).

rjesenje1([]).rjesenje1([Prva|Ostale]) :-

rjesenje1(Ostale),ne_napada(Prva, Ostale, 1).

Prostor svih razmjestaja je smanjen na n! elemenata koje ispitujemo sekvencijalno predikatomrjesenje1. Predikat ne_napada(Kraljica, Lista, Udaljenost) vrijedi ako kraljica s koordi-natama (Kraljica, Stupac) ne napada neku od kraljica ciji su retci predstavljeni listom, a stupci suim: Stupac+Udaljenost, Stupac+Udaljenost+1,. . .Ovime smo osigurali ne napadanje po stupcimai retcima; ostaje jos dijagonalno:

ne_napada(_, [], _).ne_napada(Kraljica, [Prva|Ostale], Udaljenost) :-

Kraljica-Prva =\= Udaljenost, % napadanje po silaznoj dijagonaliPrva-Kraljica =\= Udaljenost, % uzlazna dijagonala

Page 30: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

28

Udaljenost1 is Udaljenost+1,ne_napada(Kraljica, Ostale, Udaljenost+1).

3.2.2 Drugi pristup

Polozaj cemo predstaviti listom n parova koordinata. Zadatak cemo rijesiti na klasican nacin:izdvojit cemo prvu kraljicu iz niza, provjeriti da se kraljice iz repa niza medusobno ne napadajui na kraju provjeriti da prva kraljica ne napada niti jednu kraljicu iz repa niza. Ponovo cemo seokoristiti cinjenicom da se u rjesenju problema nikoje dvije kraljice ne nalaze u istom retku. Urjesenju / koristimo za odvajanje koordinata.

sredi(R) :- R = [1/s1, 2/s2, 3/s3, 4/s4, 5/s5, 6/s6, 7/s7, 8/s8].

rjesenje([Red/Stupac|Ostale]) :-rjesenje(Ostale),element(Stupac, [1, 2, 3, 4, 5, 6, 7, 8]),ne_napada(Red/Stupac, Ostale).

ne_napada(R/S, [R1/S1|Ostale]) :-S =\= S1, % stupacS1-S =\= R1-R, % silazna dijagonalaS1-S =\= R-R1, % uzlazna dijagonalane_napada(R/S, Ostale).

Odgovor cemo dobiti upitom

?- sredi(R), rjesenje(R).

Treba naci sva rjesenja.

Drugi pristup je za male n puno bolji jer rjesenje gradi tako da novu kraljicu stavlja samo na poljaploce koja ne napadaju vec postavljene kraljice. Pri tome, na zalost, nema garancije da nadenoparcijalno rjesenje vodi do cilja. Zato se slozenost algoritma za trazenje rjesenja ne moze ogranicitipolinomom, iako se provjera rjesenja moze provesti u polinomnom vremenu.

3.2.3 Treci pristup

Ubrzana varijanta drugog pristupa: osnovna ideja je ubrzavanje zauzimanja polja pomocu tablice.Prilikom rjesavanja koristit ce se liste nepotrosenih redaka, stupaca, rastucih i padajucih dijagonala.Za svaku novu kraljicu koja se postavlja na plocu provjerit ce se da li se njeni redak, stupac idijagonale nalaze u spomenutim listama. Ako to nije slucaj, nova kraljica se nalazi na polozajumedusobnog napadanja s nekom od vec postavljenih kraljica pa razmjestaj nije valjan.

Pri rjesavanju se moze uzeti u obzir i cinjenica da je svaka rotacija ispravnog razmjestaja za 90o

takoder ispravan razmjestaj.

3.2.4 Formalni opis problema

Problem se moze formalno opisati na slijedeci nacin: treba naci osam legalnih cetvorki (i, j, u, v)tako da se ni za jedan clan ne upotrijebi dva puta ista vrijednost. Izvedba ce se temeljiti naproceduri rijesi:

Page 31: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

29

rijesi(Razmjestaj, Retci, Uzlazni, Silazni).

Retci je lista slobodnih redaka, Uzlazni i Silazni su liste slobodnih dijagonala.

rijesi([Redak/Stupac | JosKraljica], R, Du, Dv) :-obrisi(Redak, R, R1), U is Redak+Stupac,obrisi(U, Du, Dv, Du1), V is Redak+Stupac,obrisi(V, Du, Dv, Dv1),rijesi(JosKraljica, R1, Du1, Dv1).

rjesenje3(Razmjestaj) :-Razmjestaj = [_/1, _/2, _/3, _/4, _/5, _/6, _/7, _/8],Retci = [1, 2, 3, 4, 5, 6, 7, 8],Du = [-7, -6, ... , 6, 7],Dv = [2, 3, ... , 16],rijesi(Razmjestaj, Retci, Du, Dv).

3.3 Problem slagalice

Cilj ove igre (vidi sliku 3.3) je pomicanjem plocica dovesti slagalicu u zavrsno stanje. Posto-ji zgodan teorem o rjesivosti ovog problema; ali prvo se moramo upoznati s jednim svojstvompermutacija.

8 3 45 62 1 7

1 2 34 5 67 8

Slika 3.3 Pocetna pozicija i slozenaslagalica

Neka je a1a2 . . . an permutacija skupa 1, 2, . . . , n. Ako je i < j i ai > aj , tada se par (ai, aj)naziva inverzija permutacije; na primjer, permutacija (3142) ima tri inverzije: (3, 1), (3, 2) i (4, 2).Jedina permutacija bez inverzija je “sortirana” permutacija (12 . . . n). Ukoliko je broj inverzija upermutaciji paran, permutacija se naziva parna. Analogno definiramo neparnu permutaciju.

Sada se moze iskazati teorem o rjesivosti igre: Igra je rjesiva (opcenitije, jedna pozicija se mozeprevesti u drugu poziciju) ukoliko su obje pozicije, promatrane kao permutacije, iste parnosti.Permutaciju pozicije dobijemo tako da jednostavno ispisemo elemente po retcima, izostavljajuciprazno polje. Tako pocetnoj poziciji sa slike 3.3 odgovara permutacija (83456217), a slozenoj igriodgovara permutacija (12345678). Treba primijetiti da su obje permutacije iste parnosti (parne)te je stoga moguce sloziti pocetnu poziciju.

3.3.1 Metode pretrazivanja

Za dani graf G, pocetni cvor s i predikat cilj (koji definira ciljne cvorove), problem pretrazivanjase sastoji u odredivanju puta od s do t u G tako da vrijedi cilj(t). Vecina algoritama prilikompretrazivanja odrzava dvije liste: lista OTVORENI sadrzi cvorove do kojih je postupak dosao, doklista ZATVORENI sadrzi vec ispitane cvorove. Algoritmi imaju slijedecu temeljnu strukturu:

Page 32: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

30

trazi(graf G, cvor Pocetni, predikat Cilj)OTVORENI := {Pocetni}ZATVORENI := {}pronasao := 0dok (OTVORENI nije prazna) i (pronasao == 0) radi

prebaci cvor N iz OTVORENI u ZATVORENIako cilj(N) onda

pronasao := 1inace

nadji susjede od N u G koji nisu u listama OTVORENIi ZATVORENI i dodaj ih u listu OTVORENI

ako pronasao == 1 ondavrati N

inaceneuspjeh

Cesto se jos dodatno trazi da nakon uspjesnog pretrazivanja algoritam vrati i put kojim je pronadenciljni cvor – ovo se ostvaruje jednostavnom modifikacijom osnovnog algoritma. Postoje dvije os-novne strategije odabira slijedeceg cvora iz liste OTVORENI sto vodi na pretrazivanje u sirinu ipretrazivanje u dubinu. U nastavku su dana oba algoritma implementirana u Prologu. Karakteris-tika je pretrage u sirinu da uvijek nalazi najkraci put do rjesenja.

%%% Pretraga u dubinu (dfs, Depth First Search)% dfs(+Arc, +Start, +Goal, -Solution)% Arc je predikat koji vraca susjede nekog cvora.% Start je pocetni cvor, Goal je predikat koji ispituje da li je cvor ciljni.% Sol je put do rjesenja.%%dfs(Arc, Start, Goal, Sol) :-

dfs1(Arc, [[Start]], [], Goal, Sol).

%%% Ovo je stvarna procedura. Drugi argument je% stack OTVORENI, a treci je lista ZATVORENI.%%dfs1(_, [[Node|Path]|_], _, Goal, [Node|Path]) :-

call(Goal, Node).

dfs1(Arc, [[Node|Path]|MoreOPEN], CLOSED, Goal, Sol) :-% nadji sve susjede od prvog OTVORENOG cvora i% dodaj trenutni put na svakog od njih.findall([Next,Node|Path],

(call(Arc, Node, Next),\+ member([Next|_], [[Node|Path]|MoreOPEN]),\+ member(Next, CLOSED)),NewPaths),

% stavi nove puteve na VRH STACKAappend(NewPaths, MoreOPEN, NewOPEN),

Page 33: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

31

closing(Node),dfs1(Arc, NewOPEN, [Node|CLOSED], Goal, Sol).

%%% Pretraga u sirinu (bfs, Breadth First Search)% isto kao u dubinu, jedino sto se umjesto stacka koristi red (queue))%%bfs(Arc, Start, Goal, Sol) :-

bfs1(Arc, [[Start]], [], Goal, Sol).

bfs1(_, [[Node|Path]|_], _, Goal, [Node|Path]) :-call(Goal, Node).

bfs1(Arc, [[Node|Path]|MoreOPEN], CLOSED, Goal, Sol) :-findall([Next, Node, Path],

(call(Arc, Node, Next),\+ member([Next|_], [[Node|Path]|MoreOPEN]),\+ member(Next, CLOSED)),NewPaths),

% stavi nove puteve na KRAJ REDAappend(MoreOPEN, NewPaths, NewOPEN),closing(Node),bfs1(Arc, NewOPEN, [Node|CLOSED], Goal, Sol).

Predikat closing se poziva za svaki posjeceni cvor grafa i moze biti iskoristen za ispis redoslijedaposjecenih cvorova.

Osim ova dva osnovna “slijepa” algoritma, postoje i heuristicki algoritmi. Oni se temelje naracunanju heuristicke funkcije za svakog susjeda. Susjedi se stavljaju u listu OTVORENI takoda onaj koji ima najmanju vrijednost heuristicke funkcije bude prvi u listi OTVORENI. Tako ce senajprije posjecivati oni cvorovi sa najmanjom vrijednoscu heuristicke funkcije. Heuristicka funkcijase moze promatrati kao funkcija koja vraca pribliznu udaljenost nekog cvora do cilja. Jedan takavheuristicki algoritam je best-first-search.

3.3.2 Rjesenje problema

Problem slagalice se moze svesti na problem pretrazivanja: cvor u grafu je neka pozicija, a dvacvora su povezana ako se iz jedne pozicije moze prijeci u drugu nekim potezom. Iz razmatranja uuvodu proizlazi da je prostor stanja (broj cvorova grafa) ogroman: iznosi N !/2 gdje je N ukupanbroj polja na igri (npr. za 3× 3 slagalicu, N = 9).

Rjesenje u najmanjem broju poteza bi dala pretraga po sirini. Medutim zbog velicine prostorastanja, to trosi previse vremena i prostora: slijepa pretraga po sirini vec za 3× 3 slagalicu ne mozenaci rjesenje.12 Stoga je potrebno upotrijebiti neki heuristicki algoritam (koji gotovo sigurno necedati najkrace rjesenje, ali ce bar doci do njega).

Pri upotrebi heuristickog algoritma, trebamo izabrati heuristicku funkciju. Jedna jednostavnaheuristicka funkcija je ona koja vraca broj plocica koje nisu na svojem mjestu. Malo bolju heuristicku

Barem u Prolog implementaciji. Napisao sam program u C-u koji pretrazivanjem po sirini nalazi rjesenje u naj-12

manjem broju poteza u 1.5 sekundi. Zbog velicine prostora stanja vise ni u C-u nije moguce rijesiti 4× 4 slagalicuslijepim pretrazivanjem.

Page 34: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

32

funkciju (ona koja daje rjesenje u manjem broju poteza) mozemo napraviti tako da broju elemenatakoji nisu na svojim mjestima dodamo i broj inverzija u permutaciji pozicije. Upotrebom bilo kojeod ove dvije heuristicke funkcije moguce je rijesiti 3 × 3 slagalicu, medutim nijedna nije dovoljnodobra za rjesavanje 4× 4 slagalice.

3.3.3 Drugi pristup

Zgodan put rjesenju je slaganje po slojevima, koji je prikladan samo za kvadratne slagalice n× n.Prvo slazemo tako da su svi elementi prvog retka i prvog stupca na svojim mjestima. Kad smo tonapravili, sveli smo problem na rjesavanje (n−1)×(n−1) slagalice. Pri rjesavanju manje slagalice,ne moramo dirati elemente koji su vec na svojim mjestima.

8 21 13 17 414 23 19 153 7 11 2 1812 10 16 1 206 5 24 9 22

1 2 3 4 56111621

1 2 3 4 56 7 8 9 1011 1216 1721 22

Slika 3.4 Slaganje po slojevima

Slika 3.4 daje pocetno stanje 5 × 5 slagalice, te prvih par koraka rjesavanja po slojevima. Svaneoznacena polja oznacavaju bilo koju konfiguraciju plocica koja ostaje nakon slaganja nekogsloja (medu njima se negdje nalazi i stvarno prazno polje). Preostalu 3× 3 slagalicu slozimo npr.heuristikom.

3.4 Ekspertni sustavi

Temeljne operacije koje obavljaju ekspertni sustavi su rjesavanje problema iz nekog uskog po-drucja, obrazlozenje rjesenja (poput zivih strucnjaka, ekspertni sustav mora moci pojasniti svojeodluke i zakljucke), dijalog s korisnikom (postupak rjesavanja se mora moci odvijati i interak-tivno tako da korisnik moze utjecati na tok procesa rjesavanja problema) te rad s nepotpunim inedeterministickim znanjem.

3.4.1 Osnovna struktura ekspertnog sustava

Sasvim opcenito, ekspertni sustav se moze podijeliti na tri modula:

• baza znanjaSadrzi specificna znanja o podrucju primjene (domeni) ekspertnog sustava. Ona moze sadrza-vati cinjenice, pravila i metode za rjesavanje problema iz domene.

• mehanizam zakljucivanjaPronalazi rjesenje problema koji je zadao korisnik na temelju znanja iz baze znanja.

• korisnicko suceljeOmogucava korisniku uvid u postupak zakljucivanja i prosirivanje baze znanja. Cesto se meh-anizam zakljucivanja i korisnicko sucelje naziva ljuskom ekspertnog sustava.

Tako se sugerira da se ekspertni sustav sastoji od znanja o domeni i algoritma za baratanje timznanjem (mehanizam zakljucivanja i korisnicko sucelje). Prednost takve podjele je u tome sto jeljuska nacelno neovisna o domeni. Tako se jedna te ista ljuska moze koristiti u razlicitim ekspertnim

Page 35: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

33

sustavima u komunikaciji sa razlicitim bazama znanja. Naravno, tada sve baze znanja moraju bitiizvedene u skladu s formalizmom kojeg opisuje ljuska (u praksi tesko).

Opci plan razvoja ljuske ekspertnog sustava mogao bi biti slijedeci:

1. izbor formalizma za prikaz znanja2. razvoj mehanizma zakljucivanja sukladno s odabranim formalizmom3. dodaci za dijalog s korisnikom4. dodaci za zakljucivanje na temelju deterministickog znanja

3.4.2 Formalizam za prikaz znanja

Uvrijezena je praksa da se znanje u ekspertnim sustavima prikazuje nizom tzv. produkcijskihpravila s if-then strukturom. Primjeri takvih pravila su:

• ako uvjet P, onda zakljucak Z• ako stanje A, onda akcija A• ako vrijede uvjeti U1 i U2, onda vrijedi i uvjet U3

Pokazuje se da takav prikaz znanja ima slijedeca lijepa svojstva:

• modularnost: svako pravilo predstavlja mali, relativno nezavisni dio znanja• prosirivost: baza znanja sa takvom strukturom se lako prosiruje novim pravilima• jednostavno odrzavanje kao posljedica modularnosti: pojedina pravila baze znanja mogu se

jednostavno mijenjati neovisno o ostalim pravilima• transparentnost: mogucnost obrazlozenja odluke, odnosno rjesenja. Ekspertni sustav cije se

znanje sastoji od if-then pravila moze odgovarati na dvije vrste upita: “kako si dosao do tihzakljucaka?” te “zasto ti taj podatak treba?”.

U nekim programskim domenama (npr. medicina) prevladavaju pojmovi stohasticke prirode (npr.povisena temperatura). Takav nedeterminizam se moze izraziti tako da se if-then pravila opisu do-datnim vjerojatnosnim pravilima. Na primjer, jedno pravilo iz ekspertnog sustava MYCIN (1976):

• Ako:1. infekcija je primarna bakteriemija2. uzorak je uzet steriliziranom opremom3. ulazno mjesto infekcije je probavni trakt

• Onda: postoji utemeljena sumnja (vjerojatnosti 0.7) da je uzrocnik infekcije bacil iz porodicebacteroides.

Iskustvo pokazuje da je za razvoj upotrebljivog ekspertnog sustava nuzno sudjelovanje strucnjakaza to podrucje. Prikupljanje znanja konzultiranjem strucnjaka te njegovo oblikovanje u skladu sazadanim formalizmom naziva se inzenjerstvom znanja.13 To je u pravilu vrlo slozen, opsezani zahtjevan zadatak, pa ce se u okviru ovih vjezbi razmatrati jednostavnja baza znjanja kojaomogucuje raspoznavanje zivotinja na temelju njihovih karakteristika.

Opci oblik pravila u ovoj bazi ce biti

ime_pravila :: if Uvjet then Zakljucak.

knowledge engineering13

Page 36: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

34

pri cemu se Uvjet moze sastojati od vise jednostavnih uvjeta koji su povezani operatorima and ior. Prednost Prologa u modeliranju takvih pravila je u tome sto definiranjem operatora ::, if,then, and i or takva pravila postaju legalni stavci Prologa. Na primjer:

rule1 ::if

Animal has hair orAnimal gives milk

thenAnimal isa mammal.

rule3 ::if

Animal isa mammal and(Animal eats meat orAnimal has pointedTeeth andAnimal has claws andAnimal has forwardPointingEyes)

thenAnimal isa carnivore.

rule5 ::if

Animal isa carnivore andAnimal has tawnyColour andAnimal has blackStripes

thenAnimal isa tiger.

Predlozena sintaksa pravila u bazi znanja je vrlo slicna sintaksi Prologa. Najjednostavniji nacinrada s tim pravilima bi stoga bio njihovo prepisivanje u sintaksu Prologa i naknadna primjenaPrologovog mehanizma zakljucivanja. Na primjer, pravilo 1 bi se u Prologu moglo zapisati:

Animal isa mammal :-Animal has hair;Animal gives milk.

Neka je Mirko tigar sa slijedecim osobinama: ima dlaku, velik je i lijen, te ima crne pruge. To bise u Prologu moglo zapisati na slijedeci nacin:

mirko has hair.mirko is lazy.mirko is big.mirko has blackStripes.mirko has tawnyColour.mirko eats meat.

Tada bi se mogli postaviti slijedeci upiti:

?- mirko isa leopard.No.

Page 37: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

35

?- mirko isa tiger.Yes.

Iako Prolog pravilno odgovara na upite i pri tome koristi bazu znanja zadanu if-then pravilima,program iz primjera se ne moze nazvati ekspertnim sustavom jer:

• Program ne mozemo pitati kako je dosao do zakljucka da je Mirko tigar (od Prologa ocekujemoodgovor da ili ne).

• Program ne mozemo pitati zasto nije zakljucio da je Mirko leopard.• Sve informacije o domeni je u sustav potrebno unijeti prije postavljanja upita. Tako korisnik

moze zadati nepotrebne podatke (velik, lijen), a moze zaboraviti bitne (npr. da Mirko jedemeso).

Stoga izradujemo ljusku ekspertnog sustava koja ce moci na temelju baze o zivotinjama s korisnikomvoditi slijedeci dijalog:

Question: mirko isa tiger.Is it true: mirko has hair? yes.Is it true: mirko eats meat? no.Is it true: mirko has claws? why.To investigate, by rule3, mirko is a carnivore....

Korisnik moze odgovoriti na dva nacina: tako da da trazenu informaciju (yes/no), ili tako da pitaekspertni sustav za sto mu je ta informacija potrebna (why). Korisnik odgovara pitanjem kada nijeshvatio pitanje ili kada trazenu informaciju nije jednostavno ili jeftino dobiti.

Pogled u mehanizam zakljucivanja mogli bismo dobiti i pracenjem izvodenja programa u Prologu(trace). Pracenje je, medutim, projektirano prvenstveno za dijagnosticiranje pogresaka u programu,pa bi njegova upotreba za uvid u mehanizam zakljucivanja bila nepotrebno komplicirana jer bikorisnik dobivao visak informacija. Kada ekspertni sustav konacno odredi odgovor na pocetni upitkorisnika, moze zanemariti kako je sustav dosao do rjesenja. Na takvo pitanje ekspertni sustavispisuje glavne korake zakljucivanja.

3.4.3 Struktura programa

Glavni objekti koji se javljaju u predlozenoj izvedbi ljuske ekspertnog sustava su:

• Put zakljucivanja u obliku od pocetnog upita do tekuceg upita: Razlog.• Od tekuceg upita do rjesenja: Cilj.• Na kraju dobivamo objekt Odgovor.

Glavne procedure ljuske ekspertnog sustava su:

• istrazi(+Cilj, +Razlog, -Odgovor) pronalazi rjesenje Odgovor na upit Cilj.• korisnik(+Cilj, +Razlog, -Odgovor) pita korisnika da li je cilj istinit. Po potrebi se odgo-

vara na korisnikovo pitanje “why” tako da se pokaze dosadasnji tijek zakljucivanja.• prikazi(Odgovor) prikazuje konacni rezultat zakljucivanja i po potrebi odgovara na korisnicko

pitanje kako na temelju objekta Odgovor (cijeli tijek zakljucivanja).• ekspert povezuje pojedine dijelove ekspertnog sustava.

Page 38: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

36

4 Ugradeni predikati

4.1 Ispitivanje tipa izraza 364.2 Usporedba i unifikacija izraza 364.3 Kontrolni predikati 374.4 Ugradeni operatori 384.5 Aritmetika 394.6 Manipulacija listama 394.7 Skupovi 404.8 Sortiranje listi 414.9 Sva rjesenja 414.10 Baza podataka 42Ovdje cu opisati najkorisnije predikate u Prologu. Kod opisa predikata, svaki argument ima prijeimena jedan od znakova +-?. + oznacava ulazni argument, - izlazni, a ? bilo ulazni, bilo izlazniargument. Ima jos dosta korisnih predikata (npr. ulaz i izlaz), ali ja sam ovdje opisao samo onekoji su bili korisni za izradu labosa iz Prologa.

Predikati su opisani za SWI Prolog. Razlike izmedu GNU i SWI Prologa su navedene. U manualuza GNU Prolog ce se naci drugi tip parametara nego sto je ovdje: tamo su vecinom svi parametrinavedeni kao ulazno-izlazni. Medutim, ja parametar ne smatram ulazno-izlaznim ako upotrebaizlaznog parametra zablokira proceduru kod vracanja. Stoga sam takve argumente dokumentiraokao ulazne.14

4.1 Ispitivanje tipa izraza

Prolog je u sustini slabo tipiziran jezik.15 Medutim, provjera tipa izraza ponekad dobro dode.

var(+Term)

Uspije ako je argument slobodna (nevezana) varijabla.

nonvar(+Term)

Uspije ako je argument nije slobodna varijabla.

number(+Term)

Uspije ako je argument vezan za broj (prirodni ili realni).

atom(+Term)

Uspije ako je argument vezan za atom.

4.2 Usporedba i unifikacija izraza

Izrazi16 su poredani u tzv. “standardni poredak”:

GNU Prolog ih navodi kao ulazno-izlazne zato sto upotreba bilo ulaznog, bilo izlaznog parametra ne napravi14

instantiation error (kao sto bi se desilo da se umjesto ulaznog parametra stavi izlazni ili obratno).weakly-typed15

Term16

Page 39: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

37

• varijable < atomi < stringovi• stara varijabla < nova varijabla17

• Atomi se usporeduju abecedno.• Stringovi se usporeduju abecedno.• Brojevi se usporeduju po vrijednosti. Cijeli i realni brojevi su ravnopravni.• Izrazi se prvo provjeravaju po funktoru (abecedno), zatim po broju argumenata te na kraju

rekurzivno po argumentima, pocevsi s lijevim.

+Term1 == +Term2

Uspije ako su argumenti ekvivalentni. Varijabla je identicna jedino dijeljenoj varijabli.

+Term1 \== Term2

Isto kao \+ Term1 == Term2.

+Term1 = +Term2

Unificira Term1 i Term2. Uspije ako unifikacija uspije. Ukoliko je jedan od argumenata varijabla,tada se ta varijabla veze za drugi argument.

4.3 Kontrolni predikati

fail

Nikad ne uspije.

true

Uvijek uspije.

repeat

Uvijek uspije. Stvara beskonacan broj tocaka izbora.

!

Rez. Odbaci tocke izbora od pozivajuceg predikata i svih ostalih predikata pozvanih nakon njega.Za detaljnije objasnjenje pogledati odjeljak 2.3.

+Condition -> +Action1 ; +Action2

Ovo je ekvivalent if then i if then else strukture u Prologu. Ukoliko nam ne treba else diotada izostavimo Action2. Ovo je citljivije nego da se ista struktura relizira rezom.

\+ +Goal

Uspije ako se Goal ne moze dokazati. Treba paziti da Goal nije neinstancirana varijabla.

Varijable se u stvari usporeduju prema svojim adresama. Varijable na globalnom stacku su uvijek < od varijabli na17

lokalnom stacku. Programi se ne trebaju oslanjati na red kojim su varijable sortirane.

Page 40: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

38

call(+Goal, +ExtraArg1, ...)

Pozove Goal uz dodatne argumente. Na, primjer call(plus(1), 2, X) ce pozvati plus/3 i unifi-cirati X sa 3. Ovo je korisno ako ime predikata prosljedujemo kao parametar drugom predikatu kojikasnije treba pozvati proslijedeni predikat. Ovaj predikat se u GNU Prologu naziva call with args.

call(+Goal)

Ovaj predikat jednostavno izvrsi Goal, te uspije ukoliko izvrseni cilj uspije. Ukoliko Goal sadrzirez, tada se taj rez ne propagira izvan Goal. Ovo je kontrolni predikat prema ISO standardu. AkoGoal ima neke parametre, tada se moze sastaviti pomocu =.. operatora.

4.4 Ugradeni operatori

Za detaljniji opis operatora pogledati odjeljak 1.4. Tablica 4.1 daje pregled ugradenih operatorazajedno sa tipom i prioritetom.

Prioritet Tip Operatori

1200 xfx --> :-

1200 fx :- ?-

1150 fx dynamic

1100 xfy ; |

1050 xfy ->

1000 xfy ,

954 xfy /

900 fy \+ not

900 fx ~

700 xfx < = =:= =< == =\= > >= \= \== is

600 xfy :

500 yfx + - /\ \/ xor

500 fx + - ? \

400 yfx * / // << >> mod rem

200 xfx **

200 xfy ^

Tablica 4.1 Ugradeni operatori

+nonvar =.. ?list -nonvar =.. +list

Term =.. List uspije ako je List lista cija je glava atom koji je glavni funktor izraza Term, a cijije rep lista argumenata od Term. Ovaj predikat se naziva “univ”. Na primjer:

Term = baz(foo(1))

Page 41: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

39

4.5 Aritmetika

Pored aritmetickih operatora, ima nekoliko korisnih predikata vezanih uz cijele brojeve.

between(+Low, +High, ?Value)

Low i High su cijeli brojevi uz High >= Low. Ako je Value cijeli broj, onda predikat uspije akoje Low =< Value =< High. Ako je Value varijabla, onda se Value uzastopno veze na sve cijelebrojeve u zadanom intervalu. Ovaj predikat ne postoji u GNU Prologu.

succ(?Int1, ?Int2)

Uspije ako je Int2 = Int1 + 1. Bar jedan argument mora biti instanciran cijeli broj. Ovaj predikatne postoji u GNU Prologu.

plus(?Int1, ?Int2, ?Int3)

Uspije ako je Int3 = Int1 + Int2. Bar dva od tri argumenta moraju biti instancirani cijeli brojevi.Ovaj predikat ne postoji u GNU Prologu.

4.6 Manipulacija listama

append(?List1, ?List2, ?List3)

Uspije ako se List3 moze unificirati sa rezultatom nadovezivanja prve dvije liste.

member(?Elem, ?List)

Uspije ako se Elem moze unificirati s nekim clanom liste.

memberchk(?Elem, ?List)

Ekvivalentan sa member/2, ali ne ostavlja tocku grananja.

delete(+List1, ?Elem, ?List2)

Brise sve elemente iz List1 koji se mogu unificirati sa Elem i unificira rezultat sa List2.

select(?List1, ?Elem, ?List2)

Bira element iz List1 koji se moze unificirati sa Elem. List2 se unificira sa listom koja preostajenakon brisanja izabranog elementa. Normalno se poziva kao +List1, -Elem, -List2, ali se mozekoristiti za umetanje elementa u listu sa -List1, +Elem, +List2. GNU Prolog predikat ima istusemantiku, ali razlicit raspored parametara: select(?Elem, ?List, ?List).

permutation(+List1, ?List2)

Uspije ako je List2 neka permutacija od List1. Ovaj predikat ne postoji u SWI Prologu.

prefix(?Prefix, ?List)

Uspije ako je Prefix neki prefiks liste List. Ovaj predikat ne postoji u SWI Prologu.

Page 42: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

40

suffix(?Suffix, ?List)

Uspije ako je Suffix neki sufiks liste List. Ovaj predikat ne postoji u SWI Prologu.

nth0(?Index, ?List, ?Elem)

Uspije ako se element liste na koji pokazuje Index unificira sa Elem. Indeksi pocinju od 0. Ovajpredikat ne postoji u GNU Prologu.

nth1(?Index, ?List, ?Elem)

Isto kao nth0/3, ali indeksi pocinju od 1. Ovaj predikat se u GNU Prologu zove nth.

last(?Elem, ?List)

Uspije ako se Elem moze unificirati sa zadnjim elementom liste. GNU Prolog ima obrnut redoslijedparametara: last(?List, ?Elem).

reverse(+List1, -List2)

Obrne redoslijed elemenata u List1 i unificira rezultat sa List2.

flatten(+List1, -List2)

Izravnava List1 i unificira rezultat sa List2. Ovaj predikat ne postoji u GNU Prologu.

length(?List, ?Int)

Uspije ako Int predstavlja broj elemenata u listi. Moze se koristiti za stvaranje liste koja sadrzisamo varijable.

merge(+List1, +List2, -List3)

List1 i List2 su liste poredane u standardan poredak izraza. List3 se unificira sa uredenom listomkoja sadrzi elemente iz obje liste. Duplikati se ne brisu. Ovaj predikat ne postoji u GNU Prologu.

4.7 Skupovi

Nijedan od ovih predikata ne postoji u GNU Prologu.

is set(+Set)

Uspije ako je Set prava lista bez duplikata.

list to set(+List, -Set)

Uspije ako Set sadrzi iste elemente kao List, ali bez duplikata.

intersection(+Set1, +Set2, -Set3)

Trazi presjek dva skupa. Ulazne liste koje predstavljaju skupove ne moraju biti uredene, ali nesmiju sadrzavati duplikate.

subtract(+Set, +Delete, -Result)

Brise sve elemente skupa Delete iz skupa Set i unificira rezultat sa Result.

Page 43: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

41

union(+Set1, +Set2, -Set3)

Unija dva skupa. Ulazne liste koje predstavljaju skupove ne moraju biti uredene, ali ne smijusadrzavati duplikate.

subset(+Subset, +Set)

Uspije ako su svi elementi skupa Subset takoder i elementi skupa Set.

merge set(+Set1, +Set2, -Set3)

Set1 i Set2 su sortirane liste bez duplikata. Set3 se unificira sa uredenom listom bez duplikatakoja sadrzi uniju elemenata prva dva skupa.

4.8 Sortiranje listi

sort(+List, -Sorted)

Uspije ako se Sorted moze unificirati sa listom koja sadrzi elemente List koji su sortirani ustandardan poredak izraza. Duplikati se brisu.

msort(+List, -Sorted)

Isto kao sort/2, ali ne brise duplikate. Ovaj predikat se u GNU Prologu naziva sort0.

keysort(+List, -Sorted)

List je lista parova Key-Value, tj. struktura kojima je funktor “-”. Sortira listu kao msort/2, aliusporeduje samo kljuceve (Key dio strukture). Sortiranje je stabilno.

predsort(+Pred, +List, -Sorted)

Sortira kao msort/2, ali za usporedbu dva elementa koristi predikat Pred. Ovaj predikat ne postojiu GNU Prologu.

4.9 Sva rjesenja

findall(+Var, +Goal, -Bag)

Stvara listu instanciranja koje varijabla Var poprima uzastopnim vracanjem na Goal i unificirarezultat sa Bag. Uspije sa praznom listom ako Goal nema rjesenja.

bagof(+Var, +Goal, -Bag)

Unificira Bag sa alternativama od Var. Ako Goal ima slobodne varijable osim onih koje dijeli sa Var,bagof ce se vracati preko svih izbora za te varijable, unificirajuci Bag sa odgovarajucim izborimaza Var. Konstrukcija Var^Goal govori da bagof ne veze varijablu Var u cilju Goal.

setof(+Var, +Goal, -Bag)

Kao bagof/3, ali koristi sort/2 da se dobije sortirana lista bez duplikata.

Page 44: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

42

4.10 Baza podataka

Da bi se na nekom predikatu mogli koristiti predikati iz ovog odjeljka, on mora biti deklariran kaodynamic, npr.

:- dynamic input/3

abolish(Predicate/Arity)

Brise sve stavke koji imaju funktor Predicate i broj argumenata Arity, npr: abolish(input/3).

retract(+Term)

Kad je Term atom ili izraz, unificira se sa prvom cinjenicom iz baze. Ta cinjenica ili stavak se briseiz baze.

asserta(+Term)

Umece cinjenicu ili stavak u bazu. Stavak se umece kao prvi stavak odgovarajuceg predikata.

assertz(+Term)

Kao asserta/3, ali se stavak umece kao zadnji.

assert(+Term)

Kao assertz/3.

Page 45: PROLOG - zvrba.netzvrba.net/downloads/prolog.pdfi deklarativno programiranje. Pri deklarativnom programiranju se koriste jezici LISP1 i Prolog.2 Ameriˇcki istraˇzivaˇci i industrija

43