Uvod u Programski Jezik PROLOG

Preview:

DESCRIPTION

Prolog

Citation preview

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)

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

PROLOG interpreter

SWI-prolog, razvijen na Swedish Institute of Computer Science

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

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

Činjenice

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

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

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).

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

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).

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?

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].

Komentari u PROLOG-u

U više linija

/* This is a comment

This is another comment */ U jednoj liniji

% This is also a comment

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]

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).

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

Backtracking, primjer 1

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

p(X)

[] [] []

X=a X=b X=c

interna reprezentacija za ne-instanciranu promjenljivu

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

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

Backtracking, primjer 3

Backtracking, primjer 3

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

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 ;

Backtracking i cut (!)

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

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).

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

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)

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

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).

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)

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}

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

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)

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 ;

Ugrađene funkcije

Unifikacija

Aritmetika

T1 = T2T1 \= T2

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

Primjeri

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

Primjeri

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)

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)

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