








































































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Fundamentos sobre answer set programming utilizando dlv. ademas se describe la sintaxis de cada uno de las reglas permitidas en este paradigma.
Tipo: Apuntes
1 / 80
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!









































































Ejemplo 4-10. Razonamiento cauteloso con éxito, si el programa no tiene ningún modelo
DLV es un sistema de base de datos deductivo, basado en programación lógica disyuntiva, que ofrece interfaces para varios formalismos KR avanzados.
El lenguaje nativo de DLV es Disjunctive Datalog extendido con restricciones, negación verdadera y consultas. Los elementos más básicos de Disjunctive Datalog son las constantes. Estas se refieren a entidades, al igual que los objetos que se almacenan en bases de datos relacionales.
Un término es o bien un término simple o un término complejo. Un término simple es o bien una constante o una variable. Ejemplo 2-1. Términos simples:
Ejemplo 2-6. Hechos: weight(apple, 100, gramo).
El EDB puede contener conocimiento puramente proposicional, como en el siguiente ejemplo: Supongamos que lo anterior (que podría ser una descripción muy simplificada de una máquina de vapor) se almacena en un archivo llamado engine. Ahora veamos qué sucede si llamamos a DLV con esta entrada: Como se esperaba, la respuesta contiene precisamente las dos afirmaciones. Sin embargo, dado que el EDB es conocimiento fijo, mostrarlo en la salida a menudo no es deseado (ya que es redundante) o incluso contraproducente, ya que, para aplicaciones reales, el EDB será muy grande. Usando la opción - nofacts, los predicados que ocurren solo en el EDB (es decir, definidos solo mediante hechos) no se mostrarán. Nota: DLV no requiere que EDB e IDB se almacenen en archivos separados. La misma relación puede consistir en partes de EDB e IDB. Sin embargo, en general, se considera más limpio si EDB e IDB están separados. Para hacer esta separación explícita, utilizamos archivos distintos para EDB e IDB en este capítulo. Los ejemplos también funcionan si las entradas se almacenan en un solo archivo, por ejemplo. hot_furnace. valve_closed. $ DLV - silent engine {hot_furnace, valve_closed} $ DLV - silent - nofacts engine {}
IDB - Base de Datos Intensional Hasta ahora, hemos mostrado cómo especificar una base de datos que sirve como entrada (el EDB). En esta sección, mostraremos cómo definir conocimiento que puede hacer uso de estas bases de datos de entrada. Este conocimiento puede depender del EDB o puede representar conocimiento independiente pero indefinido, o ambos. Colectivamente, esta parte de la entrada se llama base de datos intensional (IDB), o a veces simplemente programa. Las reglas establecen relaciones entre literales explícitamente negados. Básicamente, las reglas tienen la siguiente forma: h1 v ... v hn :- b1, ..., bm. h1 hasta hn representan literales explícitamente negados, donde n > 0 (es decir, debe haber al menos uno de esos). El :- es la transcripción de una flecha de implicación y b1, ..., bm representan literales generales, donde m >= 0 debe cumplirse (es decir, el cuerpo se puede omitir por completo). La parte antes de :- se llama cabeza, la parte después de :- se llama cuerpo. Tenga en cuenta que los símbolos de negación por falta de éxito solo pueden ocurrir en el cuerpo. Además, las reglas deben ser seguras. Para una definición, consulte el Capítulo 3. Informalmente, si el cuerpo se evalúa como verdadero, la cabeza también debe evaluarse como verdadera. Los símbolos de negación por falta de éxito se pueden leer como "no hay evidencia de que xxx se evalúe como verdadero", como en la lógica por defecto. La cabeza representa una disyunción mientras que el cuerpo representa una conjunción.
Ejemplo 2-8. Reglas: También tenga en cuenta que los hechos se pueden ver como formas especiales de reglas, en las cuales el cuerpo está vacío. El elemento neutral de la conjunción es verdadero, por lo que los hechos siempre deben ser verdaderos. También permitimos hechos disyuntivos como un caso especial. Tenga en cuenta que debido al requisito de seguridad (consulte el Capítulo 3 ), no pueden aparecer variables en hechos disyuntivos. Ejemplo 2-9. Hechos disyuntivos: La otra forma especial de una regla, en la que la cabeza está vacía, se llama restricción. El elemento neutral de la disyunción es la falsedad, por lo que el cuerpo de una restricción no debe convertirse en verdadero, porque la cabeza nunca puede convertirse en verdadera. Estos constructos se pueden utilizar para limitar los mundos descritos por el programa, de ahí el nombre. Dado que las restricciones son formas especiales de reglas, deben cumplir con el criterio de seguridad (consulte el Capítulo 3 ).
Por ejemplo, podríamos querer definir la noción de un camino (es decir, hay una secuencia de arcos de un nodo a otro nodo) en cualquier gráfico que se defina mediante el predicado arc. El siguiente IDB hace exactamente eso: Tenga en cuenta que X, Y y Z son variables.
Si tomamos este programa (supongamos que está almacenado en un archivo llamado path) y lo aplicamos al gráfico definido anteriormente, vemos: De hecho, este resultado corresponde a los caminos en el gráfico. A veces, una variable se utiliza para ocultar un argumento que no se utiliza en el resto de la regla. Por ejemplo, si desea definir un nodo en algún gráfico (especificado en el mismo formato que arriba), podría escribir: En la primera regla, Y se utiliza para ocultar el segundo argumento, en la segunda regla, X oculta el primer argumento de arc. DLV proporciona una característica que nos ahorra la necesidad de inventar nombres de variables para estas variables de enmascaramiento y que aclara a los lectores de los programas que una variable solo se usa para enmascarar. Esta característica se llama variable anónima y se denota como _ (un guion bajo). A pesar de su nombre, una variable anónima no es una variable como en la descripción original. Su significado se puede describir de la siguiente manera: en una etapa de preprocesamiento, cada aparición de una variable anónima se reemplaza por una variable única (que no aparece en ninguna otra parte de la misma regla o restricción). El ejemplo anterior (definición de un nodo) se puede volver a escribir de la siguiente manera: $ DLV - silent - nofacts simple_graph path {path(1,2), path(1,3), path(1,4), path(2,3), path(2,4)} node(X) :- arc(X, Y). node(Y) :- arc(X, Y).
minimalidad. Esto significa que si hay dos modelos potenciales y uno de ellos es un subconjunto del otro, no se debe considerar porque contiene información redundante. Dado que {sunny, light_on} es un superconjunto tanto de {sunny} como de {light_on}, no se considera un modelo adecuado. Tenga en cuenta que debido a este criterio de minimalidad, una regla disyuntiva puede dar lugar a exactamente uno de sus átomos en la cabeza. Si varios átomos en la cabeza son verdaderos en una regla, debe haber otras reglas que requieran la verdad de estos átomos adicionales verdaderos. Otro ejemplo: Digamos que desea encontrar alguna coloración de nodos en un gráfico, que se representa mediante arcos. Es decir, tenemos varios colores para elegir, digamos rojo, verde y azul, y cada nodo debe asignarse a un color, pero no sabemos cuál. Para ello, reutilizamos la definición de nodo del Ejemplo 2- 11. La parte más interesante es la última regla. Al igual que en el ejemplo anterior, especificamos que para cualquier nodo X, debe ser verdadero color(X,red), color(X,green) o color(X,blue). Aquí, el criterio de minimalidad asegura que exactamente un color se asigna a un nodo. node(X) :- arc(X,). node(Y) :- arc(,Y). color(X,red) v color(X,green) v color(X,blue) :- node(X).
Veamos la salida de DLV para este ejemplo (archivo coloring) en nuestro gráfico de ejemplo en simple_graph: Reglas Negativas Aún no hemos introducido otra característica importante de Datalog Disyuntivo: la negación. Se han hecho varias propuestas sobre lo que debería significar la negación en este contexto. DLV implementa una de ellas, que ha sido ampliamente aceptada como una propuesta razonable: la Semántica de Modelo Estable. La negación se trata como "negación por falta de éxito". En otras palabras, si un átomo no es verdadero en algún modelo, entonces su negación debe considerarse verdadera en ese modelo. No entraremos en detalles aquí, los ejemplos deberían darle una idea de cómo funciona esto. Con este mecanismo, podemos, por ejemplo, definir el grafo complementario de un grafo dado. $ DLV - silent - nofacts coloring simple_graph {node(1), node(2), node(3), node(4), color(1,red), color(2,red), color(3,red), color(4,red)} {node(1), node(2), node(3), node(4), color(1,red), color(2,red), color(3,red), color(4,green)} [... y así sucesivamente ...] {node(1), node(2), node(3), node(4), color(1,blue), color(2,blue), color(3,blue), color(4,green)} {node(1), node(2), node(3), node(4), color(1,blue), color(2,blue), color(3,blue), color(4,blue)}