Sunteți pe pagina 1din 32

Curs 5 Predicate predenite ale limbajului P ROLOG

31 octombrie 2012

Programare logica

Predicate de ordinul I s i II

Cu excep tia lui not/1 s i call/1, toate predicatele acum sunt bazate pe logica predenite prezentate pna predicatelor de ordinul I. Predicatele not/1 s i call/1 sunt predicate de ordinul II:
Un predicat de ordinul II ia un predicat de ordinul I (sau atom) ca argument.

n acest curs vor prezentate:


1 2 3

Predicate ce decid asupra caracterului unor argumente. Predicate de control al uxului de execu tie a programului. Predicate de ordinul II, numite uneori s i metapredicate.

Programare logica

Predicate de clasicare a termenilor


X este o variabila neinstan s var(X) reu se ste daca tiata i daca X este o variabila instan sau un termen e sueaza tiata sau structura). (constanta ?-var(5). false. ?-var(mihai). false. ?-var(X). true. X nu este o variabila instan nonvar(X) este adevarat daca tiata. Este opusul predicatului var(X) s i s-ar putea deni astfel: nonvar(X):-var(X),!,fail. nonvar(_).
Programare logica

Predicate de clasicare a termenilor (continuare)

X este o constanta simbolica s atom(X) reu se ste daca i n caz contrar. e sueaza ?-atom(coco). true. ?-atom(Ion Creanga). true. ?-atom(1). false ?-atom(X). false

X este un numar ntreg s integer(X) reu se ste daca i e sueaza n caz contrar.

Programare logica

Predicate de clasicare a termenilor


Aplica tie: Implementarea unui simplicator

se implementeze n P ROLOG un predicat Sa simplifica(Expr_Initiala,Expr_Simplificata) care o expresie ini reprezentata printr-o suma de transforma tiala variabile s i constante ntr-o expresie care con tine suma care reprezinta suma tuturor variabilelor plus o constanta constantelor din expresie. ?-simplifica(x+40+y+1+55+x+2,E). E=98+x+y+x.

Programare logica

Predicate de clasicare a termenilor


Aplica tie: Implementarea unui simplicator
simplifica(Expr_initiala,Expr_simplificata):simpl(Expr_initiala,0,Expr_simplificata). % Predicat ajutator simpl % simpl(Expr_initiala,Suma_Acumulata,Expr_simplificata). simpl(Expr+A,N,Expr1):integer(A),!, N1 is N+A, simpl(Expr,N1,Expr1). simpl(Expr+A,N,Expr1+A):atom(A),!, simpl(Expr,N,Expr1). simpl(Rest,N,N1):integer(Rest),!, N1 is Rest+N. simpl(Rest,0,Rest):-!. simpl(Rest,N,N+Rest).
Programare logica

Predicate de control
ntotdeauna. true reu se ste ntotdeauna, iar fail e sueaza

Programare logica

Predicate de control
ntotdeauna. true reu se ste ntotdeauna, iar fail e sueaza structurile repetitive din limbajele clasice de programare. repeat simuleaza repeat poate resatisfacut de ori cte ori este nevoie. repeat. repeat:-repeat.

Programare logica

Predicate de control
ntotdeauna. true reu se ste ntotdeauna, iar fail e sueaza structurile repetitive din limbajele clasice de programare. repeat simuleaza repeat poate resatisfacut de ori cte ori este nevoie. repeat. repeat:-repeat. ; este operatorul special de disjunc tie. ntrebare1 reu (ntrebare1 ; ntrebare2 ) reu se ste daca se ste sau ntrebare2 reu daca se ste. Exemplu de folosire a operatorului de disjunc tie % X este parintele lui Y daca X este tatal lui Y % sau daca X este mama lui Y. parinte(X,Y):-tata(X,Y);mama(X,Y). Alternativ, am putut scrie deni parinte/2 cu clauze. % X este parintele lui Y daca X este tatal lui Y parinte(X,Y):-tata(X,Y). % X este parintele lui Y daca X este mama lui Y parinte(X,Y):-mama(X,Y).

Programare logica

Predicate de control
Exemplu: Cum ar putea impementat for n P ROLOG?

% for(Variabila, ValoareInitiala, ValoareFinala, Pas). for(I,I,I,0). for(_,_,_,0):-!, fail. for(I,I,F,S):-S>0,(I>F, !, fail ; true). for(I,I,F,S):-S<0,(I<F, !, fail ; true). for(V,I,F,S):-I1 is I+S, for(V,I1,F,S). pentru valoarea urmatoare Fiecare apel prin backtracking al lui for se executa a variabilei I. Exemple de apeluri: ?-for(X,0,10,2), Y is X / 2. X = Y, Y = 0 ; X = 2, Y = 1 ; X = 4, Y = 2 ; X = 6, Y = 3 ; X = 8, Y = 4 ; X = 10, Y = 5 ; false.

Programare logica

Predicate de tratare a clauzelor drept termeni

Aceste predicate permit:


1

o clauza sau fapta n Construirea unei structuri care reprezinta baza de cuno stin te. Identicarea clauzelor s i a faptelor din program. Adaugarea s i eliminarea unor clauze s i fapte, reprezentate n baza de cuno printr-o structura, stin te a sistemului.

2 3

Programare logica

Predicate de tratare a clauzelor drept termeni


clause(Cap,Corp)
Cap cu capul unei reguli s ntrebarea clause(Cap,Corp) unica i Corp cu e un corpul unei reguli din program. La apelul acestui predicat, Cap trebuie sa termen de forma predicat(termen1 ,...,termenn ) unde n este aritatea aam clauzele. predicatului predicat pentru care vrem sa s clause(Cap,Corp) se unica i cu faptele din program. Pentru fapte, Corp se cu constanta true. instan tiaza Exemplu programul con liste: Presupunem ca tine deni tia predicatului de concatenare a doua %conc(Lista1,Lista2,ListaRezultat) conc([],L,L). conc([Prim|Rest1],Lista2,[Prim|Rest3]):-conc(Rest,Lista2,Rest3). ?-clause(conc(A,B,C),Corp). A = [], B = C, Corp = true ; A = [_G40|_G41], C = [_G40|_G44], Corp = conc(_G46, B, _G44).
Programare logica

Predicate de tratare a clauzelor drept termeni


Exemplu de utilizare a predicatului clause(Cap,Corp)
A sarea tuturor regulilor s i faptelor din program al caror cap se potrive ste cu Cap: % listc(Cap) afiseaza toate clauzele din program % care se unifica cu Cap listc(Cap):- clause(Cap,Corp), afiseaza(Cap,Corp), writeln(.),fail. listc(_). afiseaza(Cap,true):-!,write(Cap). afiseaza(Cap,Corp):-write(Cap),write(:-),write(Corp). ?- listc(conc(A,B,C)). conc([],_G202,_G202). conc([_G304|_G305],_G202,[_G304|_G308]):-conc(_G310,_G202,_G308). true.

Programare logica

Predicate de tratare a clauzelor drept termeni


Exemplu de utilizare a predicatului clause(Cap,Corp)
A sarea tuturor regulilor s i faptelor din program al caror cap se potrive ste cu Cap: % listc(Cap) afiseaza toate clauzele din program % care se unifica cu Cap listc(Cap):- clause(Cap,Corp), afiseaza(Cap,Corp), writeln(.),fail. listc(_). afiseaza(Cap,true):-!,write(Cap). afiseaza(Cap,Corp):-write(Cap),write(:-),write(Corp). ?- listc(conc(A,B,C)). conc([],_G202,_G202). conc([_G304|_G305],_G202,[_G304|_G308]):-conc(_G310,_G202,_G308). true. Observa tii

Programare logica

Predicate de tratare a clauzelor drept termeni


Exemplu de utilizare a predicatului clause(Cap,Corp)
A sarea tuturor regulilor s i faptelor din program al caror cap se potrive ste cu Cap: % listc(Cap) afiseaza toate clauzele din program % care se unifica cu Cap listc(Cap):- clause(Cap,Corp), afiseaza(Cap,Corp), writeln(.),fail. listc(_). afiseaza(Cap,true):-!,write(Cap). afiseaza(Cap,Corp):-write(Cap),write(:-),write(Corp). ?- listc(conc(A,B,C)). conc([],_G202,_G202). conc([_G304|_G305],_G202,[_G304|_G308]):-conc(_G310,_G202,_G308). true. Observa tii
1

ntotdeauna write(term) s i writeln(term) sunt predicate care se termina a cu success. Efectul lor este sa seze termenul dat ca argument.

Programare logica

Predicate de tratare a clauzelor drept termeni


Exemplu de utilizare a predicatului clause(Cap,Corp)
A sarea tuturor regulilor s i faptelor din program al caror cap se potrive ste cu Cap: % listc(Cap) afiseaza toate clauzele din program % care se unifica cu Cap listc(Cap):- clause(Cap,Corp), afiseaza(Cap,Corp), writeln(.),fail. listc(_). afiseaza(Cap,true):-!,write(Cap). afiseaza(Cap,Corp):-write(Cap),write(:-),write(Corp). ?- listc(conc(A,B,C)). conc([],_G202,_G202). conc([_G304|_G305],_G202,[_G304|_G308]):-conc(_G310,_G202,_G308). true. Observa tii
1

ntotdeauna write(term) s i writeln(term) sunt predicate care se termina a cu success. Efectul lor este sa seze termenul dat ca argument. P ROLOG redenume ste variabilele folosite n program.

Programare logica

Predicate de tratare a clauzelor drept termeni


asserta(Clauza), assertz(Clauza), assert(Clauza)

data s asserta(Clauza) reu se ste ntotdeauna s i singura i are ca efect lateral adaugarea clauzei Clauza la nceputui bazei de cuno stin te P ROLOG. assertz(Clauza) s i assert(Clauza) reu sesc ntotdeauna data s s i singura i are ca efect lateral adaugarea clauzei Clauza la sfr situl bazei de cuno stin te P ROLOG. reprezinte o clauza n toate cele 3 cazuri, Clauza trebuie sa P ROLOG. Adaugarea unei clauze prin asserta, assertz sau assert backtracking-ul nu le mai elimina! persista: adaugat va eliminata numai n urma unei cereri O clauza a explicite prin intermediul predicatului retract. (Vezi slide-ul urmator.)

Programare logica

Predicate de tratare a clauzelor drept termeni


retract(Clauza)

din baza de cuno sau retract(Clauza) elimina stin te o regula care se unica cu Clauza. fapta o astfel de regula sau fapta exista. Predicatul reu se ste daca o alta La ecare resatisfacere a predicatului se eliminina clauza. backtracking-ul nu le pune napoi! Eliminarea clauzelor persista: Exemple
adaug:-asserta(prezent(dan)),asserta(prezent(anca)). scot:-retract(prezent(dan)). ?-adaug, listc(prezent(X)). prezent(anca). prezent(dan). true. ?-scot, listc(prezent(X)). prezent(anca). true.
Programare logica

Predicate de tratare a clauzelor drept termeni


retractall(Cap)

toate clauzele din program al caror retractall(Cap) elimina cu Cap. cap se unica

Programare logica

Predicate de tratare a clauzelor drept termeni


retractall(Cap)

toate clauzele din program al caror retractall(Cap) elimina cu Cap. cap se unica o regula cu assert/retract, Observa tie: Cnd se adauga/elimin a ntre paranteze rotunde sau data ca o structura. regula trebuie pusa

Programare logica

Predicate de tratare a clauzelor drept termeni


retractall(Cap)

toate clauzele din program al caror retractall(Cap) elimina cu Cap. cap se unica o regula cu assert/retract, Observa tie: Cnd se adauga/elimin a ntre paranteze rotunde sau data ca o structura. regula trebuie pusa Exemple ?-assert((p(X):-X=1;X=2)). true. ?-listing(p). :-dynamic p/1. p(A) :- ( A=1 ; true.

A=2 ).

?-retract(:-(p(X),;(X=1,X=2))). true.
Programare logica

Predicate de tratare a clauzelor drept termeni


functor(Termen,Functor,n)
suntem n unul din urmatoarele functor(Termen,Functor,N) reu se ste doar daca cazuri: doua 1 Termen este un termen iar Functor s i N sunt variabile. n acest caz Functor este instan tiat cu functorul termenului Termen iar N este instan tiat cu aritatea Termen nu este o structura atunci N este instan termenului. Daca tiat cu 0. 2 Termen este o variabila neinstan Functor este un functor, iar N este un tiata, care coincide cu aritatea functorului Functor. n acest caz Termen este numar cu functorul s instan tiat cu o structura i numarul de argumente specicate. Argumentele structurii sunt variabile distincte.

Programare logica

Predicate de tratare a clauzelor drept termeni


functor(Termen,Functor,n)
suntem n unul din urmatoarele functor(Termen,Functor,N) reu se ste doar daca cazuri: doua 1 Termen este un termen iar Functor s i N sunt variabile. n acest caz Functor este instan tiat cu functorul termenului Termen iar N este instan tiat cu aritatea Termen nu este o structura atunci N este instan termenului. Daca tiat cu 0. 2 Termen este o variabila neinstan Functor este un functor, iar N este un tiata, care coincide cu aritatea functorului Functor. n acest caz Termen este numar cu functorul s instan tiat cu o structura i numarul de argumente specicate. Argumentele structurii sunt variabile distincte. Exemple ?-functor(auto(logan,culoare(rosie)),F,N). F=auto,N=2. ?-functor(a+b,F,N). F=(+), N=2. ?-functor(albastru,F,N). F=albastru, N=0. ?- functor(T,f,3). T = f(_G275, _G276, _G277).
Programare logica

Predicate de tratare a clauzelor drept termeni


arg(N,Termen,Arg)

arg(N,Termen,Arg) are ca efect ob tinerea celui de-al N-lea argument al unei structuri Termen, acest termen devenind instan tierea lui Arg. e variabile neinstan Termen s i N nu trebuie sa tiate. Arg este variabila neinstan Arg va instan Daca tiata, tiat cu cel de-al N-lea argument al lui Termen. Arg nu este variabila neinstan predicatul reu Arg se Daca tiata, se ste doar daca potrive ste cu al N-lea argument al lui Termen. Exemple ?-arg(2,poseda(gheorghe,mare(elefant)),Arg). Arg=mare(elefant). ?-arg(2,[a,b,c],X). X=[b,c]. ?-arg(1,a+(b+c),a). false.

Programare logica

Predicate de tratare a clauzelor drept termeni


Predicatul Atom =..[Functor|ArgList]
Este un operator inxat ce poate folosit n 3 moduri: 1 Atom este o structura sau o variabila instan cu o structura. n acest caz, tiata Functor s predicatul reu se ste daca i ArgList se potrivresc cu functorul, respectiv lista de argumente componente a acelei structuri. 2 Atom este variabila neinstan iar Functor s tiata i ListArg sunt un functor s i o de argumente. n acest caz Atom se instan cu structura lista tiaza corespunzatoare. 3 To ti trei parametrii sunt instan tia ti. n acest caz predicatul reu se ste daca Functor s i ListArg sunt functorul, respectiv lista argumentelor structurii Atom. Exemple ?-sir(a,b,c) =.. X. X=[sir,a,b,c]. ?- (f(a)+g(b)) =.. [(+),f(X),Y]. X = a, Y = g(b). ?-arg(1,a+(b+c),a). true. ?- a*b+c=..X. X = [+, a*b, c]
Programare logica

Predicate de vizualizare a regulilor s i faptelor


listing, listing(+Nume) s i listing(+[Nume1 , ..., Numen ])

ste tot con listing tipare tinutul unei baze de cuno stin te, toate regulile s adica i faptele. listing(Nume) trebuie apelat cu Nume ind un simbol instan cu un simbol. Predicatul reu sau variabila tiata se ste toate regulile s ntotdeauna s i a seaza i faptele denite pentru Nume. toate listing([Nume1 , ..., Numen ]) a seaza regulile s i faptele denite pentru numele indicate n lista ca argument. data

Programare logica

a ntrebarilor Predicate pentru execu tia dinamica


call(Intrebare)

Intrebare este instan Se presupune ca tiat cu o ntrebare (de exemplu, cu o conjunc tie de atomi.) Intrebare reu n caz call(Intrebare) reu se ste daca se ste, s i e sueaza contrar. a ntrebarilor call este util pentru execu tia dinamica care se construiesc pe parcursul execu tiei unui program. Exemplu: predicatul de prelucrare a listelor mapcar evalueze predicatul P pentru mapcar(P,ListaArg,ListaRez) va denit sa construiasca rezultatul n lista ListRez. ecare element din lista ListArg si sa mapcar(_,[],[]). mapcar(P,[Arg|RestArg],[R|Rest]):Atom=..[P,Arg,R], % Construiesc apelul P(Arg,R) call(Atom), % ...si il evaluez->R va fi calculat mapcar(P,RestArg,Rest). % Continua recursiv

Programare logica

a ntrebarilor Predicate de execu tie dinamica


Aplica tie: Denirea predicatului mapcar (continuare)

Exemple de utilizare pentru mapcar. ca prim argument un predicat pred(+L,-R) care calculeaza un mapcar a steapta rezultat R n func tie de L. Argumentul L este de intrare iar argumentul R este de ie sire. pred1(L,R):-R is 2*L. pred2(L,[L]). ?-mapcar(pred1,[1,2,3],R). R = [2, 4, 6] ?-mapcar(pred2,[a,b,C],R). R=[[a],[b],[C]].

Programare logica

a ntrebarilor Predicate de execu tie dinamica


findall(X,Intrebare,Lista)

findall(X,Intrebare,Lista) are ca argumente o variabila X, o ntrebare Intrebare care con neinstan tiata tine variabila X neinstan Lista. s i o variabila tiata evaluarea lui findall(X,Intrebare,Lista), variabila Dupa cu lista tuturor valorilor lui X pentru care Lista va instan tiata Intrebare are loc. Exemplu prieten(vlad,ana). prieten(vlad,george). prieten(vlad,mihai). prieten(liviu,ana). % Afla toti prietenii lui Vlad ?-findall(X,prieten(vlad,X),L). L = [ana, george, mihai].
Programare logica

a ntrebarilor Predicate de execu tie dinamica


Varia tii ale predicatului findall

prieten(doru,dora). prieten(vlad,ana). prieten(vlad,george). prieten(vlad,mihai). prieten(liviu,ana). % Afla toti X,Y care au un prieten comun. ?-findall(prieten_comun(X,Y),(prieten(X,Z),prieten(Y,Z),X\=Y),L). % Afla prietenii lui Doru sau Liviu. ?-findall(X,prieten(doru,X);prieten(liviu,X),L). L=[dora,ana].

Programare logica

a ntrebarilor Predicate de execu tie dinamica


bagof(X,Intrebare,Lista)
La fel ca s i findall(X,Intrebare,Lista), s i predicatul n lista L toate valorile care satisfac bagof(X,Intrebare,Lista) colecteaza ntrebarea Intrebare, nsa tine cont de diversele instan tieri posibil diferite ale celorlalte variabile din Intrebare. Exemplu clasificare(a,vocala). clasificare(b,consoana). clasificare(c,consoana). clasificare(d,consoana). clasificare(e,vocala). clasificare(f,consoana). ?-findall(X,clasificare(X,C),L). % o solutie L=[a,b,c,d,e,f]. ?-bagof(X,clasificare(X,C),L). C = consoana, L = [b,c,d,f] ; C = vocala, L = [a,e]. % doua solutii

Programare logica

a ntrebarilor Predicate de execu tie dinamica


setof(X,Intrebare,Lista)
setof(X,Intrebare,Lista) are acela si efect ca bagof(X,Intrebare,Lista), valorile acumulate n lista Lista sunt sortate crescator cu excep tia faptului ca s i se apari elimina tiile multiple de valori. (Deci Lista devine o mul time ordonata.) Exemplu clasificare(e,vocala). clasificare(d,consoana). clasificare(a,vocala). clasificare(b,consoana). clasificare(c,consoana). clasificare(d,consoana). clasificare(e,vocala). clasificare(f,consoana). ?-bagof(X,clasificare(X,C),L). C = consoana, L = [d,b,c,d,f] ; C = vocala, L = [e,a,e]. ?-setof(X,clasificare(X,C),L). C = consoana, L = [b, c, d, f] ; C = vocala, L = [a, e]. % doua solutii

Programare logica

S-ar putea să vă placă și