41
Uvod u programski jezik PROLOG

Uvod u Programski Jezik PROLOG

Embed Size (px)

DESCRIPTION

Prolog

Citation preview

Page 1: Uvod u Programski Jezik PROLOG

Uvod u programski jezik PROLOG

Page 2: Uvod u Programski Jezik PROLOG

Uvod

PROgramming in LOGic Nastao je 1972. godine Prvenstveno namijenjen za primjenu u AI

Dokazivači teorema Ekspretni sistemi NLP (natural language proccessing)

Page 3: Uvod u Programski Jezik PROLOG

Uvod

Ne-numeričko (simboličko) računanje Primjer: parent(tom, bob). parent je relacija između parametara: tom i

bob Sve zajedno se naziva rečenica ili klauzula Svaka klauzula predstavlja jednu činjenicu

vezano za relaciju

Page 4: Uvod u Programski Jezik PROLOG

PROLOG interpreter

SWI-prolog, razvijen na Swedish Institute of Computer Science

Page 5: Uvod u Programski Jezik PROLOG

PROLOG interpreter

Interpreter može da učitava PROLOG datoteke ili da izvršava upite

Izlaz iz interpretera: halt. PROLOG datoteke obično imaju

ekstenziju .pl

Page 6: Uvod u Programski Jezik PROLOG

Naredbe u PROLOG-u

Postoje tri kategorije komandi u PROLOG-u: Činjenice (facts): rečenice koje su uvijek tačne i

koje formiraju bazu znanja Pravila (rules): slična funkcijama iz proceduralnih

jezika; imaju if/then strukturu Upiti (queries): interpreter učitava upit i pristupa

bazi znanja; startovanje programa

Page 7: Uvod u Programski Jezik PROLOG

Činjenice

Činjenice su komande u jednoj liniji sa tačkom na kraju

father(terach,abraham).male(terach).

Page 8: Uvod u Programski Jezik PROLOG

Pravila

Pravila se sastoje od Uslovnog dijela ili tijela (desna strana) Zaključka ili glave (lijeva strana) Separator :- ima značenje IF

parent(Parent,Child):-father(Parent,Child).

parent(Parent,Child):-mother(Parent,Child).

uncle(Uncle,Person) :- brother(Uncle,Parent), parent(Parent,Person).

Page 9: Uvod u Programski Jezik PROLOG

Pravila

Promjenljive sa lijeve strane su kvantifikovane sa univerzalnim kvantifikatorom

Promjenljive koje su samo sa desne strane kvantifikovane su sa egzistencijalnim kvantifikatorom

Pravila vs. Činjenice Jednim imenom klauzule Činjenice su uvijek tačne Pravila definišu uslove pod kojima je nešto tačno

Page 10: Uvod u Programski Jezik PROLOG

Upiti

Interpreter pokušava da izvede upit koristeći činjenice i pravila iz baze znanja

Dvije vrste odgovora Yes/No: parent(tom, bob). Unifikacija/No: parent(X, bob).

Svi mogući odgovori se dobijaju sa ; dok ENTER prekida izvršavanje

?-parent(Parent,abraham).

Page 11: Uvod u Programski Jezik PROLOG

Upiti, primjeri

Q: Who is a grandparent of Jim? (using parent relationship) Prvo nađemo Jimovog roditelja, neka je to Y Nađemo roditelja od Y, neka je to X ?- parent (Y, jim) , parent (X, Y).

Q: Who are Tom’s grandchildren? Q: Are Ann and Pat siblings?

Page 12: Uvod u Programski Jezik PROLOG

Pokretanje programa

Činjenice i pravila se snimaju u jednu ili više datoteka i čine bazu znanja

Datoteke se učitavaju u interpreter Ako se kasnije ove datoteke mijenjaju moraju

se ponovo učitati Upiti se zadaju iza prompta ?- Učitavanje: [ime_datoteke].

Page 13: Uvod u Programski Jezik PROLOG

Komentari u PROLOG-u

U više linija

/* This is a comment

This is another comment */ U jednoj liniji

% This is also a comment

Page 14: Uvod u Programski Jezik PROLOG

PROLOG sintaksa

Termi Atomi su nizovi slova, cifara ili _ koji počinju sa

malim slovom ili stringovi karaktera između ’ Brojevi mogu da budu cijeli ili realni Promjenljive su stringovi slova, cifara ili _ koji

počinju sa velikim slovom ili _ Strukture su oblika f(t1, t2, ... tn)

f je atom i naziva se funktor t1, t2, ... tn su termi

Liste se predstavljaju sa [Head|Tail]

