1 / 30

Prolog

Prolog. Un programa Prolog està format per un conjunt de fòrmules LP1 (claúsules de Horn) que representa un conjunt d’objectes i de relacions entre aquests objectes. Fets : Regles : plou. mortal(X):-home(X). home(plato). avi(X,Y):-pare(X,Z),pare(Z,Y).

marlin
Download Presentation

Prolog

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Prolog Un programa Prolog està format per un conjunt de fòrmules LP1 (claúsules de Horn) que representa un conjunt d’objectes i de relacions entre aquests objectes. Fets : Regles : plou. mortal(X):-home(X). home(plato). avi(X,Y):-pare(X,Z),pare(Z,Y). pare(joan,pere). avi(X,joan).

  2. joan anna maria pere marc laura Imma xavi Un programa de càlcul de relacions de parentesc en prolog

  3. home(joan). home(pere). home(marc). home(xavi). dona(anna).dona(maria).dona(laura). dona(imma). matrimoni(joan,anna). matrimoni(marc,laura). pro(joan,pere). pro(anna,pere). pro(joan,marc). pro(anna,marc). pro(maria,laura). pro(pere,imma). pro(marc,xavi). pro(laura,xavi). pare(X,Y):-home(X),pro(X,Y). avi(X,Y):-pare(X,Z),pro(Z,Y). avi(joan,Q). joan/X Q/Y pare(joan,Z) pro(Z,Y) joan/X Z/Y’ home(joan) pro(joan,Y’) pro(Y’,Y) Y’/pere pro(joan,Y’) pro(Y’,Y) pro(marc,Y) pro(pere,Y) Y/xavi Y/imma

  4. home(joan). home(pere). home(marc). home(xavi). dona(anna).dona(maria).dona(laura). dona(imma). matrimoni(joan,anna). matrimoni(marc,laura). pro(joan,pere). pro(anna,pere). pro(joan,marc). pro(anna,marc). pro(maria,laura). /*pro(pere,imma).*/ pro(marc,xavi). pro(laura,xavi). pare(X,Y):-home(X),pro(X,Y). avi(X,Y):-pare(X,Z),pro(Z,Y). avi(joan,Q). joan/X Q/Y pare(joan,Z) pro(Z,Y) joan/X Z/Y’ home(joan) pro(joan,Y’) pro(Y’,Y) Y’/pere pro(joan,Y’) pro(Y’,Y) pro(marc,Y) pro(pere,Y) Y/xavi FAIL

  5. Sintaxi : Termes àtoms : constants textuals. joan x23 ‘Johnnie Walker’ nombres : Reals o sencers -37 2.023E-14 variables : Comencen per una majúscula o un símbol ‘_’ X23 Joan _114 Termes Simples Compos- tos constants variables àtoms nombres

  6. Sintaxi : Termes (II) Termes compostos: Formats per un nom de predicat (àtom) i una seqüència d’arguments, entre parèntesis i separats per comes. Aquests arguments són, a la seva vegada, termes. pare(joan,jordi). persona(nom(joan,canals),edat(30).dom(carrer(nord),num(22))). Exemple: Gestió d’una biblioteca. Tindrem dues classes de termes compostos o estructures: llibre(ref(11540), autor(‘Gabriel García Márquez’),titol(’100 años de soledad’),ed(anaya,any(1993))). lector(id(202),nom(‘Pere Sala Güell’),dom(carrer(orient), num(1),mun(girona),tlf(972205674))). prestec(llibre(11540), lector(202),dataini(2,11,2001), datafi(2,1,2002),tornat(no)). Podem preguntar el telèfon de tots els lectors de Gabriel García Márquez que viuen al carrer Jaume I de Girona

  7. r1 (r1* r2) / (r1+ r2) 7 r2 2 9 3 5 r1 r2 r1+ r2 ?- r_eq(s(p(s(p(7,3),9),3),2),R). r_eq(X,X):-number(X). r_eq(s(X,Y),R):-r_eq(X,R1),r_eq(Y,R2),R is R1+R2. r_eq(p(X,Y),R):-r_eq(X,R1),r_eq(Y,R2),R is (R1*R2)/(R1+R2).

  8. Unificació : Variables instanciades, lliures i lligades persona(joan,23). persona(maria,19). major_dedat(X):-persona(X,Y),Y>=18. Una variable és lliure quan no està instanciada. Una variable queda instanciada quan pren un valor : ?- major_dedat(Z) Aquí Z està lliure Z/X Aquí Z i X queden lligades Aquí X i Y són lliures persona(X,Y), Y>=18 Aquí s’instancien X, Y i Z X/joan , Y/23 23>=18 Z=joan

  9. Unificació : Substitucions Una substitució és un conjunt de parells X/T on X és una variable i T es un terme prolog qualsevol. Per exemple : S = {X/pere, Y/p(Z,q(32)), K/T} Les substitucions es poden aplicar als termes prolog. Per exemple : Sigui Q = r(X,Y,p(K)) llavors: QS = r(pere, p(Z,q(32)), p(T))

  10. Unificació : Definició Donats dos termes prolog T1 i T2, una substitució S tal que T1S = T2S. es diu un unificador de T1 i T2 Donats dos termes prolog T1 i T2, unificar-los consisteix en trobar l’unificador més general tal que T1S = T2S. Per exemple : T1 és p(X) T2 és p(Y) S={X/1, Y/1} és un unificador de T1 i T2, però S’={X/Y}és més general Unificador més general (m.g.u.) de T1 i T2 : És l’unificador de T1 i T2 que té el mínim nombre de variables instanciades

  11. Algorisme d’unificació. • Dos termes S i T s’unifiquen segons les següents regles: • a) Si S i T són constants o variables instanciades com a constants, s’unifiquen si i només si tenen el mateix valor. • b) Si S i T són variables lliures, s’unifiquen i queden lligades. • c) Si S és una variable lliure i T un terme qualsevol, s’unifiquen i S queda instanciada com a T. • d) Si S i T són estructures s’unifiquen només si • S i T tenen el mateix functor principal, (Defineixen el mateix predicar), i el mateix nombre d’arguments. • Els arguments corresponent s’unifiquen dos a dos.

  12. Unificació. Exemples El símbol ‘ = ‘ és l’operador d’unificació. Donats dos termes T1 i T2 T1 = T2 és veritat si i només si T1 i T2 es poden unificar. ?- data(dia(2),X,any(Z))=data(Y,Z,any(99)). ?- data(dia(X),mes(2),Z)=data(dia(3),mes(X),any(T)). ?- data(dia(X),mes(2),any(Z))=data(Z,mes(X),T). ?- X=2+3. ?- X=p(X). Exercici: Suposem que representem un punt (x,y) al pla com p(x,y) i un segment del punt p1 al p2 com s(p1,p2). Definir relacions per determinar quan un segment és vertical i quan tres segments formen un triangle.

  13. Exemple : el mico i el plàtan finestra Hi ha un mico a la porta d’una habitació. Hi ha un plàtan penjant del sostre i una caixa al costat de la finestra. El mico ha de trobar una seqüència d’accions que li permetin menjar-se el plàtan. caixa plàtan mico porta El mico pot fer quatre accions diferents : caminar a qualsevol punt de la cambra, pujar-se a la caixa, arrossegar la caixa i agafar el plàtan.

  14. El mico i el plàtan (II). mov(estat(mig,asobre,mig,no),estat(mig,asobre,mig,si)). mov(estat(P,aterra,P,T),estat(P,asobre,P,T)). mov(estat(P,aterra,P,T),estat(P2,aterra,P2,T)). mov(estat(P,aterra,PC,T),estat(P2,aterra,PC,T)). pot_menjar(estat(_,_,_,si)). pot_menjar(E):-mov(E,E2), pot_menjar(E2). Programa prolog que resol el problema del mico i el plàtan. Si ordenéssim les clàusules que defineixen els moviments de manera diferent, no funcionaria.

  15. Operadors en prolog • Siguin T1 i T2 termes. Podem distingir diferents tipus d’operadors: • Operadors d’unificació : • T1= T2 sii T1 i T2 es poden unificar • T1\= T2 sii T1 i T2 no es poden unificar • Operadors aritmètics : + , - , * , / , // , mod. • L’operador is. Serveix per a forçar l’avaluació de les expressions aritmètiques. T1 is T2 és cert sii el resultat d’avaluar T2 es pot unificar amb T1. • Exemples : X is 2+3. 8 is 7+1. X=2+2,Y is 2*X SI • X is joan - 3. 5 is 2+2. X=4,X is 3*2. X is 2*Y NO

  16. Operadors en prolog (II) Operadors de comparació : Siguin T1 i T2 termes. T1 > (<) T2 sii el resultat d’avaluar T1 es major (menor) que el resultat d’avaluar T2. T1 >= (=<) T2 sii el resultat d’avaluar T1 es major (menor) o igual que el resultat d’avaluar T2. T1=:= (=\=) T2 sii el resultat d’avaluar T1 igual que el resultat d’avaluar T2. T1== (\==) T2 sii T1 i T2 són (no són) exactament el mateix terme

  17. Exemple. /* pais(Nom, Població, Superfície) */ país(albania, 3000. 250). pais(alemania,80000 , 1000). pais(andorra,100 , 0.4). mes_gran(X,Y):-pais(X,_,S1),pais(Y,_,S2), S1>S2. densitat(Pais,D):- pais(Pais,P,S), D is P/S.

  18. Operadors en prolog (III). Precedències :- op( 1200 , xfx , ’:-’ ). :- op( 1200 , fx , [:-,?-]). :- op( 1100 , xfy , ’;’ ). :- op( 1000 , xfy , ’,’ ). :- op( 700 , xfx , [ = , is , < , > , =< , .>= , == , =\= , =:= ,\== ]). :- op( 500 , yfx , [ + , - ] ). :- op( 500 , fx , [ + , - , not ] ). :- op( 400 , yfx , [ * , / , div ] ). :- op( 300 , xfx , mod ). El conjunt dels operadors predefinits en prolog, juntament amb les seves precedències i associativitats:

  19. Operadors definits per l’usuari Exemple :- op(900,xfx,te). :- op(890,xfy,i). :- op(900,xfx,es_troba_a). joan te cotxe i moto i bici. pere te bici. anna te moto i vaixell. X te Y :- X te Z, Y es_troba_a Z. X es_troba_a X. X es_troba_a X i _. X es_troba_a Y i R :- X es_troba_a R.

  20. El “cut” ( ! ) Aquest operador predefinit es fa servir per a limitar el backtracking. Quan el prolog intenta fer servir un fet o regla per a demostrar un objectiu (goal), posa un punt de backtracking a aquest fet o regla per poder triar noves alternatives de demostració. Si en aquest procés de demostració el prolog troba un cut a la part dreta d’una regla, esborra tots els punts de backtracking establerts des del moment que s’ha intentat fer servir la regla que conté el cut per demostrar l’objectiu actual.

  21. El “cut” ( ! ) p:-q,r,s. p:-t. q. r:-y. r:-x. x. t. p:-q,r,!,s. p:-t. q. r:-y. r:-x. x. t.

  22. El “cut” ( ! ) max(X,Y,X):-X>=Y. max(X,Y,Y):-X<Y. max(X,Y,X):-X>=Y,!. max(X,Y,Y). f(X,0):-X<=0. f(X,3):-0<X=<4. F(X,5):-4<X. f(X,0):-X<=0,!. f(X,3):-X=<4,!. F(X,5). member(X,[X|_]):-!. member(X,[_|R]):- member(X,R). esborrar(X,[X|R],R):-!. esborrar(X, [Y|R], [Y|R2]):- esborrar(X,R,R2).

  23. Els predicats predefinits fail i not fail : el predicat fail mai es pot demostrar. Es fa servir sobre tot per forçar al prolog a fer backtracking. També existeix el predicat true. Exemple : dues formes de definir un predicat per escriure per pantalla els elements d’una llista : escriure(L):-member(X,L), write(X), fail. escriure(_). escriure([]). escriure([X|R]):-write(X), escriure(R).

  24. Els predicats predefinits fail i not not , \+ : Negation as failure. not p (\+ p) és cert si i només si p no es pot demostrar. Exemple : not 4=3. not member(1,[2,3]). Cert not member(X,[2,3]). Fals Es defineix així : not P :- P,!,fail; true.

  25. Entrada i Sortida en Prolog WVM Input Stream Output Stream Programa prolog En prolog hi ha en tot moment un canal (stream) actual de sortida i un canal actual d’entrada. Tota la sortida es fa al canal actual de sortida i tota l’entrada es fa desde el canal actual d’entrada. Per defecte tots dos canals són la consola del prolog (user).

  26. Predicats E/S en Prolog. Maneig dels canals see(nomfitxer). tell(nomfitxer). seen. told. seeing(NomFitxer). telling(Nomfitxer).

  27. Predicats E/S en Prolog. Lectura i Escriptura get0(CodiCaracter). get(CodiCaracter). Caracters imprimibles. eof=-1 put(CodiCaracter). write(Terme). read(Terme). end_of_file

  28. Exemple. Processament d’un fitxer de notes. aprovats:-see('alumnes.txt'), tell('aprovats.txt'), repeat, read(T), processar(T). processar(end_of_file):-!, seen, told. processar(alumne(Nom,Nota)):-Nota>=5, write(aprovat(Nom,Nota)), write('.'),nl, fail.

  29. Exemple. Treure els espais en blanc de sobres. blancs:-see('entrada.txt'), tell('sortida.txt'), get0(C), fora_blancs(C). fora_blancs(-1):-!, seen, told. fora_blancs(C):-!, put(C), (C=32->get(C2);get0(C2)), fora_blancs(C2).

  30. Modificació dinàmica de programes en Prolog assert(Term). assertz(Term). asserta(Term). retract(Term). retractall(Term). consult(nomfitxer). reconsult(nomfitxer).

More Related