1 Lenguajes de Programacin Captulo V: Programacin Lgica Departamento de Informtica Universidad Tcnica Federico Santa Mara 2 Lenguajes de Programacin 5.1 Breve Introduccin al Clculo de Predicados Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-3 Lenguajes de Programacin Definiciones Bsicas Proposicin: sentencia lgica que puede ser verdadera o falsa. Se construye de objetos y relaciones. Lgica formal provee mtodos para verificar su validez Lgica Simblica: permite expresar proposiciones, relaciones entre proposiciones y cmo inferir nuevas proposiciones que son verdaderas. Clculo de Predicado: Forma particular de lgica simblica usada en programacin lgica. Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-4 Lenguajes de Programacin Objetos y Trminos Compuestos Objetos se representan como un nico trmino, que puede ser: constante : representa un nico objeto variable : puede representar diferentes objetos Trmino compuesto: consiste de functor y una lista de parmetros Un trmino con n parmetros se denomina n-tupla. El trmino padre(maria, jess) es una 2-tupla. Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-5 Lenguajes de Programacin Proposiciones Proposiciones pueden ser: Atmicas: corresponde a un nico trmino compuesto Compuestas: dos o ms proposiciones atmicas conectadas por operadores lgicos. Una proposiciones puede ser: Hecho: se define como una verdad (axioma) Consulta: la verdad debe ser probada (teorema)
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-6 Lenguajes de Programacin Proceso de Resolucin Presencia de variables requiere de un proceso de calce (matching) que al reemplazar sus valores produce una verdad (xito). Este proceso se denomina unificacin. Asignacin temporal de valores a variables se denomina instanciacin. Fallas (no xito) en la instanciacin requiere de backtracking.
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-7 Lenguajes de Programacin Clusulas de Horn Clusulas de Horn simplifican el proceso de resolucin, y permiten representar la mayora de las proposiciones lgicas. Slo permite dos tipos de formas: Existe slo una proposicin atmica en la izquierda de la clusula (clusula con cabeza) El lado izquierdo est vaco (clusula sin cabeza) Clusulas con cabeza se usan para definir reglas, en cambio clusulas sin cabezas slo establecen ciertos hechos. Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-8 Lenguajes de Programacin Significado Declarativo versus Procedural La clusula:
P <= Q, R.
Se interpreta declarativamente como:
p es verdadero si Q y R lo son. De Q y R se deriva P.
En cambio una interpretacin procedural sera:
Para resolver P, primero se debe resolver Q y luego R. Para satisfacer a P, primero se debe satisfacer Q y luego R. Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-9 Lenguajes de Programacin Conclusiones Programacin Lgica consiste bsicamente en definir un conjunto de reglas y hechos (hiptesis). El sistema luego debe ser capaz de inferir si una determinada proposicin (meta) es una verdad. Prolog est basado en el uso de clusulas de Horn. Departamento de Informtica Universidad Tcnica Federico Santa Mara 10 Lenguajes de Programacin 5.2 Introduccin a Prolog Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-11 Lenguajes de Programacin Caractersticas de Prolog Basado en Lgica y programacin declarativa Produce estilo de programacin orientado a metas No se especifica cmo debe hacerse, sino qu debe lograrse (alto nivel) El programador se concentra ms en el conocimiento que en los algoritmos Qu es conocido? (hechos y relaciones ) Qu preguntar? (cmo resolverlo)
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-12 Lenguajes de Programacin Hechos en Prolog: Ejemplo padre(maria, pedro). padre(juan, pedro). padre(juan, carola). padre(pedro, ana). padre(pedro, paty). padre(paty, aldo).
ana maria juan pedro carola paty aldo Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-13 Lenguajes de Programacin Consultas en Prolog ?- padre(pedro, ana). => yes
?- padre(ana, paty). => no
?- padre(X, carola). => X = juan
?- padre(pedro, X). => X = ana ; => X = paty ; => no
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-14 Lenguajes de Programacin Consulta: Ejemplo 1 Preguntar por el abuelo de aldo:
X, Y : (X es padre de Y) (Y es padre de aldo)
que se expresa en Prolog como:
?- padre(X, Y), padre(Y, aldo). => X = pedro Y = paty
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-15 Lenguajes de Programacin Consulta: Ejemplo 2 Preguntar por los nietos de juan:
X, Y : (juan es padre de X) (X es padre de Y)
que se expresa en Prolog como:
?- padre(juan, X), padre(X, Y). => X = pedro Y = ana ;
=> X = pedro Y = paty
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-16 Lenguajes de Programacin Consulta: Ejemplo 3 Preguntar si ana y paty tienen un padre en comn:
X : (X es padre de ana) (X es padre de patricio)
que se expresa en Prolog como:
?- padre(X, ana), padre(X, paty). => X = pedro
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-17 Lenguajes de Programacin Otros Hechos Agregar clusulas sobre el sexo de las personas (relaciones unarias):
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-18 Lenguajes de Programacin Alternativa de definicin de hechos Podra haberse definido tambin con una relacin binaria:
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-19 Lenguajes de Programacin Reglas en Prolog La relacin: a b se expresa en Prolog como: a :- b. Una clusula de este tipo se denomina regla, que tiene la siguiente estructura: la cabeza (parte izquierda de :- ) es la conclusin la proposicin definida en el cuerpo (parte derecha de :- ) Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-20 Lenguajes de Programacin Resolucin Simple La relacin hijo de corresponde a: X, Y : (Y es hijo de X) (X es padre de Y) que se expresa en Prolog como: hijo(X, Y) :- padre(Y, X).
Ejemplo: la meta siguiente es evaluada como: La meta: hijo(paty, pedro) se convierte en submeta padre(pedro, paty) Se busca este hecho: yes Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-21 Lenguajes de Programacin Ejemplo de Reglas Se puede definir ahora varias nuevas reglas como:
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-22 Lenguajes de Programacin Ejemplo de Consulta ?- hermana(ana, paty). => yes
?- hermana(X, paty). => X = ana ; => X = paty oops ... paty es hermana de ella misma Falta excluir este caso:
hermana(X, Y) :- diferente(X, Y), padre(Z, X), padre(Z, Y), femenino(X). Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-23 Lenguajes de Programacin Resumiendo... Programas Prolog se extienden simplemente agregando ms clusulas Clusulas son de tres tipos: hechos, reglas y consultas Reglas declaran cosas que cuya verdad depende de otras condiciones Por medio de consultas el usuario puede solicitar al programas que establezca qu cosas son verdad Una clusula tiene una cabeza y un cuerpo. El cuerpo son metas separadas por comas (conjuncin) Hechos son clusulas que no tienen cuerpo Preguntas slo tienen cuerpo Reglas tienen cabeza y cuerpo Una evaluacin puede sustituir una variable X por otro objeto (se dice que X se instancia) Variables se cuantifican universalmente ()
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-24 Lenguajes de Programacin Reglas Recursivas La relacin antepasado se define sobre la base de una regla de descendencia directa y otra regla de descendencia indirecta:
X, Z : (X es un antepasado de Z), si {X es padre de Z } { Y: (X es padre de Y) (Y es antepasado de Z) }
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-25 Lenguajes de Programacin Ejemplo de Consulta % Consultar por los descendientes de maria
?- antepasado (maria, X) => X = pedro ; => X = ana ; => X = paty ; => X = aldo
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-26 Lenguajes de Programacin Resolucin de Consulta antepasado(juan, paty) NO SI padre(juan, paty) Regla#1 padre(juan, X) antepasado(X, paty) Regla#2 antepasado(pedro, paty) Hecho: padre(juan, pedro) X=pedro padre(pedro, paty) Regla#1 ana maria juan pedro carola paty aldo Departamento de Informtica Universidad Tcnica Federico Santa Mara 27 Lenguajes de Programacin 5.3 Tipos de Datos en Prolog Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-28 Lenguajes de Programacin Objetos de Datos en Prolog Objetos de datos simples Objetos estructurados Calce de operaciones fundamentales sobre objetos Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-29 Lenguajes de Programacin Reconocimiento de Tipos Se reconoce el tipo de un dato por su forma sintctica; no se requiere de declaracin de tipos Ejemplo: Variables se definen comienzan con primera en maysculas (e.g. X) Atomos comienzan con una letra en minscula (e.g. pedro) Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-30 Lenguajes de Programacin Atomos 1) Strings de letras, dgitos y underscore (_), comenzando con minscula pedro nil x_25 algo_especial 2) Strings de caracteres especiales <----> ===> ... 3) Strings con citacin simple Juan San Francisco
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-31 Lenguajes de Programacin Variables Strings de letras, dgitos y underscore, comenzando con mayscula o underscore. X Resultado _X1 _12 Si una variable aparece una solo vez en una clusula, se puede usar variables annima _ ?- padre(juan, _). yes % no se imprime variable tiene_hijo(X) :- padre(X, _). mbito de variable es una clusula Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-32 Lenguajes de Programacin Ejemplo con Figuras Geomtrica 2 4 6 8 2 4 6 P2 = (2,3) P1 = (1,1) (6,4) (7,1) (4,2) T S P1 = punto(1, 1) P2 = punto(2,3) S = seg(P1, P2) T = triangulo (punto(4,2), punto(6,4), punto(7,1)) Departamento de Informtica Universidad Tcnica Federico Santa Mara 33 Lenguajes de Programacin 5.4 Calce de Trminos en Prolog Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-34 Lenguajes de Programacin Concepto de Calce La operacin ms importante sobre trminos es el calce, que corresponde a la unificacin en el clculo de predicados. Dos trminos calzan si: Son idnticos Las variables en ambos trminos pueden ser instanciados, sustituyendo variables, tal que los trminos se hacen idnticos.
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-35 Lenguajes de Programacin Ejemplo de Calce Calzar: fecha(D, M, 2000) y fecha(D1, mayo, A1) , entonces: D se instancia a D1 M se instancia a mayo A1 se instancia a 2000 Que como salida de Prolog se escribe: D = D1 M= mayo A1 = 2000 Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-36 Lenguajes de Programacin Ejemplo de Calce Calzar: fecha(D, M, 2000) y fecha(D1, julio, 1956) , entonces:
No es posible encontrar un calce (se dice que el proceso de calce ha fracasado). En caso contrario, se dice que el proceso ha sido exitoso.
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-37 Lenguajes de Programacin Ejemplo de Calce en Prolog ?- fecha(D, M, 2000) = fecha(D1, mayo, A1). D = H86 M = mayo D1 = H86 A1 = 2000
?- fecha(D, M, 2000) = fecha(D1, julio, 1956). no
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-38 Lenguajes de Programacin Reglas de Calce Dos trminos S y T calzan, si: Si S y T son constantes, entonces S y T calzan si ambos son el mismo objeto. Si S es una variable y T cualquier cosa, entonces calzan y S se instancia como T. Viceversa, si T es variable, entonces T se instancia como S. Si S y T son estructuras, entonces calzan slo si: S y T tienen el mismo functor, y Todas sus correspondientes componentes calzan. Instanciaciones resultantes es determinado por proceso de calce de componentes. Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-39 Lenguajes de Programacin Grado de Ajuste del Calce ?- fecha(D, M, 2000) = fecha(D1, mayo, A1).
Podra haber sido calzado como: D = 1 D1 = 1 M = mayo A1 = 2000 Pero esta forma es ms restrictiva (menos general) que la anterior.
Prolog calza el resultado a su forma ms general!
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-40 Lenguajes de Programacin Ejemplo de Calce de Estructuras triangulo punto punto A 1 1 2 3 triangulo punto punto X 4 Y 2 Z ?- triangulo(punto(1, 1), A, punto(2, 3)) = triangulo(X, punto(4, Y), punto(2, Z)). A = punto(4,H193) X = punto(1,1) Y = H193 Z = 3 Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-41 Lenguajes de Programacin Ejemplo de Calce con Estructuras ?- vertical(seg(punto(1,1), punto(1,2))). yes
?- vertical(seg(punto(1,1), punto(2,Y))). no
?- horizontal(seg(punto(1,1), punto(2,Y))). Y = 1
?- vertical(seg(punto(2,3), Y)). Y = punto(2,H561)
?- vertical(S), horizontal(S). S = seg(punto(H576,H577),punto(H576,H577)) Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-42 Lenguajes de Programacin Disjuncin en Clusulas La clusula:
P :- Q; R.
Se puede interpretar como:
P :- Q. P :- R.
La clusula:
P :- Q, R; S, T, U.
Se puede interpretar como:
P :- Q, R. P :- S, T, U.
Departamento de Informtica Universidad Tcnica Federico Santa Mara 43 Lenguajes de Programacin 5.5 Listas y Operadores Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-44 Lenguajes de Programacin Listas en Prolog Una lista en Prolog se puede escribir como: [perro, gato, ratn, loro] Sin embargo esto es slo un sabor sintctico, pues Prolog lo traduce una forma de estructura. Si existe la estructura .(Cabeza, Cola), entonces: .(perro, .(gato, .(ratn, .(loro, [])))) equivale a la lista anterior (que es ms legible) Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-45 Lenguajes de Programacin Representacin de Listas Una lista define un rbol binario, similar a las listas propias de Scheme. Prolog permite una notacin similar a los pares: L = [a | Cola] , donde a es la cabeza (cualquier tipo) y Cola es el resto de la lista (debe ser una lista) . La lista vaca se expresa como []. Ejemplo: ?- L2 = [ a | [b | []]]. L2 = [a,b]
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-46 Lenguajes de Programacin Algunos Posibles Operadores sobre Listas Membresa del objeto X en la lista L: member(X, L) Concatenacin de listas L1 y L2 en L3 conc(L1, L2, L3) Agregar un elemento X en una lista L add(X, L, L1) Borrar un elemento X en una lista L del(X, L, L1)
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-47 Lenguajes de Programacin Definicin de Operadores (1/2) %definicion de membresia de X en una lista L: member(X, L). % ============================================
% concatenacion de listas L1 y L2 en lista L3: conc(L1, L2, L3). % ==============================================
% concat. con lista vacia es la misma lista conc([], L, L).
% caso de que primera lista no est vaca conc([X | L1], L2, [X | L3]) :- conc(L1, L2, L3). Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-48 Lenguajes de Programacin Ejemplos de Operadores con Listas ?- member(X, [a, b]). X = a ; X = b ; no
?- conc([a], [b], L). L = [a,b] ; no
?- add(a, X, Y). X = H918 Y = [a | H918] ; no
?- del(b, [a, b, c, b, d], L). L = [a,c,b,d] ; L = [a,b,c,d] ; no
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-49 Lenguajes de Programacin Sublistas Una sublista es una parte de una lista El operador puede ser definido con la siguiente regla:
Ejemplo: ?- sublist([b, X], [a, b, c, d]). X = c
sublist(S, L) :- conc(L1, L2, L), conc(S, L3, L2). Departamento de Informtica Universidad Tcnica Federico Santa Mara 50 Lenguajes de Programacin 5.6 Operadores y Aritmtica Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-51 Lenguajes de Programacin Notacin de Operadores Las operaciones en Prolog se expresan normalmente como functores. Se permite tambin especificar operadores especiales con su relacin de precedencia mediante directivas al traductor Prolog. Este mecanismo permite mejorar la lectura de programas (sabor sintctico), similar a la sobrecarga de operadores en C++ Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-52 Lenguajes de Programacin Ejemplo de Operadores La expresin:
+(*(2, a), *(b, c))
podra escribirse como:
2*a + b*c
Que resulta ms legible!!
Ejemplo en Prolog:
?- X = +(*(2, 3), *(4, 5)). X = 2 * 3 + 4 * 5
?- X is +(*(2, 3), *(4, 5)). X = 26 .
?- X is 2*3 + 4*5. X = 26
Se ha supuesto que + tiene mayor precedencia que * Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-53 Lenguajes de Programacin Ejemplo: Mximo Comn Divisor mcd(X, X, X).
mcd(X, Y, D) :- X<Y, Y1 is Y-X, mcd(X, Y1, D).
mcd(X, Y, D) :- Y<X, mcd(Y, X, D). Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-54 Lenguajes de Programacin Ejemplo: Mximo Comn Divisor ?- mcd(100, 10, X).
X = 10
?- mcd(27, 36, X).
X = 9
Departamento de Informtica Universidad Tcnica Federico Santa Mara 55 Lenguajes de Programacin 5.7 Ejemplos de Programas con Estructuras Departamento de Informtica Universidad Tcnica Federico Santa Mara 56 Lenguajes de Programacin Ejemplo de Programa Problema de las Ocho Reinas Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-57 Lenguajes de Programacin Problema de las Ocho Reinas 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-58 Lenguajes de Programacin Solucin #1 en Prolog solucion1([]). solucion1([X/Y | Otras]) :- % primera reina en X/Y solucion1(Otras), member(Y, [1,2,3,4,5,6,7,8]), noataque(X/Y, Otras). % Primera reina no ataca a otras
noataque(_, []). noataque(X/Y, [X1/Y1 | Otras]) :- Y =\= Y1, % diferentes filas Y1 - Y =\= X1 - X, % diferentes diagonales Y1 - Y =\= X - X1, noataque(X/Y, Otras). % Primera reina no ataca a otras
Departamento de Informtica Universidad Tcnica Federico Santa Mara 60 Lenguajes de Programacin 5.8 Control de Backtracking Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-61 Lenguajes de Programacin Porqu controlar Backtracking? Prolog realiza backtracking automtico si falla la satisfaccin de una clusula Sin embargo, en algunos casos el backtracking automtico es ineficiente El programador puede controlar o prevenir el backtracking usando cut. Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-62 Lenguajes de Programacin Ejemplo de una Funcin Suponga las siguientes tres reglas para una funcin de doble escaln: Regla#1: Si (X<3) entonces Y=0 Regla#2: Si (3 X) y (X<6), entonces Y=2 Regla#3: Si (6X), entonces Y =4 3 6 2 4 Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-63 Lenguajes de Programacin Funcin Expresada en Prolog f(X, 0) :- X<3. % regla #1
f(X, 2) :- 3 =< X, X < 6. % regla #2
f(X, 4) :- 6 =< X. % regla #3
% La consulta siguiente
-? f(1, Y), 2<Y.
no
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-64 Lenguajes de Programacin Evaluacin de la Meta f(1, Y) 2<Y 1<3 2<0 2<0 NO! Regla#1 Y=0 31 1<6 2 < 2 Regla#2 Y=2 NO! Regla#3 Y=4 NO! 61 2<4 CUT Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-65 Lenguajes de Programacin Funcin Expresada en Prolog usando CUT f(X, 0) :- X<3, !. % regla #1
f(X, 2) :- 3 =< X, X < 6, !. % regla #2
f(X, 4) :- 6 =< X. % regla #3
-? f(1, Y), 2<Y.
no
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-66 Lenguajes de Programacin Optimizando Evaluacin de Funcin usando CUT f(X, 0) :- X<3, !. % regla #1
f(X, 2) :- X < 6, !. % regla #2
f(X, 4) . % regla #3
-? f(7, Y).
Y=4
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-67 Lenguajes de Programacin Negacin como Falla A Mara le gustan los animales: gusta(maria, X) :- animal(X). Pero no le gustan las serpientes!! Expresado en Prolog:
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-68 Lenguajes de Programacin Ejemplos de Negacin La verificacin si dos expresiones difieren:
diferente(X, Y) :- X = Y, !, fail ; true.
El procedimiento interno not de Prolog se comporta como:
not(P) :- P, !, fail ; true.
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-69 Lenguajes de Programacin Aplicacin de la Negacin La funcin diferente ahora se puede escribir como:
diferente(X, Y) :- not(X =Y).
Y la regla de Maria:
gusta(maria, X) :- not(X = serpiente), animal(X).
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-70 Lenguajes de Programacin Problema de las 8 Reinas Expresada con Negacin solucion1([]).
solucion1([X/Y | Otras]) :- % primera reina en X/Y solucion1(Otras), member(Y, [1,2,3,4,5,6,7,8]), not ataque(X/Y, Otras). % Primera reina no ataca a otras
ataque(X/Y, Otras) :- member(X1/Y1, Otras), (Y = Y1; % en la misma filas, Y1 is Y + X1 - X; % en la mismas diagonales Y1 is Y + X - X1).
Departamento de Informtica Universidad Tcnica Federico Santa Mara V-1-71 Lenguajes de Programacin Uso de Cut y Negacin Ventajas Se puede aumentar la eficiencia Se pueden expresar reglas que son mutuamente exluyentes Desventajas Se pierde correspondencia entre significado declarativo y procedural Cambio del orden de las clusulas puede afectar significado declarativo