Documentos de Académico
Documentos de Profesional
Documentos de Cultura
introducido por Universidad de Aix-Marseille (Marsella, Francia) por los profesores Alain Colmerauer y Philippe Roussel al inicio de '70. lenguaje de programacin de paradigma declarativo por el uso de toda la gente que trabaja en el campo de la Inteligencia Articial (lingistas) muy simple para aprender y manejar
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
Sintaxis de PROLOG
Constantes: numero (enteros o con punto otante), cadenas de caracteres con minsculas, cadenas de caracteres entre . Ejemplos: 2.5, 6, la vida, lavida, pedro, instalacion. Variables: una cadena de caracteres que empieza con una mayscula o con (guillon bajo). , 33
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
Un termino compuesto es un functor (su nombre es una cadena con minsculas) de una cierta aridad. Sus parmetros son constantes o variables. Ejemplo: madre(X,ana), madre(maria,pablo), numeroparo(32), f(g(Y),h(Z)). La aridad se marca con /. Ejemplos :
madre/2,numeroparo/1,f/2. El mismo nombre de functor se puede utilizar con una otra paridad. Ejemplo : madre(X). Aridad madre/1. Los comentarios se ponen entre /* y */ o despus el % hasta al n de linea
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
Un programa PRLOG se compone de una parte de hechos y una parte de reglas. Cada hecho o regla se termina con un . . Un hecho es la modelizacin de los datos/situaciones elementales que se consideran ciertos. Un hecho es un termino que tiene todos sus parmetros constantes o evaluables directamente. Ejemplos:
madre ( ana , pedro ). gato ( tom ). come ( tom , jerry ). esnumero (34343).
pero
animal (Z ).
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
Las reglas son la traduccin de las clausulas de Horn que modelizan las deducciones de nuevos hechos. Las reglas son de forma:
termino : termino1? . . .?terminon. ? signica la conjuncin traducida por , o la disjuncin traducida por ;.
La traduccin en formulas lgicas: donde
termino1? . . .?terminon
termino termino contiene como parmetros constantes o variables. Si hay variables, se traduce con el cuanticador universal para cada variable. Si el los termino1 , . . . , terminon aparecen otros variables se traducen por el cuanticador existencial.
UAM Azcapotzalco otoo 2010
El
c Mihaela JUGANARU
Ejemplo:
madre (X ): - hija (X , ana ). /* si ana es la hija de X */ madre (X ): - hijo (X , Y ). /* si X tiene un hijo Y ( cualquier ) */
Se usan tambin parntesis en la parte derecha de la regla para expresar formulas mas complicadas.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
un animal peligroso es un animal que o es un oso o come a alguien. En base de un programa cargado (que es entonces correcto sintctico y que se compila), se pueden hacer interrogaciones de hechos simple. PROLOG intenta de obtener una deduccin del hecho. SI hay una deduccin, se obtiene
UAM Azcapotzalco
otoo 2010
Una interrogacin es un termino compuesto con variables y constantes por el argumento. Se regresa entonces valores por las variables que non annimas si el valor regresado es verdad. Ejemplo1:
1 ?- animal ( oso ). true . 2 ?- animal ( leon ). false . 3 ?- raton ( tom ). false . 4 ?- animal ( tom ). true .
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
10
Unicacin
Se nota en PROLOG con
instanciacin de dos trminos (constantes, variables o trminos compuestos) t1 y t2 con la instancia (el valor) de un termino t. (es parecida a una nica asignacin de valor a los dos termino que se ejecuta una sola vez). La unicacin se realiza de manera implcita cuando se resuelve una interrogacin (al n de la interrogacin los variables se pierden !) o explcitamente con
=, que es un predicado.
c Mihaela JUGANARU
UAM Azcapotzalco
otoo 2010
11
una variable non-instanciada X se puede unicar con otra variable Y (instanciada o no). Si Y esta instanciada (o deviene instanciada), X es instanciada al mismo valor. en este caso de unicacin, los dos variables devienen sinonimias. una variable non-instanciada X se puede unicar con un tomo o con un termino. una variable instanciada no se unica. un tomo se puede unicar con el mismo tomo. un termino se unica con otro termino si son del mismo functor (mismo nombre) con la misma aridad, y si cada argumento se puede unicar con el argumento correspondiente.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
12
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
13
x\=y es verdad, si
x y y no son uniables. var(x) es verdad, si x es una variable non-instanciada. nonvar(x) es verdad, si x no es una variable non-instanciada. x==y es verdad, si x y y son iguales (sin hacer la unicacin). x\==y es verdad, si x y y no son iguales (sin hacer la unicacin) x is expr. se evala la expresin este valor.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
14
41 ? - a == a . true . 42 ? - a == X . false . 43 ? - a == X , X == b . false . 44 ? - a \== X , X == b. false . 45 ? - X =2+3. X = 2+3. 46 ? - X is 2+3. X = 5. 47 ? - var ( X ). true . 48 ? - X is 2+2 , var (X ). false .
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
15
x is y x=:=y por la igualdad de dos numero o dos expresiones aritmticas, primero se evala cada parte. x<y, x=<y, x>y, x>=y primero se hace la evaluacin aritmtica y regresa verdad si la condicin se cumple.
49 ? - X =:= X. ERROR : =:=/2: Arguments are not sufficiently instantiated 50 ? - X =2 , X =:= X. X = 2. 51 ? - X =2 , Y =5 , X =:= Y -3. X = 2, Y = 5. 52 ? - X =2 , Y =5 ,X <Y +3. X = 2, Y = 5.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
16
Otros predicados :
atom(x) verica si x es una constante (un tomo). atomic(x) verica si x es instanciado a un tomo. number(x) verica si x es instanciado un tomo numrico. integer(x), oat(x) numero entero o otante.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
17
Recursividad
PROLOG no esta un lenguaje completo de programacion logica, sino un lenguaje que intenta la resolucion de las interrogaciones segun las reglas siguientes:
primero se examina los hechos luego se intenta la alpicacion de la reglas de la primera con el functor indicado hasta la ultima con este functor. se aplica un metodo de backtracking el caso de fracaso (a saber, no se puede decidir nada y no hay otra opcion) una interrogacion sin respuesta se interpreta como falsa.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
18
es capaz de resolver las interrogaciones hermano(pablo,ana) (es un hecho), hermano(ana, pablo) (se aplica la primera regla), pero la interrogacion hemano(ana,maria) produce une aplicacion innita de la misma regla 1:
[ trace ] 12 ?- hermano ( ana , pablo ). Call : (6) hermano ( ana , pablo ) ? creep Call : (7) hermano ( pablo , ana ) ? creep Exit : (7) hermano ( pablo , ana ) ? creep Exit : (6) hermano ( ana , pablo ) ? creep true . [ trace ] 13 ?- hermano ( ana , maria ). Call : (6) hermano ( ana , maria ) ? creep Call : (7) hermano ( maria , ana ) ? creep Call : (8) hermano ( ana , maria ) ? creep Call : (9) hermano ( maria , ana ) ? creep Call : (10) hermano ( ana , maria ) ? abort
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
19
En este caso, la regla hermano(X,Y):-hermano(Y,X) debe de aplicarse una sola vez. Varianta posible : introducir un predicado hermano2 para las reglas y dejar los hechos con el predicado inicial hermano. En la regla de distributividad usamos tambien el predicado nuevo.
hermano ( pablo , ana ). hermano ( pablo , maria ). hermano2 (X ,Y ): - hermano (X ,Y ). hermano2 (X ,Y ): - hermano (Y ,X ). hermano2 (X ,Z ): - hermano2 (X ,Y ), hermano2 (Y ,Z ).
Este programa funciona correctamente por la interrogacion hermano2(ana,maria). Con una interogacion hermano2(pablo, ana) PROLOG busca true, pero puede varias veces tambien true con aplicacion a las otras reglas que la primera es necesario indicar al sistema que un solo resultado es suciente c Mihaela JUGANARU UAM Azcapotzalco otoo 2010
20
Predicado de corte
En el caso donde hay varias reglas por un predicado PROLOG construye un arbol donde intenta a aplicar todas reglas posibles. El predicado de corte (cut predicate) demonstracion. El en caso de la aplicacion hermano2, un corte despues la aplicacion de cada regla evita la aplicacion de las otras reglas.
hermano ( pablo , ana ). hermano ( pablo , maria ). hermano2 (X ,Y ): - hermano (X ,Y ) ,!. hermano2 (X ,Y ): - hermano (Y ,X ) ,!. hermano2 (X ,Z ): - hermano2 (X ,Y ), hermano2 (Y ,Z ) ,!.
! permite de indicar al
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
21
Predicado fail
Este predicado produce el fracaso de la aplicacion de la regla. Puede indicar una negacion, pero no esta suciente si hay predicados similares. hermano ( p a b l o , ana ) . hermano ( p a b l o , m a r i a ) . hermano ( ana , maria ): f a i l . hermano2 (X , Y): hermano (X , Y ) , ! . hermano2 (X , Y): hermano (Y , X ) , ! . hermano2 (X , Z): hermano2 (X , Y) , hermano2 (Y , Z ) , ! . Este programa regresa falso por hermano(ana,maria) (normal !), pero regresa verdad por el predicado hermano2(ana,maria) con la aplicacion de la regla 3 de distributividad.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
22
La negacion
La negacion de un heco se expresa con lod dos predicados fail y !, con la precaucion de poner la negacion como primera regla (en el orden de aplicacion). Ejemplo : por la aplicacion gusta los tacos se pone :
likes,
likes(sam, tacos):-fail,!.
Pero, estas reglas se maneja con cuidado.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
24
Estructura IF-THEN-ELSE
Es posible de describir esto tipo de estructura if A then B else C con :
(A > B ; C )
El sentido es : prueba A y si es verdad evalua B, sino evalua C. Ejemplo :
max (X ,Y ,Z ): -( X >= Y -> Z= X;Z =Y ). 6 7 8 9 ????max (3 ,2 ,4). false . max (1 ,2 ,2). true . max (3 ,2 ,3). true . max (25 ,34 , X ). X = 34.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
25
listing/0 : produce el contenido de la base assert/1 : inserta en la base un hecho o una regla, las reglas se protegen con parentesis. asserta/1 y assertz/1: la insercion se hace al inicio o al n de la base retract/1 : se sale (se borra) los hechos o reglas indicadas.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
26
Ejemplo:
18 ? - assert ( maxabs (1000)). true . 19 ? - assert (( menor ( X ): - maxabs (Y ),X =<Y )). true . 20 ? - menor (3). true . 21 ? - X =3 , menor (X) , assert ( menor (X )). X = 3. 22 ? - listing . max (A , B , C) :( A >= B -> ). % Foreign : tcp_debug /1 :- dynamic menor /1. menor (A ) : maxabs ( B), menor (3). :- dynamic maxabs /1. maxabs (1000). true .
C =A
C=B
A =<B.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
27
Listas
La lista es una estructura de datos muy utilizada en la programacin non-numrica. Es un conjunto ordenado de elementos y puede tener cualquier dimensin.
una lista vaca : [] una lista con 3 tonos [a,b,c] una lista con tres elementos donde el ultimo elemento es una lista tambin [a,b,[1,3,5]] una lista con variables [X,1,2,Y]
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
28
Una lista tiene una cabeza (head) = el primer elemento y una cola (tail) = el ultimo elemento. Con la notacin
tambin una lista sin el primer elemento (esta puede ser vaca). Ejemplo:
[ debug ] 50 ?- X =[ a | [b ,c ]]. X = [a , b , c ]. [ debug ] 49 ?- Y = [1 | [3 , 4, [10 | []] , 5]]. Y = [1 , 3, 4, [10] , 5]. [ debug ] 44 ?- [X| Y ]=[1 ,2 ,3 ,4]. X = 1, Y = [2 , 3, 4]. [ debug ] 45 ?- [X |[ Y|Z ]]=[1 ,2 ,3 ,4]. X = 1, Y = 2, Z = [3 , 4].
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
29
una variable non instanciada se puede unicar con una lista dos listas se unican, si tienen el mismo tamao y cada elemento de una lista es uniable con el elemento del mismo rango en la segunda lista. Ejemplos:
[ debug ] 51 ?- [X , Y ]=[1 ,[5 ,6]]. X = 1, Y = [5 , 6]. [ debug ] 52 ?- [X ,X ,2 ,3]=[1 ,1 , Y , Z ]. X = 1, Y = 2, Z = 3. [ debug ] 53 ?- [X ,X ,2 ,3]=[1 ,5 , Y , Z ]. false . [ debug ] 54 ?- [X ,X ,2 ,3]=[1 ,1 , Y ,Z ,T ]. false .
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
30
Funciones para el manejo de listas De manera muy simple se puede escribir una funcin recursiva member que verica si un elemento apartiene o no a una lista :
member (X ,[ X| _ ]). member (X ,[_ , T ]): - member (X , T ).
El uso :
[ debug ] 56 ?- member (1 ,[3 , 2, 1, 0]). true . [ debug ] 57 ?- member (9 ,[3 , 2, 1, 0]). false . [ debug ] 58 ?- member (9 ,[3 ,[9] , 1, 0]). false .
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
31
inserta(E,
Linicial, Lfinal):
inserta (X ,[] ,[ X |[]]). inserta (X ,Z ,[ X| Z ]). ?- inserta (1 ,[2 ,3] , Z ). Z = [1 , 2, 3]. ?- inserta (R ,[2 ,3] ,[1 ,2 , Y ]). R = 1, Y = 3.
La insercin en la cola
insertz(E,Linicial,Lfinal):
insertz (X ,[] ,[ X |[]]). insertz (X ,[ Y |T ] ,[ Y| Z ]): - insertz (X ,T , Z ). ?- insertz (1 ,[2 ,3] , Z ). Z = [2 , 3, 1] . ?- insertz (1 ,Z ,[3 ,2 ,1]). Z = [3 , 2] . ?- insertz (1 ,Z ,[3 ,2 ,1 ,5]). false .
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
32
que verica si una lista es la imagen
reverso(L1,L2)
de la otra en espejo :
reverso ([] ,[]). reverso ([ X|T ],L ): - insertz (X ,L2 ,L ), reverso (T , L2 ). ?- reverso ([1 ,2] ,[2 ,1]). true . ?- reverso ([1 ,2] , X ). X = [2 , 1] . ?- reverso (Y ,[1 ,2 ,6]). Y = [6 , 2, 1] .
Un predicado anadir(L1,L2,LF) que verica si LF es la concatenacin de las dos listas L1 y L2 en este orden :
anadir ([] ,L , L ). anadir ([ X |R] ,Y ,[ X|F ]): - anadir (R ,Y ,F ).
?- anadir ([1 ,2] ,[3 ,4] , X ). X = [1 , 2, 3, 4]. ?- anadir ([1 ,2] , X ,[1 ,2 ,5 ,6]). X = [5 , 6].
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
33
Este predicado
anadir
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
34
Manejo de conocimiento
esttico o dinmico. es posible de manejar los dos con
assert
retract
y aadir
o reducir la base de hechos, pero un predicado que se dene de manera esttica (con reglas y/o hechos) no se puede usar como dinmico.
F0 = 1,F1 = 1,
FN +2 = FN +1 + FN
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
35
Solucin esttica :
fib (0 ,1). fib (1 ,1). fib (N ,X ): - number (N ),N >=2 , N1 is N -1 , N2 is N -2 , fib (N1 , X1 ), fib (N2 , X2 ),X is X1 + X2 .
La solucin es correcta, pero a cada aplicacin de la regla se re-calcula todos los valores de terrogacin de tipo interrogacin de
fib(i, )
con
i<N.
calculados no se guardan.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
36
fib(N,X) es cier-
fib2
en la resolucion de
fib
fib (N ,X ): -( fib2 (N , X)- > true ; number (N) ,N >=2 , N1 is N -1 , N2 is N -2 , fib (N1 , X1 ) , fib (N2 , X2 ), X is X1 + X2 , assert ( fib2 (N , X ))). inicio : - ( fib (X ,Y )-> assert ( fib2 (X , Y )); fail ).
fib(6,X) produce la insercin de hechos fib2(0,1), fib2(2,2) ....fib(6,13). En la segunda terrogacin fib(6,X) se usa el hecho fib2(6,13) insertado.
Una primer interrogacin
los in-
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
37
findall/3
Predicado
1 X X X X X 2 Z 3 Z
Lista
para hacer el
verdad.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
38
Predicado.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
39
Predicado
9 ?- bagof (X , persona (X ,_ ,_ ,Y ,Z), List ). Y = marie , Z = jean , List = [ george ] ; Y = frida , Z = gabriel , List = [ laura ] ; Y = laura , Z = mario , List = [ miguel ] ; ... 11 ? - bagof (X , Y^ persona (X ,_ ,_ ,Y ,Z) , List ). Z = jean , List = [ george ] ; Z = gabriel , List = [ laura ] ; Z = mario , List = [ miguel ] ; Z = mario , List = [ ana ] ; Z = george , List = [ michel ] ; ...
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
40
El predicado setof funciona de la misma manera que bagof, pero las listas construidas son conjuntos ordenados (ordena y elimina las doblones).
14 ? - bagof (X , Y^ ascendiente (X ,Y ),Z ). Z = [ frida , marie , laura , laura , danielle , ana , ana , ana , gabriel |...]. 15 ? - setof (X ,Y^ ascendiente (X ,Y ),Z ). Z = [ ana , danielle , frida , gabriel , george , jean , laura , marie , mario |...].
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU
41
write/1
writeln/1
read/1.
UAM Azcapotzalco
otoo 2010
c Mihaela JUGANARU