Page 15: Uvod u Programski Jezik PROLOG

PROLOG sintaksa

Oblast važenja atoma je cijeli program Oblast važenja promjenljive je klauzula u

kojoj se promjenljiva nalazi Specijalna promjenljiva _ Primjeri struktura

date(1, jan, 2010). date(Day, jan, 2010).

Page 16: Uvod u Programski Jezik PROLOG

PROLOG sintaksa

Konjunkcija , Disjunkcija ; Veći prioritet ima , Primjeri:

P :- Q , R ; S , T , U . P :- (Q , R) ; (S , T , U) .

P :- Q ; R.P :- QP :- R

Page 17: Uvod u Programski Jezik PROLOG

Backtracking, primjer 1

p(a).p(b).p(c).

p(X)

[] [] []

X=a X=b X=c

interna reprezentacija za ne-instanciranu promjenljivu

Page 18: Uvod u Programski Jezik PROLOG

Backtracking, primjer 2

p(a). q(1).p(b). q(2)p(c).

p(X),q(Y)

q(Y)X=a X=b X=c

[] []

Y=1 Y=2q(Y)

[] []

Y=1 Y=2

q(Y)

[] []

Y=1 Y=2

Page 19: Uvod u Programski Jezik PROLOG

Backtracking, primjer 3

parent(linda, simon). parent(sam, simon). parent(linda, sharon). parent(sam, sharon). female(sharon). sister(S,X) :- parent(P,S), parent(P,X), female(S). | ?- sister(Who, simon). Who = sharon; Who = sharon

Page 20: Uvod u Programski Jezik PROLOG

Backtracking, primjer 3

Page 21: Uvod u Programski Jezik PROLOG

Backtracking, primjer 3

Page 22: Uvod u Programski Jezik PROLOG

Backtracking i cut (!)

G G:-A....

A:-Bl,!,Br....A

Bl,!,Br cut siječe grane izA i Bl.

Traženje nastavlja odavdeako Br ne uspije

Page 23: Uvod u Programski Jezik PROLOG

Backtracking i cut (!), primjerp(a).p(b).p(c).q(1).q(2).

?-p(X),q(Y),!.X=aY=1?-p(X),!,q(Y).X=a, Y=1X=a, Y=2

?-!,p(X),q(Y).X = a, Y = 1 ;X = a, Y = 2 ;X = b, Y = 1 ;X = b, Y = 2 ;X = c, Y = 1 ;X = c, Y = 2 ;

Page 24: Uvod u Programski Jezik PROLOG

Backtracking i cut (!)

sister(S,X) :- parent(P,S), parent(P,X), female(S), !. % don't backtrack! | ?- sister(Who, simon). Who = sharon; no

Page 25: Uvod u Programski Jezik PROLOG

Rekurzija u PROLOG-u

Pravila u su kao funkcije u proceduralnim jezicima i mogu da budu rekurzivna

Primjer: relacija ancestor baza rekurzije: ancestor(X, Z) :- parent (X, Z). rekurzija: ancestor (X, Z) :- parent (X, Y) ,

ancestor (Y, Z).

Page 26: Uvod u Programski Jezik PROLOG

Računanje upita

PROLOG počinje od cilja (backward) Koristeći pravila, tekući cilj (koji se unifikuje sa

glavom nekog pravila) zamjenjuje sa podciljevima koji su u tijelu pravila, sve dok novi podciljevi ne budu činjenice iz baze

PROLOG vraća prvi odgovor koji zadovoljava cilj. Kada tekućom granom ne može da dokaže cilj ili

kada se pritisne ; PROLOG interpreter se vraća na prethodni čvor i pokušava sa nekim drugim pravilom

Page 27: Uvod u Programski Jezik PROLOG

Primjer

Baza

Pravila

Cilj: ancestor (tom, pat). Prvo navedeno pravilo se primjenjuje,

unifikacija {tom/X} , {pat/Z}, pa je sada cilj parent (tom, pat).

Fails, backtrack

parent (pam, bob). parent (tom, bob). parent (tom, liz).parent (bob, ann). parent (bob, pat). parent (pat, jim).

ancestor (X, Z) :- parent (X, Z).ancestor (X, Z) :- parent (X, Y) , ancestor (Y, Z)

Page 28: Uvod u Programski Jezik PROLOG

Primjer

Drugo pravilo ancestor (X, Z) :- parent (X, Y) , ancestor (Y, Z). unifikacija {tom/X} , {pat/Z}

Novi cilj parent (tom, Y) , ancestor (Y, pat) Podciljevi se rješavaju redosledom kojim su

