Programmacion Declarativa - Prolog: Todas las clases de theoria (ahora no todas) para toda la gente a quien falta alguna cosa o para ellos que no pueden leer bien sus cosas escritas ;-) Paginas Web muy interessantes: http://www.afm.sbu.ac.uk/logic-prog/ El SWI- Prolog-Interpreter: http://www.swi.psy.uva.nl/projects/swi-prolog/ Universidad Brighton: http://burks.bton.ac.uk/burks/language/prolog/ http://www.amzi.com/ Documentos sobre Prolog: http://www.amzi.com/manuals/amzi6/amzidoc.htm Tutorial de Prolog: http://www.amzi.com/manuals/amzi6/pro/prfrtop.htm Lo mejor para buscar mas: http://groups.google.com/ grupo: comp.lang.prolog Nuevas versiones de este archivo siempre hay aquí: http://www.redshark.de/ugr Si falta algo o no esta correcto escribemelo por favor: mailto:blackshark@redshark.de
Programacion Declarativa: Jose Enrique Cano Despacho B4 03/10/2001 Examen: 80% Teoria 20% Practicas Libros: Prolog: Clock Sin + Mellish Programming in Prolog Winston H.P. LISP Bratko I Prolog Programming for Artificial Intelligence Historia: 1974 Kowalski 1975 Waren Pereina Pereina 1981 Prolog II, microprolog 1986 Turbo, Arity
Solo: Clausulas Horn, and ; or (no se utiliza) Reglas o Hechos: 1.Regla: A:-B,C,D. 2.Hecho: A. B,C,D A Logica Predicados 1. orden Elemento::= (Hecho) (regla) (consulto) (Hecho)::= (termino). (regla)::= (termino) :- (terminos). (consulta)::= (termino). (termino)::= (termino), (termino) (termino)::= (constante) (variable) (estructura) (constante)::= (numero) (atomo) (numero)::= -- 1.3, 3 (atomo)::= -- nombres : pepe, jose, (variable)::= _hola, Pepe, _ (variable anónimo) (estructura)::= padre(pepe,a,b,tiene(2)) padre(a) 10/10/2001:
espadre(enrigue7, enrigue8). espadre(enrigue7,arturru). espadre(enrigue7,margarita). espadre(enrigue8,maria). espadre(enrigue8,isabel). espadre(enrigue8,eduardo). esmadre(catalina,maria). esmadre(ana,isabel). esmadre(juena,eduardo). yes no?-espadre(enrigue7,enrigue8).?-espadre(enrigue8,arturru).?-espadre(x,arturru). X=enrigue7. no?-espadre(enrigue7,x). X=enrigue8. X=arturro X=margarita no?-espadre(x,isabel),espadre(abelo,x). X=enrigue8 Abelo=Enrigue7 no
?-espadre(_isabel),espadre(abela,_). Abelo=enrigue7 PROHIBIDO: espadre(espadre(abelo,x),isabel) solo Predicados 1. orden!! nuevas reglas: es_hicho(y,x):-espadre(x,y). es_hicho(y,x):-esmadre(x,y). 17/10/2001: yes?-es_hicho(isabel,ana). -> espadre(ana,isabel) -> esmadre(ana,isabel)?-es_hicho(x,enrigue). ->espadre(enrigue8,x) X=maria X=isabel X=eduardo -STRING: prolog -> lista -> [112, 114, 111, 108, 111, 103] p r o l o g [1,hola,X,3,[2,3]] [X Y] -> X primer elemento Y resto 1 hola,x,3,[2,3] Alt+124:
UNIFICATION de REGLAS: Variable libre ->variable con valor cambio de valor no es possible!! 1: T1 T2 Patternmatching: (para variables libres) A 2 A B => 1 lugar para 2 nombres 2: T1 falta algo 3: T1 constante Unification solo para constantes eguales 4 4 4: T1 estructura pepe(_,_) pepe(a,b) mismo nombre, mismo numero de elementos! 5: Listo correcto??? * = * unificacion? * \= * no unificacion?
-COMPARACIÓN X=Y X\=Y X<Y X>Y X=<Y X=>Y 19/10/2001: precio(panda,100,1000. precio(polo,1000,1300). precio(r5,1300,1800). precio(2x,1500,1900). precio(xantia,1900,2000). compra(coche,dinero):- precio(coche,min,max), Dinero=>Min, Dinero=<Max. para comparacion al minimo Dinero o Min/Max debe tener valor fijo!?-compra(r5,100). no?-compra(x,1000). -> x = Coche ->Dinero = 1000 ->precio(x,min,max) ->precio(panda,700,1000) ->1000>=700 ->1000<=1000 X=panda X=polo- -OPERADORES: = \= is (solo opera en la parte derecha, unifica con la izquierda) X is 2+3 X=5 = = \= = (identicamente lo mismo; no se opera!) 1+2= =1+2 true 3 = = 1+2 false =:= (tiene mismo valor; opera a dos lados) solo se puede utilizar variables con valor peorque operar con variables sin valor conocido no tiene sentido + - * *(2,3) es dato no cuenta! / X^Y (X Y) X mod Y X//Y
Que significa X//Y??? poblac(usa,203). poblac(india,548). poblac(china,800). poblac(espana,50) area(usa,3). area(india,1). area(china,4). area(espana,0.1). densidad(x,y):-poblac(x,poblac),area(x,area),y is poblac/area.?-densidad(china,x). X=200 X=usa Y=67.66?-densidad(X,Y). 24.10.2001 mujer(maria). padres(persona,madre,padre):-madre(persona,madre),padre(persona,padre). madre(juan,ana). madre(maria,ana). padre(juan,pedro). padre(maria,pedro).?-mujer(maria),padres(maria,m,p),padres(juan,m,p). M=ana P=pedro ->mujer(maria) true -> padres(maria,m,p) ->madre(maria,madre) ->madre(maria,ana) M=ana ->padre(maria,padre) ->padre(maria,pedro) P=pedro ->padres(juan,m,p) ->padres(juan,ana,pedro) madre(juan,ana),padre(juan,pedro) true
+(a,*(b,c)) f(x,g(x,a)) Listas se unifican elemento a elemento (si tienen mismo numero de argumentos) [1,2,0] [1,A,B] A=2 B=0 false B=[2,3,4] [1 B] [1,a,b] [1,2,3,4] (no se unifica) mas Ejemplos: cual se unifica? [X,Y,Z] [pepe,juan,antonio] X=pepe Y=juan Z=antonio [perro] [X Y] X=perro Y=[] [X,Y Z] [pepe,gusta,vino] X=pepe Y=gusta
Z=[vino] [[el,y] Z] [[el,perro] [a,b]] X=el Y=perro Z=[a,b] X=[b] [a X] [a,b] [a,b] [b,x] no [blarro Q] [A pepe] A=blarro Q=pepe no [] [A X] [] solo unifica con lista vacia o variable anonima
-MEMBER (PERTENECE): 26.10.2001 pertenece(x,[x _]). pertenece(x,[_ Cola]):-pertenece(X,Cola).?-pertenece(a,[1,a,b]). ->pertenece(a,[a,b]) yes?-pertenece(a,[1,2,3]) ->A=X ->X=1 ->_=[2,3] A=1 -> A=X -> _=1 ->Cola=[2,3] ->pertenece(a,[2,3]) A=2 (more y/n)?-pertenece(a,a).?-pertenece(a,b). no se para que sirve padre(x,y):- hijo(y,x). hijo(a,b):-padre(b,a). RECURSION (normalmente con listas) pertenece(x,[x,_]). pertenece( ):-pertenece( ) repeat - fail recursion -> bases de datos ->lista
-FACTORIAL: factorial(0,1). factorial(n,factorial):-m is N-1, factorial(m,facto),factorial is Facto * N. O=6?-factorial(3,O) ->N=3 ->O=Factorial ->M is 3-1 ->factorial(2,facto) ->Factorial is Facto * 3 ->factorial(2,facto) ->N=2 ->Facto=Factorial ->M= 2-1 ->factorial(1,facto 2 ) ->Factorial is Facto 2 * 2 ->factorial(1,facto 2 ) ->N=1 ->Facto 2 =Factorial ->M= 1-1 ->factorial(0,facto 3 ) ->Factorial is Facto 3 * 1 ->factorial(0,facto 3 ) ->N=0 -> Facto 3 =1 => O = Facto *3 = Facto 2 *2 *3 = Facto 3 *1 *2*3 = 1 *1*2*3 (more y/n)
-APPEND (ENCADENA): encadena ([1,2],[a,b],A) =>A=[1,2,a,b] encadena([],l,l). encadena([x Cola1),A,[X Cola2]):-encadena(Cola1,A,Cola2). S=[1,a,b]?-([1],[a,b],S) (more y/n) ->X=1 ->Cola1=[] ->A=[a,b] ->S=[1 Cola2] ->encadena([],[a,b],cola2) =>encadena([],l,l) ->L=[a,b] ->Cola2=L=[a,b]?-([1,2],[a,b],S) ->X=1 ->Cola1=[2] ->A=[a,b] ->S=[1 Cola2] ->encadena([2],[a,b],cola2) ->X=2 ->Cola1=[] ->A=[a,b] ->Cola2=[2 Cola2 2 ] ->encadena([],[a,b],cola2 2 ) =>encadena([],l,l) ->L=[a,b] ->Cola2 2 =L=[a,b] ->Cola2=[2 Cola2 2 ]=[2,a,b] ->S=[1 Cola2] S=[1,2,a,b] encadena([],l,l). encadena(x L],L1,[X L2]):-encadena(L,L1,L2). 02.11.2001????-encadena([a,b],1,2],L x ) ->X=a
->L=[b] ->L1=[1,2] ->L x =[a L2] Si diferentes predicados tienen variables con el mismo symbolo no es la misma variable! (-> L \= L x ) ->encadena([b],[1,2],l2) ->X=b ->L=[] ->L1=[1,2] ->L2=[b L2 x ] ->encadena([],[1,2],l2 x ) =>encadena([],l,l) ->L=[1,2] ->L2 x =[1,2] ->L2=[b,1,2] ->L x =[a L2] L x =[a,b,1,2] (more y/n)?-encadena(a,[a,b,c],[1,2,a,b,c]). ->A=[X L] ->L1=[a,b,c] ->X=1 =>A=[1 L] ->L2=[2,a,b,c] ->encadena(l,[a,b,c],[2,a,b,c]) ->L=[X 1 L 1 ] ->L1=[a,b,c] -> X 1 =2 =>L=[2 L 1 ] ->L2=[a,b,c] ->encadena(l 1,[a,b,c],[a,b,c]) =>encadena([],l,l) ->L 1 =[] ->L=[2] ->A=[1 L] A=[1,2] (more y/n)
blackshark is watching you! Observaciones: Letras o numeros en subscript (coma Facto 2 o L x ) solo hay para distinguir diferentes variables con mismos nombres. Creo que L2=[b L2] es mas dificil de leer que L2 x =[b L2] para nada mas que por eso utilizo letras y numeros en subscript