380 likes | 661 Views
PROLOG Programación Lógica. Mar Mejía Murillo. CONTENIDO. Introducción Sintáxis Tipos Expresiones Unificación Funciones Listas Iteración Backtracking. Aplicaciones. Negación y Cortes Cláusulas de Gramáticas definidas Estructuras de datos incompletas Programación de Meta Nivel
E N D
PROLOG Programación Lógica Mar Mejía Murillo
CONTENIDO • Introducción • Sintáxis • Tipos • Expresiones • Unificación • Funciones • Listas • Iteración • Backtracking • Aplicaciones • Negación y Cortes • Cláusulas de Gramáticas definidas • Estructuras de datos incompletas • Programación de Meta Nivel • Programación de Segundo Orden • Bases de Datos • Sistemas Expertos • Programación Orientada a Objetos
INTRODUCCIÓN Programas lógicos y cómputos Programa lógico (o relacional): conjunto de hechos y reglas que definen relaciones entre objetos Cómputo: deducción de que un objetivo O es consecuencia lógica de las relaciones definidas en un programa lógico P P -> O
INTRODUCCIÓN Objetos, relaciones y objetivos Objetos: se corresponden con los datos se representan mediante términos Relaciones: se corresponden con los procedimientos se definen mediante hechos y reglas Objetivos: se corresponden con el programa principal se definen mediante consultas
INTRODUCCIÓN • ¿Cómo se escribe un programa lógico? • Para escribir un programa lógico debemos identificar: • qué objetos intervienen en el problema, • cuáles son las relaciones entre éstos, y • qué objetivos queremos alcanzar • Una vez identificados los elementos anteriores debemos: • representar los objetos mediante términos • definir las relaciones mediante hechos y reglas • definir los objetivos mediante consultas
INTRODUCCIÓN Problema: escribir un programa lógico que defina relaciones de parentesco y deduzca qué personas están emparentadas Antonio María Elena Carlos Eva David Fernando Silvia Emilio
INTRODUCCIÓN Identificando objetos y relaciones OBJETOS RELACIONES Antonio María Elena Carlos Eva David Fernando Silvia Emilio
INTRODUCCIÓN La familia completa definida en Prolog padre(antonio,carlos). padre(antonio,eva). padre(carlos,fernando). padre(carlos,silvia). padre(david,emilio). madre(maría,carlos). madre(maría,eva). madre(elena,fernando). madre(elena,silvia). madre(eva,emilio).
INTRODUCCIÓN Deduciendo objetivos Objetivos: son preguntas sobre el parentescodefinidas mediante consultas Ejemplos: ¿es David padre de Emilio? :- padre(david,emilio). ¿quiénes son los hijos de Eva? :- madre(eva,X). ¿quién es el padre de Silvia? :- padre(P,silvia).
INTRODUCCIÓN Identificando Relaciones implícitas TIO ABUELO Antonio María Elena Carlos Eva David Fernando Silvia Emilio PRIMOS HERMANOS
INTRODUCCIÓN • Una mala idea... • Definimos las relaciones extra mediante hechos: • hermanos(carlos,eva). • hermanos(fernando,silvia). • Inconvenientes: • tamaño excesivo • propenso a errores • mantenimiento (nacimientos, etc.) • adaptabilidad a otras situaciones (familias) • Sería preferible definir esta relación de forma genérica,identificando las condiciones bajo las cuales dos personas “A” y“B” son hermanos
INTRODUCCIÓN Definiendo relaciones mediante reglas ¿Cómo podemos definir la relación “hermanos”? “A y B son hermanos si comparten los padres” Definiremos la relación condicional anterior mediante la regla: hermanos(A,B) :- padre(P,A), madre(M,A), padre(P,B), madre(M,B), A \== B.
INTRODUCCIÓN Reglas para identificar objetos y relaciones Objetos: nombres propios y comunes, en singular o plural Relaciones: verbos y formas verbales A veces es posible más de una formalización, y la diferencia entreobjeto y relación no está clara... Una relación determina un conjunto de objetos: aquéllos que la satisfacen. Por tanto, una relación puede emplearse para referirnos a estos objetos. Ejemplo: “Los hijos de Antonio” :- padre(antonio,H)
INTRODUCCIÓN Datos: objetos y términos Los objetos (datos) se representan mediante términos: átomo entero constante número real término variable estructura
INTRODUCCIÓN • Átomos • Uso: • representan objetos concretos mediante un nombre; esdecir, denominan a un objeto en particular • Sintaxis: • secuencias de letras, dígitos y _ comenzando por minúscula • ejemplos: antonio, x, lista_vacía, x25 • secuencias de caracteres entre apóstrofes • ejemplos: ‘antonio garcía’, ‘Antonio’ • secuencias de símbolos especiales • ejemplos: +, -, ===, ::=, :=, <->
INTRODUCCIÓN Números Uso: representan números enteros y reales Sintaxis: enteros: 2, 34, -56 reales: -0.0092, 4.5e-5 Se aplican las restricciones típicas de rango (enteros y reales) yprecisión (reales)
INTRODUCCIÓN • Variables • Uso: • representan objetos porsemejantes a incógnitas: no se les puede asignar valores a voluntad. • Sintaxis: • Secuencia de letras, dígitos y _ comenzando por mayúscula o _ • Ejemplos: • X1 • Padre • _X • Num_Telef • ListaClientes
INTRODUCCIÓN NOMBRE Estructuras Uso: representan objetos compuestos que pueden ser concretos (no contienen variables) o por determinar (contienen variables) Sintaxis:átomo(término1,...,términon) Ejemplos: fecha(17,agosto,2001) % fecha/3 cita(silvia,fecha(Día,enero,2002)) % cita/2 Al par nombre/aridad se le denomina functor de la estructura Sin espacios ARIDAD
INTRODUCCIÓN Estructuras El “tipo” de una estructura está determinado por su functor: fecha/3, cita/2 Puede emplearse el mismo nombre con diferentes aridades: se trata de functores distintos Ejemplo: fecha(17,agosto,2001) % fecha/3 fecha(14,abril) % fecha/2
INTRODUCCIÓN • Sintaxis (simplificada) de los términos • término ::= átomo • | número • | variable • | estructura • estructura ::= átomo(argumentos) • argumentos ::= término • | término , argumentos
INTRODUCCIÓN • Prolog comprueba la sintaxis de los términos... • detecta y señala los siguientes errores sintácticos: • 2pi • fecha(12,,2001) • cita(fernando,fecha(2,diciembre,2001)
INTRODUCCIÓN Pero la intención es lo que cuenta... La intención es representar las fechas por términos de la forma: fecha(día,mes,año) donde día pertenece a {1,...,31} mes pertenece a {enero,...,diciembre} año pertenece a {2000,...} Pero Prolog no puede detectar usos inadecuados: fecha(enro,2,2001) La sintaxis es correcta, pero el orden de los argumentos no es el esperado y enro no es un mes válido Prolog no conoce las intenciones del programador: no hay declaraciones de tipo
INTRODUCCIÓN • ¿Cómo se representa un objeto en Prolog? • El programador lógico debe decidir una sintaxis adecuada para • cada tipo de dato: • Constantes: • qué nombre o número resulta apropiado • Variables: • se emplean para objetos por determinar (plantillas) • Estructuras: • functor • orden y sintaxis de los argumentos, recursión. • Sin embargo, no hay forma de comunicar a Prolog esta intención: • no hay declaraciones de tipo
INTRODUCCIÓN Ejemplo: representación de pilas Para representar el TAD pila, el programador debe elegir una sintaxis adecuada: Sintaxis: tad_pila ::= pila_vacía | pila(cima,tad_pila) cima::= término Pero no es posible comunicar a Prolog esta sintaxis...
INTRODUCCIÓN Ejemplos de pilas bien formadas: pila(a,pila(b,pila(c,pila_vacía))) pila(a,pila(fecha(2,enero,2001),pila_vacía)) pila(pila_vacía,pila_vacía) Ejemplos de términos Prolog que no son pilas bien formadas: pila(pila_vacía) pila(a,pila(b))
INTRODUCCIÓN Las estructuras que contienen variables son plantillas: Ejemplos: pilas con 2 elementos y a en la cima pila(a,pila(X,pila_vacía)) pilas de 3 elementos cualesquiera pila(X,pila(Y,pila(Z,pila_vacía))) pilas de al menos un elemento pila(X,Y) pilas que tienen una b como segundo elemento pila(X,pila(b,Y)) Las dos últimas plantillas suponen que Y es una pila
INTRODUCCIÓN CIRCUITOS DIGITALES • Objetos: • variables de entrada (a,b,c,...,x,y,z) • puertas lógicas (or, and, nand, not)
INTRODUCCIÓN Representación: entradas -> átomos puertas -> estructuras or/2,and/2,nand/2,not/1 Sintaxis: circuito::= entrada | or(circuito, circuito) | and(circuito, circuito) | nand(circuito, circuito) | not(circuito) entrada ::= átomo Queda: or(and(x,y),z)
INTRODUCCIÓN Representando términos mediante árboles Un término Prolog puede representarse como un árbol: constantes y variables ->hojas estructuras n-arias -> nodos n-arios Ejemplo: cita(silvia,fecha(Día,diciembre,2001)) cita silvia fecha Día diciembre 2001
INTRODUCCIÓN Procedimientos: relaciones entre objetos Los procedimientos en programación lógica se denominan Relaciones Cada procedimiento tiene un nombre y una aridad que lo identifican de manera unívoca “X es padre de Y” -> padre(X,Y) -> padre/2 “la pila P es vacía” -> es_vacía(P) -> es_vacía/1
INTRODUCCIÓN • Los procedimientos pueden satisfacerse o fracasar • padre(antonio,eva) -> éxito • es_vacía(pila(x,pila(Y,pila_vacía)))-> fracaso • Los procedimientos no devuelven valores • padre(antonio,padre(carlos,silvia)) -> error • lo anterior no expresa que antonio es abuelo de silvia. • Las llamadas anidadas no se ejecutan: son argumentos (datos) • Los procedimientos se definen mediante un conjunto de hechosy reglas
INTRODUCCIÓN Definiendo hechos Uso: definen relaciones incondicionales Sintaxis:átomo. átomo(término1,...,términon). Ejemplos: padre(antonio,eva). % padre/2 es_vacía(pila_vacía). % es_vacía/1 es_par(8). % es_par/1 no_es_vacía(pila(Cima,Resto)). % no_es_vacía/1
INTRODUCCIÓN Definición de Reglas Conclusión cierta si se satisfacen TODAS las condiciones
INTRODUCCIÓN “Los caballeros rescatan a las princesas secuestradas por dragones” procedimiento rescata/2: rescata(C,P) :- es_caballero(C), es_princesa(P), es_dragon(D), secuestrada(P,D).
INTRODUCCIÓN Las variables son locales a los hechos y reglas “P es un pato si tiene plumas y hace cuac, o si es sobrino de un pato” procedimiento es_pato/1: es_pato(P) :- tiene_plumas(P), hace_cuac(P). es_pato(P) :- es_pato(T), sobrino(P,T). Las variables no son locales a los procedimientos
INTRODUCCIÓN Los procedimientos pueden ser recursivos “X es progenitor de Y si es su padre o su madre” procedimiento progenitor/2: progenitor(X,Y) :-padre(X,Y). progenitor(X,Y) :-madre(X,Y). “X es antepasado de Y si es su progenitor o progenitor de uno de sus antepasados” procedimiento antepasado/2: antepasado(X,Y) :-progenitor(X,Y). antepasado(X,Y) :-progenitor(X,Z), antepasado(Z,Y).