navedeni Prvi podcilj je činjenica {bob/Y} Drugi podcilj je ancestor (bob, pat) Isti koraci kao i za originalni cilj

Page 29: Uvod u Programski Jezik PROLOG

Redosled ciljeva i klauzula

1. ancestor (X, Z) :- parent (X, Z).ancestor (X, Z) :- parent (X, Y) , ancestor (Y, Z).

2. ancestor (X, Z) :- parent (X, Y) , ancestor (Y, Z).ancestor (X, Z) :- parent (X, Z).

3. ancestor (X, Z) :- parent (X, Z).ancestor (X, Z) :- ancestor (Y, Z) , parent (X, Y).

4. ancestor (X, Z) :- ancestor (Y, Z) , parent (X, Y).ancestor (X, Z) :- parent (X, Z).

Page 30: Uvod u Programski Jezik PROLOG

Redosled ciljeva i klauzula

Varijante 1. i 2. su u redu Varijanta 3. u nekim slučajevim daje rješenje Varijanta 4. nikad ne završava (beskonačna

rekurzija)

Page 31: Uvod u Programski Jezik PROLOG

Unifikacija

t1 = t2 uspijeva ako t1 i t2 su identični postoji substitucija za promjenljive u t1 i t2 tako

da t1 = t2

f(X,b)=f(a,Y).

= {X/a, Y/b}

Page 32: Uvod u Programski Jezik PROLOG

Unifikacija, primjeri

?-X=1.X=1?- f(a,b)=f(a,b).yes?- a=b.no?- f(X,Y)=f(a,b)X=aY=b?-f(X,b)=f(a,Y).X=aY=b

Page 33: Uvod u Programski Jezik PROLOG

Unifikacija

unify(t1,t2) ako je t1 promjenljiva, onda t1/t2 ako je t2 promjenljiva, onda t2/t1 ako su t1 i t2 atomi

ako su t1 i t2 identični vrati T inače, vrati F

t1=f(a1,...,an) i t2=g(b1,...,bm) ako je f != g || m != n vrati F vrati unify(a1,b1) && ... && unify(an,bm)

Page 34: Uvod u Programski Jezik PROLOG

Unifikacija

Da li sledeće rečenice mogu da se unifikuju? Ako mogu, koja je substitucija?

point(A,B) = point(1,2).A = 1B = 2 ;

point(A,B) = point(X,Y,Z). plus(2,2) = 4. +(2,D) = +(E,2).

D = 2

E = 2 ;

tri(point(-1,0),P2,P3) = tri(P1,point(1,0),point(0,Y)). P2 = point(1, 0)

P3 = point(0, _G171)P1 = point(-1, 0)Y = _G171 ;

Page 35: Uvod u Programski Jezik PROLOG

Ugrađene funkcije

Unifikacija

Aritmetika

T1 = T2T1 \= T2

X is ExpExp =:= Exp, Exp =\= ExpExp >= Exp, Exp > ExpExp =< Exp, Exp < Exp

Page 36: Uvod u Programski Jezik PROLOG

Primjeri

Page 37: Uvod u Programski Jezik PROLOG

Ugrađene funkcije

arg(N,T,A) Nti argument od T je A

functor(T,F,N) funktor od T je F/N.

T1==T2 T1 i T2 su identični

T1 \== T2 T1 i T2 nijesu identični

Page 38: Uvod u Programski Jezik PROLOG

Primjeri

Page 39: Uvod u Programski Jezik PROLOG

Rekurzija, liste

Lista se predstavlja se [H|T] Implementirati sledeće predikate:

jeLista(Xs) car(Xs, X) cdr(Xs, Ys) cons(X, Xs, Ys) clan(X,Xs) spoji(Xs,Ys,Zs) duzina(Xs,N)

Page 40: Uvod u Programski Jezik PROLOG

Rekurzija, liste

Implementirati sledeće predikate: poslednji(X,Xs) prefiks(Pre,Xs,X) sufiks(Pos,Xs,X) okret(Xs,Ys) prefiks1(Pre,Xs) sufiks1(Pos,Xs) suma(Xs,N) suma1(Xs,Ys)

ako je Xs lista [x1,x2,...,xn], onda Ys je lista [y1,y2,...,yn] takva da yi je xi+1.

sortiraj(L,SortedL)

Page 41: Uvod u Programski Jezik PROLOG

Binarna stabla

Binarno stablo u PROLOG-u

Primjer

null -- prazno stablot(N,L,R) -- N : čvor

L : Lijevo podstabloR : Desno podstablo

t(a, t(b, null,null), t(c,null,null))

a

b c