300 likes | 446 Views
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).
E N D
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).
joan anna maria pere marc laura Imma xavi Un programa de càlcul de relacions de parentesc en prolog
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
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
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
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
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).
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
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))
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
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.
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.
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.
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.
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
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
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.
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:
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.
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.
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.
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).
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).
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.
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).
Predicats E/S en Prolog. Maneig dels canals see(nomfitxer). tell(nomfitxer). seen. told. seeing(NomFitxer). telling(Nomfitxer).
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
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.
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).
Modificació dinàmica de programes en Prolog assert(Term). assertz(Term). asserta(Term). retract(Term). retractall(Term). consult(nomfitxer). reconsult(nomfitxer).