Uvod u Programski Jezik PROLOG..
Post on 01-Dec-2015
200 Views
Preview:
DESCRIPTION
Transcript
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
top related