Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
PROLOG(I DEO)
PROLOG (PROGRAMMING IN LOGIC)
Naziv PROLOG je skraćenica od englaskih reči
PRO(gramming) in LOG(ic).
Autor PROLOG-a je Francuz Alen Colmerauer.
Prva verzija je napravljena 1971. godine u
Marseju.
Postoji više verzija PROLOG-a (npr. mikro-
PROLOG, turbo-PROLOG, m-PROLOG, SWI-
PROLOG, itd.).
PRIMER. PROGRAM NA SWI-PROLOGU
PROLOG (PROGRAMMING IN LOGIC)
Relacioni – logički jezik. Koristi se za rešavanje problema koji se zasnivajuna objektima i relacijama između objekata.
Neprocedurni jezik. Nije bitan redosled naredbi, već semantika programa. Nema aritmetičku naredbu dodeljivanja vrednosti, ni goto naredbu.
Deklarativni (opisni, deskriptivni) jezik. Opisuje se ŠTA program treba dauradi, a ne KAKO da reši problem kao u konvencionalnim procedurnimjezicima (Pascal, FORTRAN, COBOL).
Predikatski račun prvog reda čini teorijsku osnovu PROLOG-a.
Automatizovano traţenje rešenja. Postupak traženja rešenja zasniva se napravilu rezolucije (SLDNF rezolucija) koje se primenjuje na Hornove sastavke.
Konačni neuspeh. Negacija se u većini vrsta jezika PROLOG tretira kaokonačni neuspeh.
Intenzivna primena rekurzije. Podržava primenu rekurzivnih pravila.
PROLOG (PROGRAMMING IN LOGIC)
Postupak traženja rešenja zasniva se na pravilu
rezolucije (Robinson 1965.) koje se primenjuje
na Hornove sastavke (disjunkte, klauzule).
Sastavci koji sadrže bar jedan pozitivan literal
zovu se Hornovi sastavci. Hornovi sastavci su
oblika:
Ako p1, p2, ... , pn onda c
što se zapisuje
c :- p1, p2, ... , pn.
Program na PROLOG-u je niz rečenica
(klauzula) od kojih se svaka završava tačkom.
VRSTE REČENICA
Vrste rečenica u PROLOG-u su:
1. Činjenice
2. Pravila
3. Ciljevi.
1. ČINJENICE
Činjenice ili fakta (jednostavne izjavne rečenice).
Ĉinjenicama se iskazuje da među entitetima,
predstavljenim pomoću argumenata važi relacija
(odnos) predstavljen datim predikatom:
predikat(Arg_1, ... , Arg_n).
Pravila za formiranje fakata:
1. Imena relacija i objekata pišu se rečima koje obavezno
počinju malim slovom.
2. Relacija se piše prva, a za njom se u zagradi pišu objekti
(argumenti) međusobno rastavljeni zarezima.
3. Tačka dolazi na kraju fakta.
2. PRAVILA
Pravila (uslovne rečenice). Pravila su oblika:
zaključak :- pretpostavke.
pri tome je zaključak jednostavan iskaz i zove se
glava pravila, a pretpostavke čine telo
pravila i sastoje se iz jednog ili više jednostavnih
iskaza i/ili negacija takvih iskaza. Iskazi koji
tvore pretostavke povezani su konjunktivno i/ili
disjunktivno.
3. CILJEVI
Ciljevi ili pitanja (upitne rečenice). Ciljevima se iniciraizračunavanje odgovora. Sistem pokušava zadovoljitipostavljeni cilj primenom znanja datih programom. Ciljevisu oblika:
? - elementi_cilja.
pri tome elementi_cilja predstavljaju konjunkcijejednostavnih iskaza i/ili negiranih jednostavnih iskaza.
Ciljevi su pravila bez glave, a činjenice su pravila bez tela.
Sve promenljive u klauzulama su univerzalnokvantifikovane.
SINTAKSA PROLOG - JEZIKA
Azbuku PROLOG-a (skup znakova) čine:
Velika slova: A, B, .... , Z
Mala slova: a, b, ... , z
Brojke: 0, 1, ... , 9
Posebni znaci: *, + , - , /, ?, ...
Term je sintaksno prihvatljiv niz znakova.Termi
se dele na:
Konstante,
Promenljive,
Strukture.
KONSTANTE
Konstante mogu biti:
Atomi. Atom je konačan niz znakova koji
zadovoljava jedan od uslova:
1. atom je niz slova, brojki i specijalnih znakova '_'
koji obavezno počinje malim slovom (a, ana, a_1, ...)
2. atom je niz posebnih znakova (=, **, !, :-, ... )
3. atom je niz znakova između navodnika
("A", "Ana","Ana Kon", "+z", ...)
Brojevi:
Celi brojevi (123, -123, ...)
Realni brojevi (135, 0.767, -0.98, ...)
PROMENLJIVE
Promenljive predstavljamo (imenujemo) nizomslova, brojki i posebnih znakova '_' koji počinjevelikim slovom ili posebnim znakom '_' (A, Ana, A1, A_1, _, _A, ...). Promenljive koje se u klauzuli javljajusamo jednom ne moraju se imenovati i zovu se anonimne promenljive, npr:
pobednik(X) :- pobedio(X,_,_).
znači da je neko nekoga nekad pobedio, pri čemu nijevažno koga i kada. Upotrebom anonimnihpromenljivih gubi se informacija o prirodiargumenata, a svako javljanje znaka za anonimnupromenljivu znači različitu promenljivu, pa je navedenoj klauzuli logički ekvivalentna:
pobednik(X) :- pobedio(X,Suparnik,Vreme).
STRUKTURE
Strukture su složeni termi koji se formirajuvezivanjem nekoliko jednosatvnih termova. Strukturu u jednu celinu vezuje funktor, koji je jednoznačno određen imenom i brojemargumenata, npr. razlikuje se p(a,b) od p(a(b)). Forma strukture:
funktor(Argument_1, ... , Argument_n).
pri tome je funktor atom, a argumenti sujednostavni ili složeni termi. Strukture se grafičkipredstavljaju pomoću stabla.
Primeri:
voli(marko,tenis).
radnik(jovan, rodjen(17,6,1960),programer).
Konstante i promenljive predstavljajujednostavne terme, a strukture složene.
OSNOVNI OPERATORI I PREDIKATI U
PROLOG-U:
, (and) Određuje konjunkciju ciljeva.
; (or) Određuje disjunkciju ciljeva.
:- (if) Razdvaja glavu od tela pravila.
! (cut) Operator odsecanja, rez. Cilj kojiuspeva kada se do njega dođe pri izvršavanjunadole, a propada kada se na njega naiđe pritraženju sa vraćanjem, pri čemu propada i ceopredikat u okviru kojeg se rez operator našao.
OSNOVNI OPERATORI I
PREDIKATI U PROLOG-U:
true Cilj koji uvek uspeva.
false Cilj koji uvek propada. Pogodan je
kada se želi traženje sa vraćanjem.
fail Ovaj predikat nikada ne uspeva i
primorava PROLOG-sistem na vraćanje sa
traženjem. Na taj način se mogu dobiti sva
željena rešenja.
read(P) Omogućava unošenje podataka.
write(P) Omogućava izdavanje podataka.
nl Prelazi u novi red prilikom izdavanja
podataka.
OSNOVNI OPERATORI I
PREDIKATI U PROLOG-U:
not(P) Ako P uspe tada not(P) propada, a
ako P propadne tada not(P) uspeva. Negacija u
PROLOG-u predstavlja konačan neuspeh.
Predikat not treba upotrebljavati u ciljevima kod
kojih su sve promenljive konkretizovane. Ako sve
promenljive nisu konkretizovane onda not
predikat treba upotrebiti u poslednjem potcilju
glavnog cilja.
OSNOVNI OPERATORI I
PREDIKATI U PROLOG-U:
Aritmetički operatori:
+ sabiranje,
- oduzimanje,
* množenje,
/ deljenje,
div celobrojno deljenje,
mod deljenje sa ostatkom.
Relacije:
= jednako,
< manje,
<= , =< manje ili jenako,
> veće,
>= , => veće ili jednako,
<> , >< različito.
NALAŢENJE REŠENJA U PROLOG-U
Primena metode rezolucije u PROLOG-sistemusastoji se u usaglašavanju postavljenog cilja (upita) sačinjenicama i pravilima izvođenja. Pri tome značajnuulogu igra unifikacija.
Postavljeni cilj PROLOG-sistem nastoji da ispuni u skladu sa bazom činjenica i pravila. Ako PROLOG-sistem uspe da ispuni cilj daje pozitivan odgovor (Yes ili True), a u suprotnom negativan (No ili False). Prvo se pokušava ispuniti prvi levi potcilj, pa ukolikoje to moguće sledeći potcilj iza njega, itd. Ako se desida se neki potcilj ne može ispuniti, PROLOG-sistemse vraća na prethodni potcilj i pokušava da ga ispuniza neke druge vrednosti. Ovaj postupak se nastavljasve dok ne budu iscrpljene sve mogućnosti. PROLOG-sistem pretraţuje stablo prema načelu prvo levo i u dubinu. Postupak traženja sa vraćanjem(backtracking) omogućava nalaženje svih rešenja.
NALAŢENJE REŠENJA U PROLOG-U
Najopštiji unifikator dva terma je supstitucija kojaujedinjuje ta dva terma tako da u njima ostane najvećimogući broj promenljivih.
Unifikacija je definisana na sledeći način:1. Dve strukture se mogu unificirati ako imaju iste funktore i svi
argumenti prve strukture mogu se unificirati saodgovarajućim argumentima druge strukture. Ako strukturasadrži podstrukture unifikacija je rekurzivna.
2. Ako su termi konstante one se mogu unifikovati ako i samoako su identične.
3. Ako je term T1 promenljiva, a term T2 proizvoljan term (promenljiva, konstanta ili struktura) unifikacija se možeizvršiti ako se promenljiva T1 ne javlja u termu T2. Uspešnomunifikacijom promenljiva T1 prima vrednost terma T2, čimetermi T1 i T2 postaju identični. Analogno važi i za slučaj kadaje T2 promenljiva, a T1 proizvoljan term, s tim što tadapromenljiva T2 prima vrednost terma T1.
Primeri:
1) p(X,Y,a) i p(X,Y,Z) se unificiraju za Z=a
2) prva(racunar,X,tastatura,Y) i
prva(Z,ekran,tastatura,stampac)
se unificiraju konkretizacijom promenljivih:
X=ekran Y=stampac Z=racunar
3) prva(racunar,X,tastatura,Y) i
prva(kompjuter,ekran,tastatura,Y)
se ne mogu unifikovati jer se komponente
(konstante) racunar i kompjuter ne mogu
izjednačiti.
NA SLEDEĆEM PRIMERU BIĆE PRIKAZANA MOGUĆNOST REŠAVANJA
JEDNOG TIPIĈNOG ZADATKA JEZIKA LOGIĈKOG PROGRAMIRANJA.
Neka baza znanja sadrži sledeće uslove:
Ako je osoba X1 muškarac i ako je osoba X1 roditelj Y1 dece, onda je osoba X1 otac Y1 dece.
Pera, Steva i Laza su muškarci.
Pera je roditelj jednog deteta.
Laza je roditelj troje dece.
Minja je roditelj dva deteta.
Odgovoriti na pitanja:
a. Koliko otac Z1 ima dece?
b. Da li je Minja otac dva deteta?
c. Da li je Minja roditelj dva deteta?
d. Koliko otac Pera ima dece?
e. Ko je otac troje dece?
Zadatak će biti rešen pomoću rezolucijske procedure pobijanja i to pomoću programskog jezika PROLOG.
Potrebno je izvršiti formalizaciju na jezikupredikatskog računa prvog reda navedenih uslova ipostavljenog pitanja. Podrazumeva se da supromenljive koje se javljaju u formulama univerzalnokvantifikovane.
Uvode se predikati:
otac(X1,Y1) sa značenjem da je osoba X1 otac Y1 dece
muskarac(X1) sa značenjem da je osoba X1 muškogpola i
roditelj(X1,Y1) sa značenjem da je osoba X1 roditeljY1 dece.
Prema tome uslovi se mogu zapisati kao:
muskarac(X1) roditelj(X1,Y1) otac(X1,Y1)
muskarac(Pera)
muskarac(Steva)
muskarac(Laza)
roditelj(Pera,1)
roditelj(Laza,3)
roditelj(Minja,2)
Prvi uslov predstavlja pravilo, a ostali činjenice.
Sledi formalizacija pitanja (treba utvrditi tačnost sledećihtvrđenja):
a. (Z1)(U1) otac(Z1,U1)
b. otac(Minja,2)
c. roditelj(Minja,2)
d. (U1) otac(Pera,U1)
e. (Z1) otac(Z1,3)
Pošto se dokaz vrši metodom opovrgavanja, pitanja je potrebno negirati, pa ona postaju:
a. otac(Z1,U1)
b. otac(Minja,2)
c. roditelj(Minja,2)
d. otac(Pera,U1)
e. otac(Z1,3)
Univerzalni kvantifikatori se ne moraju pisati.
Program na PROLOG-u koristi konstante; u ovom
slučaju imena osoba, koje se u PROLOG-u moraju
pisati malim slovima. Pitanje počinje simbolom ?-
koji se shvata kao "zar nije", 20. Simbol ?- na
početku pitanju može se tumačiti kao zamena za
simbol . Shodno izloženom, a u skladu sa
sintaksom PROLOG-jezika cilj se zapisuje kao:
a. ?-otac(Z1,U1).
b. ?-otac(minja,2).
c. ?-roditelj(minja,2).
d. ?-otac(pera,U1).
e. ?-otac(Z1,3).
PROLOG-program opisuje bazu znanja i zapisuje
se kao:
otac(X1,Y1):-muskarac(X1), roditelj(X1,Y1).
muskarac(pera).
muskarac(steva).
muskarac(laza).
roditelj(pera,1).
roditelj(laza,3).
roditelj(minja,2).
Na osnovu sledećeg programa (Turbo PROLOG ver. 2.0 kompanije Borland International, Inc.):
domains
os=symbol
br=integer
predicates
otac(os,br).
musko(os).
roditelj(os,br).
clauses
otac(X1,Y1):-musko(X1), roditelj(X1,Y1).
musko(pera).
musko(steva).
musko(laza).
roditelj(pera,1).
roditelj(laza,3).
roditelj(minja,2).
PROLOG-sistem na postavljeno pitanje (službena reč Goal:označava cilj i zamena je za ?- ):
a. Goal: otac(Z1,U1).
Daje sledeće odgovore:
Z1=pera, U1=1
Z1=laza, U1=3
2 Solutions
što se tumači da postoje dva odgovora (dva rešenja, na dvanačina se može dostići cilj) i da iz prvog odgovora sledi da je Pera otac jednog deteta, a iz drugog da je Laza otac trojedece.
b. Goal: otac(minja,2).
Daje sledeći odgovor:
False
što znači da je odgovor negativan: Minja nije otac dva deteta.
c. Goal: roditelj(minja,2).
Daje sledeći odgovor:
True
što znači da je odgovor potvrdan: Minja jeste roditelj dva deteta.
d. Goal: otac(pera,U1).
Daje sledeći odgovor:
U1=1
1 Solution
što znači da postoji samo jedan odgovor i on glasi: Pera je otacjednog deteta.
e. Goal: otac(Z1,3).
Daje sledeći odgovor:
Z1=laza
1 Solution
što znači da postoji samo jedan odgovor i on glasi: Laza je otactroje dece.
IZRAČUNAVANJE ODGOVORA -
REZOLVIRANJE
Specifičnost izvođenja u PROLOG-u, koje se zasniva naSLDNF rezoluciji prikazana je u sledećem primeru.
Program se sastoji od klauzula:
covek(lomonosov). (1)
covek(tolstoj). (2)
covek(sokrat). (3)
grk(sokrat). (4)
rus(lomonosov). (5)
rus(tolstoj). (6)
Na postavljeno pitanje "Da li postoji (u bazi) neko ko je čovek iRus?"
?-covek(X1), rus(X1). (7)
PROLOG-sistem daje odgovore:
X1=lomonosov
X1=tolstoj
2 Solutions
Klauzule programa i cilj su radi lakšeg praćenja izvođenjaobeleženi brojevima od 1 do 7. Ĉvorovi stabla predstavljajuciljne klauzule. Pored grana koje izlaze iz čvorova napisanesu unifikacije koje su u tim koracima izvođenja određene. Rimskim brojevima je obeležen redosled generisanjačvorova u stablu izvođenja. Pretraživanje je dubinsko. Ĉvor uspeha - prazan sastavak obeležen je sa & . Ĉvornema naslednika ukoliko primena koraka izvođenja nijemoguća i na stablu će biti obeležen kao čvor neuspeha.
Stablo izvođenja za ovaj program je sledećeg izgleda:
I ?- covek(X1), rus(X1)
/ lomonosov/X1 (2)| tolstoj/X1 (3)\ sokrat/X1
II ?-rus(lomonosov) IV ?-rus(tolstoj) VI čvor neuspeha
(5)/ (6) \
III & V &
Stablo izvođenja za ovaj program je sledećeg izgleda:
I ?- covek(X1), rus(X1)
/ lomonosov/X1 (2)| tolstoj/X1 (3)\ sokrat/X1
II ?-rus(lomonosov) IV ?-rus(tolstoj) VI čvor neuspeha
(5)/ (6) \
III & V &
U ovom programu, čije stablo izvođenja je prikazano na slici, za postavljeni cilj, tj. za njegovprvi potcilj i prvu odgovarajuću činjenicu ili glavupravila u programu (klauzula (1)), u prvom korakuje izvedena rezolventa, odnosno novi cilj: ?-rus(lomonosov) pri čemu je izvršena unifikacijalomonosov/X1.
Novi cilj rezolvira sa klauzulom (5) i kao rezultat dajeprazan sastavak, što znači da je glavni cilj zadovoljeni da je dobijen jedan odgovor. Zatim se pokušavaposlednji potcilj zadovoljiti još na neki način. Zato je potrebno vratiti se unazad (backtracking), restaurirati promenljive, restaurirati tadašnje stanje ipokušati rezolvirati tadašnju ciljnu klauzulu sasledećom klauzulom čija glava sadrži isti predikat kaoi poslednji predikat u ciljnoj klauzuli. U ovom primerudobija se početna ciljna klauzula: ?-covek(X1), rus(X1) koja sada rezolvira sa klauzulom (2) i kaorezultat daje novi cilj ?-rus(tolstoj), pri čemu je unifikator tolstoj/X1. Novi cilj se ispunjava, tj. dobijase prazan sastavak sa klauzulom (6) i to bi bio drugiodgovor sistema. Pokušaj vraćanja više ne možeuroditi plodom, tako da se na postavljeno pitanjedobijaju samo dva odgovora.
DEKLARATIVNA I PROCEDURNA
SEMANTIKA PROLOG JEZIKA
Svaka klauzula u PROLOG-u oblika:
A :- B1, B2, ... , Bn.
može se tumačiti na dva načina:
Deklarativno. Glava pravila A je tačna ako su B1 iB2 i ... i Bn tačni.
Procedurno. Da bi se dokazao cilj A moraju se dokazati potciljevi B1 i B2 i ... i Bn .
Deklarativna semantika određuje istinitosno značenjerečenice, a procedurna određuje način njenogizvođenja.
PROLOG-jezik ima deklarativni karakter i
omogućava korisniku da saopšti sistemu samo šta
treba da uradi, pomoću opisa uslova i ciljeva a ne
i kako, te ovaj jezik pripada klasi opisnih
(neprocedurnih) programskih jezika. Opisi ciljeva
i uslova predstavljaju program napisan na
PROLOG-jeziku. Način obrade ciljeva i uslova
prepušten je PROLOG-sistemu, koji ima
procedurni karakter i predstavlja mehanizam
izvođenja koji je nezavisan od ciljeva i uslova koje
treba zadovoljiti. Deduktivni sistem na osnovu
datih opisa izvodi odgovore i saopštava ih
korisniku. Od korisnika se ne zahteva da detaljno
poznaje procedurni deduktivni sistem.
Kod nalaženja odgovora redosled generisanja
čvorova u stablu izvođenja zavisi od redosleda
klauzula u programu. Klauzule u programu se
obrađuju po redosledu njihovog navođenja; odozgo
prema dole. Promenom redosleda klauzula u
programu došlo bi do generisanja drugačijeg
stabla pretraživanja. Redosled potciljeva takođe
dovodi do drugačijeg redosleda u generisanju
odgovora.
Ako se u bazi iz prethodno navedenog primera
promeni redosled činjenica, npr. ako su samo 1. i
2. činjenica uzajamno promenile mesta, dobija se
program:
covek(tolstoj). (1)
covek(lomonosov). (2)
covek(sokrat). (3)
grk(sokrat). (4)
rus(lomonosov). (5)
rus(tolstoj). (6)
Ovaj program je deklarativno ekvivalentan programuiz prethodnog primera.
No, na pitanje
?-covek(X1), rus(X1). (7)
sistem daje odgovore:
X1=tolstoj
X1=lomonosov
2 Solutions
Može se videti da je promenom redosleda činjenica u programu izmenjen i redosled dobijenih odgovora. Naime, u obe varijante programa dobijena su po dvaodgovora, ali su u prvoj varijanti programa dobijeniodgovori da su osobe koje zadovoljavaju zadatekriterijum Lomonosov i Tolstoj, a u drugoj varijantiprograma da su to Tolstoj i Lomonosov.
Stablo izvođenja za ovu, drugu varijantu programa je:
I ?- covek(X1), rus(X1)
(1)/ tolstoj/X1 (2)| lomonosov/X1 (3)\ sokrat/X1
II ?-rus(tolstoj) IV ?-rus(lomonosov) VI čvor neuspeha
(6) / (5) \
III & V &
Promena redosleda potciljeva u cilju takođe utiče
na izgled stabla izvođenja. Ukoliko se samo u
pitanju promeni redosled potciljeva:
?-rus(X1), covek(X1).
Sistem daje ponovo dva odgovora ali po sledećem
redosledu:
X1=lomonosov
X1=tolstoj
2 Solutions
Stablo izvođenja za ovu varijantu programa je:
I ?-rus(X1), covek(X1)
(5) / lomonosov/X1 (6) \ tolstoj/X1
II ?-covek(lomonosov) IV ?-covek(tolstoj)
(2) / (1) \
III & V &
Iz stabala pretraživanja, se vidi da je drugačiji redosledzadovoljavanja ciljeva u drugoj i trećoj varijati programa, što prouzrokuje i drugačiji redosled u saopštavanjuodgovora. Iako su odgovori dobijeni u trećoj varijantiprograma po redosledu identični odgovorima dobijenim u prvoj varijanti oni se procedurno razlikuju; njihova stablapretraživanja su drugačija. Sve tri izložene varijanteprograma su deklarativno ekvivalentne, a procedurnoneekvivalentne.