Documente Academic
Documente Profesional
Documente Cultură
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.
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
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
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 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
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
Programare logica
Programare logica
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
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
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
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
toate clauzele din program al caror retractall(Cap) elimina cu Cap. cap se unica
Programare logica
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
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
Programare logica
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
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
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
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
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
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
Programare logica
Programare logica