Subido por Cesar Barrutieta

300227148-programacion-Logica-y-Funcional-Unidad-4

Anuncio
Programación Lógica y Funcional
UNIDAD 4
Fundamentos de la programación lógica
4.1. Repaso de la lógica de primer orden.
4.2. Unificación y resolución.
4.3. Cláusulas de Horn. Resolución SLD.
4.4. Programación lógica con cláusulas de Horn.
4.5. Semántica de los programas lógicos.
4.6. Representación clausada del conocimiento.
4.7. Consulta de una base de cláusulas
4.8. Espacios de búsqueda.
4.9. Programación lógica con números, listas y árboles.
4.10. Control de búsqueda en programas lógicos
4.11. Manipulación de términos. Predicados metalógicos.
Pág. 1
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.1. Repaso de la lógica de primer orden.
Una contradicción. La palabra no tienen ninguna connotación insultante, implemente
es la forma correcta de decir que algo se contradice a sí mismo: El caballo de Santiago
es blanco y negro. Hay menos y más de dos manzanas en el cesto.
Capcioso. Otra palabra que no pretende ser insultante. Indica las preguntas que la
persona que debe responderlas no puede responder, porque esa persona no acepta
alguna suposición implítica en la pregunta: "¿Cuándo mató a su madre?" "¡Pero si
mamá vive!" "¡Responda la pregunta!".
Falacia. Una falacia es un error lógico en un razonamiento. Cuando un razonamiento
contiene una falacia, ese razonamiento no es válido como razonamiento lógico.
Puede servir para hacer política ("Mi padre fue conservador, y por tanto yo lo soy,
pero sospecho que el suyo fue asaltador de caminos..."), pero no son razonamientos
válidos en lógica. Más sobre falacias en el excelente artículo de la Red Atea sobre
lógica y falacias (o en cualquier buen manual de lógica).
FUNCION. Una cosa que se evalúa de algún modo. Por ejemplo: "logaritmo (2)" o
"esposa (Pepe)".
o Se lee "logaritmo neperiano de 2" y "esposa de Pepe".
o Si la esposa de Pepe es Maruja, "esposa (Pepe)" se evalúa a Maruja.
PREDICADO. Un tipo de función, que se evalúa a cierto o falso, osea una "frase" que
puede ser cierta o falsa.
Por ejemplo: "x > 2", "Pepe lleva un sombrero". Se dice que los predicados se evalúan
a cierto o falso, lo que en lenguaje normal decimos "ser" verdadero o falso.
Pág. 2
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.2. Unificación y resolución.
El Método de Resolución es un intento de mecanizar el proceso de deducción natural
de forma eficiente.
Las demostraciones se consiguen utilizando el método refutativo (reducción al
absurdo), es decir lo que se intenta es encontrar contradicciones. Para probar una
sentencia basta con demostrar que su negación nos lleva a una contradicción con las
sentencias conocidas (es insatisfactible).
ALGORITMO DE RESOLUCION
Existen distintas Estrategias de Resolución: sistemática, con conjunto soporte,
unitaria, primaria y lineal.
El procedimiento de resolución consiste en un proceso iterativo en el cual
comparamos (resolvemos), dos cláusulas llamadas cláusulas padres y producimos una
nueva cláusula que se ha inferido (deducido), de ellas.
EJEMPLO
Por ejemplo, supongamos que tenemos las clausulas siguientes (ambas verdaderas):
invierno  verano (es invierno o es verano)
 invierno  frio (hace frio o no es invierno)
Aplicando resolución, podemos combinar ambas clausulas y obtener:
invierno  verano   invierno  frio
Ahora podemos hacer una simplificación, ya que (invierno  invierno) es una
tautología, con lo que nos queda:
verano  frio (es verano o hace frio)
La resolución opera tomando dos cláusulas tales que cada una contenga un mismo
literal, en una cláusula en forma positiva y en la otra en forma negativa. El resolvente
se obtiene combinando todos los literales de las cláusulas padres y eliminando
aquellos que se cancelan.
Pág. 3
Programación Lógica y Funcional
ALGORITMO DE UNIFICACION
Podemos definir la Unificación como un procedimiento de emparejamiento que
compara dos literales y descubre si existe un conjunto de sustituciones que los haga
idénticos.
ALGORITMO
1. En primer lugar se comprueba si los predicados coinciden. Si es así, seguimos
adelante; si no es que no son unificables.
2. Si el predicado concuerda, comenzamos a comparar los argumentos. Si el
primero de ellos coincide en ambos literales, continuamos con el siguiente... y
así hasta completar todos los argumentos.
3. Para conseguir que cada argumento de un literal sea coincidente con su
homólogo en el otro literal, debemos buscar una sustitución que nos permita
emparejarlos.
4. La única condición que debe reunir esta sustitución es que ha de aplicarse a
todo el literal, es decir, que la sustitución afecta a todo el literal, y no sólo al
argumento en cuestión.
Ejemplo
Se unificara P(x, x) con P(y, z):
Primera sustitución: (y/x)
Resultado: P(y, y) P(y, z)
Segunda sustitución: (z/y)
Resultado: P(z, z) P (z, z)
La sustitución resultante es la composición de las sustituciones: s = { z/y , y/x}
Pág. 4
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.3. Cláusulas de Horn. Resolución SLD.
En lógica proposicional, una fórmula lógica es una cláusula de Horn si es una cláusula
(disyunción de literales) con, como máximo, un literal positivo. Se llaman así por el
lógico Alfred Horn, el primero en señalar la importancia de estas cláusulas en 1951.
Una cláusula de Horn con exactamente un literal positivo es una cláusula "definite";
en álgebra universal las cláusulas "definites" resultan como cuasi-identidades. Una
cláusula de Horn sin ningún literal positivo es a veces llamada cláusula objetivo (goal)
o consulta (query), especialmente en programación lógica.
EJEMPLOS
Se llaman cláusulas de Horn aquellas que tienen como máximo un literal positivo. Hay
dos tipos:

Las cláusulas determinadas (definite clauses), o «cláusulas de Horn con
cabeza» son las que sólo tienen un literal positivo:
(¬p1 ¬p2 ... ¬pk q) (p1 p2 ... pk q)

Caso particular son las no tienen más que ese literal positivo, que representan
«hechos», es decir, conocimiento factual.

Los objetivos determinados (definite goals), o «cláusulas de Horn sin cabeza»
son las que no tienen ningún literal positivo:
(¬p1 ¬p2 ... ¬pk) ¬(p1 p2 ... pk)
RESOLUCION SLD
La resolución general es un mecanismo muy potente de demostración pero tiene un
alto grado de indeterminismo: en la selección de las clausulas con las que hacer
resolución y en la selección de los literales a utilizar en la resolución.
Los hechos y las reglas se denominan clausulas definidas: Los hechos representan
“hechos acerca de los objetos” (de nuestro universo de discurso), relaciones
elementales entre estos objetos las reglas expresan relaciones condicionales entre los
objetos, dependencias.
Pág. 5
Programación Lógica y Funcional
REGLAS
Un hecho es una regla con cuerpo vacío un objetivo es una regla con cabeza vacía y el
éxito es una regla con cabeza y cuerpo vacíos. En las cláusulas de Horn se trabaja con
secuencias de literales en vez de conjuntos Esto implica dos cosas: los literales
pueden aparecer repetidos en el cuerpo hay un orden en los literales del cuerpo.
EJEMPLO
Un predicado p queda definido por el conjunto de cláusulas (hechos y reglas) cuyas
cabezas tienen ese símbolo de predicado. Así pues la definición de un predicado en
general tendrá el aspecto:
Pág. 6
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.4. Programación lógica con cláusulas de Horn.
La aplicación de refutación por resolución en cláusulas de Horn es un mecanismo
ampliamente utilizado. El lenguaje de programación Prolog, se basa en este tipo de
cláusulas y los programas implementados en él se denominan programas lógicos
definidos.
Tenemos tres tipos de cláusulas de Horn
Tipo I: un átomo simple (hecho) ej. P11(x)
Tipo II: una implicación (llamada regla) cuyo antecedente consiste de una conjunción
de literales positivos y el consecuente es sólo un literal positivo: L1^L2…^Ln-1 Ln
donde las L son literales positivos. Muchas veces se nota: L1,L2,…,Ln-1 Ln .
Tipo III: Un conjunto de literales negados, que puede notarse como una implicación
sin consecuente L1, L2…Ln
La notación utilizando implicación es la preferida para escribir cláusulas de Horn y
resulta equivalente a la notación utilizando la disyunción de literales. Una cláusula de
Horn notada como disyunción finita de literales, siendo las L literales, se escribe así:
-L1v-L2v….-Ln-1 vLn ,
Lo cual pude notarse como conjunto:
{-L1,-L2,…..-Ln-1, Ln}
Y es equivalente a:
L1,L2,…,Ln-1 Ln (las comas son conjunciones)
EJEMPLO
En general cualquier cláusula puede escribirse como implicación, dando lugar a lo que
se conoce como forma normal conjuntiva. La equivalencia es directa, si tenemos una
cláusula de la forma A1 v….vAn v-B1 v….v-Bn equivale a
B1^...^Bn A1,v…v An
Pág. 7
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.5. Semántica de los programas lógicos.
Semántica proviene de un vocablo griego que puede traducirse como “significativo”.
Se trata de aquello perteneciente o relativo a la significación de las palabras. Por
extensión, se conoce como semántica al estudio del significado de los signos
lingüísticos y de sus combinaciones.
La semántica lógica, por otra parte, se encarga del análisis de los problemas lógicos de
significación. Para esto estudia los signos (paréntesis, cuantificados, etc.), las variables
y constantes, los predicados y las reglas.
La semántica lógica, por otra parte, se encarga del análisis de los problemas lógicos de
significación. Para esto estudia los signos (paréntesis, cuantificados, etc.), las variables
y constantes, los predicados y las reglas.
CARACTERISTICAS
• Una tarea de la semántica es investigar las CONDICIONES DE VERDAD de los
enunciados
• La semántica formal se ocupa únicamente de los aspectos formales o estructurales
de las condiciones de verdad
• Un enunciado complejo será verdadero o falso en función de la forma en que estén
dispuestos los enunciados simples que lo componen
• Esta forma viene dada por la disposición de las conectivas dentro del enunciado.
Ejemplo
Pág. 8
Programación Lógica y Funcional
La semántica operacional de los programas lógicos está basada en el método de
resolución de Robinson, aplicado a cláusulas de Horn. Esto supone una limitación
tanto sintáctica como semántica que, a pesar de las ventajas teóricas y prácticas que
trae consigo, restringe en algunos casos la aplicabilidad de la Programación en Lógica.
Alternativas para capturar la semántica de los programas lógicos.
• Semántica Operacional
• Semántica Declarativa
• Semántica de Punto Fijo
Pág. 9
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.6. Representación clausada del conocimiento.
Representación del conocimiento es un término comúnmente usado para referirse a
representaciones pensadas para el procesamiento por ordenadores modernos, y en
particular, para representaciones compuestas por objetos explícitos y de afirmaciones
sobre ellos. Representar el conocimiento en una forma explícita como esta permite a
los ordenadores sacar conclusiones de conocimiento previamente almacenado.
El pasaje a forma clausal se puede realizar aplicando cinco reglas:





Eliminar implicaciones, desplazar negaciones hacia interior de la sentencia
(sobre las conjunciones, disyunciones y cuantificadores) hasta quedar delante
de fórmulas atómicas.
Desplazar las disyunciones hacia el interior de la sentencia (sobre las
conjunciones y cuantificadores) hasta quedar conectando únicamente
literales.
Desplazar Disyunciones: para desplazar las disyunciones al interior de las
sentencias de tal forma que conecten literales (átomos o átomos negados)
Eliminación de cuantificadores existenciales: La eliminación de un
cuantificador existencial introduce una sentencia que no es equivalente, que
implica la sentencia original pero no es implicada por esta.
Expresar las disyunciones como cláusulas (en forma norma conjuntiva).
CARACTERISTICAS
• Los objetos y las relaciones importantes deben aparecer explícitamente y de forma
conjunta
• Las restricciones inherentes al problema se muestran pero no los detalles
irrelevantes.
• La representación debe ser transparente: se entiende lo que se dice.
• Completa y concisa: Están representados con eficacia todos los objetos y relaciones.
• Rápidos y computables: Se puede almacenar y recuperar la información con rapidez,
y se pueden crear mediante un procedimiento ya existente.
• Partes de una representación:
• Parte léxica: Determina qué símbolos están permitidos en el vocabulario de la
representación.
Pág. 10
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.7. Consulta de una base de cláusulas
Las cláusulas contienen la especificación o implementación del conjunto de hechos y
reglas que componen el programa. Dicha sección se encabeza con la palabra CLAUSES
Una cláusula puede ser:
Un hecho: por ejemplo padre (Juan, maría).
Una secuencia de cláusulas que definen un predicado se denomina procedimiento.
clausula1
Clausula2
...
clausulaN
Las cláusulas son términos (como todo en Prolog) con el siguiente formato:
cabeza :- ojetivo1, ojetivo2, ..., ojetivoN.
Todo gira en torno al operador ":-". Lo que aparece a la izquierda se denomina cabeza
y la secuencia de objetivos que aparece a la derecha se denomina cuerpo.
La cabeza es un término simple. Por ejemplo, p (X, 12) podría ser la cabeza de una
cláusula del predicado p/2. Es decir, todas las cláusulas de un mismo predicado tienen
en la cabeza un término con el mismo functor y aridad, aunque los argumentos
pueden ser distintos.
El cuerpo no es más que el conjunto de condiciones que deben cumplirse (tener éxito)
para que el predicado tenga éxito si lo invocamos con un objetivo que unifique con la
cabeza.
Si una misma variable aparece en dos cláusulas diferentes, entonces son variables
diferentes pero con el mismo nombre. Recuerde que el ámbito de visibilidad de las
variables es una única cláusula.
Pág. 11
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.8. Espacios de búsqueda.
Cuando se resuelve un problema, se busca la mejor solución entre un conjunto de
posibles soluciones. Al conjunto de todas las posibles soluciones a un problema
concreto se llama espacio de búsqueda. Cada punto en el espacio de
búsqueda representa una posible solución. Cada posible solución se le puede asociar
un fitness o un valor que indicará cómo de buena es la solución para el problema. Un
algoritmo genético (AG) devolverá la mejor solución de entre todas las posibles que
tenga en un momento dado.
Existen muchos métodos que se usan para buscar una solución válida, pero no
necesariamente obtienen la mejor solución. Algunos de estos métodos son
los algoritmos de escalada, backtracking o vuelta atrás, búsqueda a ciegas y
los algoritmos genéticos. Las soluciones que encuentran estos tipos de búsqueda
suelen ser buenas soluciones, pero no siempre encuentran la óptima.
En optimización, espacio de búsqueda se refiere al dominio de la función a ser
optimizada. En el caso de los algoritmos de búsqueda, que manejan espacios
discretos, se refiere al conjunto de todas las posibles soluciones candidatas a un
problema.
Fijada una regla de cálculo, los distintos cálculos posibles para un programa
constituido por una cuestión Q y una base de conocimiento P se pueden representar
gráficamente mediante un árbol de búsqueda caracterizado por:
su
raíz,
etiquetada
con
la
cuestión
Q
o
primer
resolvente;
y los demás nodos etiquetados con los resolventes producidos por pasos de
resolución; además para cada nodo etiquetado con un resolvente no vacío, si A es la
fórmula que selecciona la regla de cálculo, existirán tantos descendientes como
cláusulas con cabecera coincidente con A existan en el procedimiento de definición
del correspondiente predicado, los nodos etiquetados con resolventes vacíos no
tienen descendientes.
Las distintas reglas de búsqueda representan distintas formas de recorrido de los
árboles de búsqueda.
Pág. 12
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.9. Programación lógica con números, listas y árboles.
Numéricos
En PROLOG los objetos numéricos pueden corresponder a tipos integer o float de C.
Para realizar operaciones numéricas, se tiene el predicado is, que se comporta como
una asignación en un lenguaje imperativo. Así, el objetivo X is <expresión> será
verdadero cuando X unifique con el resultado numérico de evaluar <expresión>.
EJEMPLO
si definimos:
Masuno(X, Y): - Y is X+1.
Xmasuno (X, Y): - Y = X+1.
Observaremos el siguiente comportamiento:
?- masuno (,5).
Yes
?- xmasuno(4,5)
No
Lista
Este algoritmo es my ineficiente en el peor caso tendrá que generar las N!
permutaciones para una lista de largo N.
Se representan utilizando términos compuestos f(t1, . . . , tn) (para los naturales ya
hemos utilizado una estructura de datos s(_)).
Pág. 13
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.10. Control de búsqueda en programas lógicos
El predicado ! (leído corte) proporciona control sobre el mecanismo de backtracking
de programación lógica: siempre tiene éxito pero tiene el efecto lateral de podar
todas las elecciones alternativas en el nodo correspondiente en el árbol de búsqueda.
Este es un predicado meta-lógico o extra-lógico: es un predicado que afecta al
comportamiento operacional de programación lógica. Es en cierto sentido un
predicado impuro (ajeno a la lógica) pero es un predicado muy útil. . . casi
fundamental para el programador de programación lógica.
¿Cómo opera el corte?
Cuando se resuelve un objetivo p con una clausula de la forma:
P: - q1, …, qn !, r1, …, rm
Programación lógica intenta resolver los objetivosq1, …, qn normalmente (haciendo
backtraking sobre cada uno de ellos si es necesario);
EJEMPLO
El corte en ejemplos (I)
En la página ?? definíamos un predicado para incrementar en 1 los enteros de
una lista (dejando intactos los no enteros):
incLst2( [ ] , [ ] ) .
incLst2( [ X| Xs] , [ Y| Ys] ) : - integer( X) , ! , Y is X+1, incLst2( Xs, Ys) .
incLst2( [ X| Xs] , [ X| Ys] ) : - incLst2( Xs, Ys) .
Pág. 14
Programación Lógica y Funcional
Fundamentos de la programación lógica
4.11. Manipulación de términos. Predicados metalógicos
El primer mecanismo es el = que usamos para unificar términos.
El operador ==/2 y se satisface cuando sus dos operando son términos literalmente
iguales, la diferencia con = es que == no fuerza unificación. El operador \==/ es la
negación del operador anterior y se satisface cuando sus operandos son términos
literalmente diferentes:
?- f(X) == f (Y). No
?- X = Y, f(X) \== f (Y). No
Existen operadores para el chequeo de tipos de términos, se pueden usar para
manejo de errores, el predicado var/1 se satisface cuando su argumento es una
variable no unificada,
nonvar/1 es su negación, ejemplo:
Masuno (X,Y) :- var (X), write (‘ERROR:’),
Write(‘primer argumento no instanciado!!’),
!, fail.
La construcción sirve para pasar nombres de predicados como argumentos. El
siguiente predicado determina si cierta lista esta ordenada según algún criterio que
no se conoce a priori:
ordC ([_],_).
ordC ([X, Y | L], Criterio) : Menor =.. [Criterio, X, Y],
call (Menor),
ordC ([Y|L], Criterio).
Pág. 15
Descargar