prolog

28
Prolog – Bases de Datos Deductivas – Lógica Modal y Temporal Equipo Nro. 1 Lógica de Computación 2016

Upload: b3lleza-online

Post on 20-Jan-2017

64 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Prolog

Prolog – Bases de Datos Deductivas – Lógica

Modal y Temporal

Equipo Nro. 1 Lógica de Computación

2016

Page 2: Prolog

Lógica de Computación

2

Prolog – Bases de Datos Deductivas – Lógica Modal y

Temporal

Integrantes

Ángel Mea. Ci. 24.524.004

Violeta León. Ci. 18262154

Judith Montilla. Ci. 18263657

David Singer. Ci. 21048686

María Aponte. Ci. 24565531

María Álvarez. Ci. 25442524

Enguelbert García. Ci. 19933668

Page 3: Prolog

Lógica de Computación

3

PROLOG

El lenguaje de programación PROLOG, fue creado por Alain Colmerauer y

sus colaboradores alrededor de 1970 en la Universidad de Marseille-Aix, si bien

uno de los principales protagonistas de su desarrollo y promoción fue Robert

Kowalski de la Universidad de Edimburgh. Las investigaciones de Kowalski

proporcionaron el marco teórico, mientras que los trabajos de Colmerauer dieron

origen al actual lenguaje de programación, construyendo el primer interprete

Prolog. David Warren, de la Universidad de Edimburgh, desarrolló el primer

compilador de Prolog (WAM – “Warren Abstract Machine”). Se pretendía usar la

lógica formal como base para un lenguaje de programación, es decir, era un

primer intento de diseñar un lenguaje de programación que posibilitara al

programador especificar sus problemas en lógica. Lo que lo diferencia de los

demás es el énfasis sobre la especificación del problema. Es un lenguaje para el

procesamiento de información simbólica. PROLOG es una realización

aproximada del modelo de computación de Programación Lógica sobre una

máquina secuencial. Desde luego, no es la única realización posible, pero sí es la

mejor elección práctica, ya que equilibra por un lado la preservación de las

propiedades del modelo abstracto de Programación Lógica y por el otro lado

consigue que la implementación sea eficiente.

El lenguaje PROLOG juega un importante papel dentro de la Inteligencia

Artificial, y se propuso como el lenguaje nativo de las máquinas de la quinta

generación ("Fifth Generation Kernel Language", FGKL) que quería que fueran

Sistemas de Procesamiento de Conocimiento. La expansión y el uso de este

lenguaje propiciaron la aparición de la normalización del lenguaje Prolog con la

norma ISO (propuesta de junio de 1993).

PROLOG es un lenguaje de programación para ordenadores que se basa

en el lenguaje de la lógica de predicados y que se utiliza para resolver problemas

en los que entran en juego objetos y relaciones entre ellos. Por ejemplo, cuando

decimos "Jorge tiene una moto", estamos expresando una relación entre un

objeto (Jorge) y otro objeto en particular (una moto). Más aún, estas relaciones

Page 4: Prolog

Lógica de Computación

4

tienen un orden específico (Jorge posee la moto y no al contrario). Por otra parte,

cuando realizamos una pregunta (¿Tiene Jorge una moto?) Lo que estamos

haciendo es indagando acerca de una relación. Además, también solemos usar

reglas para describir relaciones: "dos personas son hermanas si ambas son

hembras y tienen los mismos padres". Como veremos más adelante, esto es lo que

hacemos en Prolog.

Una de las ventajas de la programación lógica es que se especifica qué se

tiene que hacer (programación declarativa), y no cómo se debe hacer

(programación imperativa). A pesar de esto, Prolog incluye algunos predicados

predefinidos metalógicos, ajenos al ámbito de la lógica de predicados, (var,

nonvar, ==, ...), otros extra-lógicos, que tienen un efecto lateral, (write, get, ...) y

un tercer grupo que nos sirven para expresar información de control de cómo

realizar alguna tarea ( el corte, ... ). Por tanto, Prolog ofrece un sistema de

programación práctico que tiene algunas de las ventajas de claridad y

declaratividad que ofrecería un lenguaje de programación lógica y, al mismo

tiempo, nos permite un cierto control y operatividad.

ENTORNO DE TRABAJO

En la figura podemos ver un esquema de la forma de trabajo en Prolog.

mediante un editor de texto escribiremos nuestra Base de Conocimientos

compuesta por distintos hechos y reglas que reflejan nuestro conocimiento acerca

del problema a formalizar. Para poder utilizarlo deberemos guardarlo en disco

Page 5: Prolog

Lógica de Computación

5

(disco duro o disquete). Posteriormente desde Prolog deberemos consultar el

fichero deseado. Una vez consultada la base de conocimientos correspondiente,

estaremos en condiciones de hacer las preguntas de las que queramos obtener

respuesta o que resuelvan el problema. Este ciclo se repetirá continuamente

(editar-guardar-consultar-preguntar) hasta que demos por finalizado nuestro

trabajo.

ESTILO DE PROGRAMACIÓN

Los lenguajes de Programación Lógica, al igual que los lenguajes

procedimentales, necesitan de una metodología para construir y mantener

programas largos, así como un buen estilo de programación. Prolog ofrece

mecanismos de control típicos de cualquier lenguaje imperativo y no puras

propiedades o relaciones entre objetos. Dichos mecanismos contribuyen a dar

mayor potencia y expresividad al lenguaje, pero violan su naturaleza lógica.

Adoptando un estilo apropiado de programación podemos beneficiarnos de esta

doble naturaleza de Prolog.

• Metodología de Diseño “top-down”: descomponemos el problema en

subproblemas y los resolvemos. Para ello solucionamos primero los pequeños

problemas: implementación “bottom-up”. Esto nos va a permitir una mejor

depuración («debugged») de nuestros programas, ya que cada pequeño trozo de

programa puede ser probado inmediatamente y, si lo necesita, corregido.

• Una vez analizado el problema y separado en trozos, el siguiente paso es

decidir cómo representar y manipular tanto los objetos como las relaciones del

problema. Debemos elegir los nombres de los predicados, variables, constantes y

estructuras de manera que aporten claridad a nuestros programas (palabras o

nombres mnemónicos que estén relacionados con lo que hacen).

• El siguiente paso es asegurarse de que la organización y la sintaxis del

programa sea clara y fácilmente legible:

- Llamamos procedimiento al conjunto de cláusulas para un predicado

dado. Agruparemos por bloques los procedimientos de un mismo predicado

Page 6: Prolog

Lógica de Computación

6

(mismo nombre y mismo número de argumentos). Así, cada cláusula de un

procedimiento comenzará en una línea nueva, y dejaremos una línea en blanco

entre procedimientos.

- Si el cuerpo de una regla es lo bastante corto, lo pondremos en una línea;

sino, se escriben los objetivos de las conjunciones indentados y en líneas

separadas.

- Primero se escriben los hechos, y luego las reglas.

- Es recomendable añadir comentarios y utilizar espacios y líneas en blanco

que hagan el programa más legible. El listado del programa debe estar

“autodocumentado”. Debemos incluir para cada procedimiento y antes de las

cláusulas el esquema de la relación.

- Los argumentos deben ir precedidos por el signos `+', `-' o `?'. `+' indica

que el argumento es de entrada al predicado (debe estar instanciado cuando se

hace la llamada), `-' denota que es de salida y `?' indica que puede ser tanto de

entrada como de salida

- Agrupar los términos adecuadamente. Dividir el programa en partes

razonablemente autocontenidas (por ejemplo, todos los procedimientos de

procesado de listas en un mismo fichero).

- Evitar el uso excesivo del corte. - Cuidar el orden de las cláusulas de un

procedimiento. Siempre que sea posible escribiremos las condiciones límite de la

recursividad antes de las demás cláusulas. Las cláusulas “recogetodo” tienen que

ponerse al final.

VENTAJAS Y DESVENTAJAS DE LA PROGRAMACIÓN LÓGICA

Ventajas

• La habilidad de PROLOG para calcular de forma procedural es una de las

ventajas específicas que tiene el lenguaje. Como consecuencia esto anima al

programador a considerar el significado declarativo de los programas de forma

Page 7: Prolog

Lógica de Computación

7

relativamente independiente de su significado procedural. Es decir, las ventajas

de la forma declarativa de este lenguaje son claras (es más fácil pensar las

soluciones y muchos detalles procedurales son resueltos automáticamente por el

propio lenguaje) y podemos aprovecharlas.

• Una ventaja desde el punto de vista del usuario es la facilidad para programar

ya que se pueden escribir programas rápidamente, con pocos errores originando

programas claramente legibles, aun si no se conoce muy bien el lenguaje.

• No hay que pensar demasiado en la solución del problema, ya que Prolog infiere

sus respuestas basándose en las reglas declaradas dentro del programa. 4.

Modularidad: cada predicado (procedimiento) puede ser ejecutado, validado y

examinado independiente e individualmente. Prolog no tiene variables globales,

ni asignación. Cada relación está auto contenida, lo que permite una mayor

modularidad, portabilidad y reusabilidad de relaciones entre programas. 5.

Polimorfismo: se trata de un lenguaje de programación sin tipos, lo que un alto

nivel de abstracción e independencia de los datos (objetos).

• En Prolog, se puede representar incluso los mismos programas Prolog como

estructuras.

• Prolog utiliza un mecanismo de búsqueda independiente de la base de hechos.

Aunque pueda parecer algo retorcido, es una buena estrategia puesto que

garantiza el proceso de todas las posibilidades. Es útil para el programador

conocer dicho mecanismo a la hora de depurar y optimizar los programas. 8.

Manejo dinámico y automático de memoria.

• En prolog se utiliza notación prefija e infija mientras que en Lisp solo utiliza

notación prefija.

Desventajas

• La resolución automática no siempre es eficiente, por lo que eventualmente se

podría dar una respuesta incorrecta a una consulta. 2. Poco eficientes. 3. Poco

utilizado en aplicaciones reales.

Page 8: Prolog

Lógica de Computación

8

• Prolog algunas veces es incapaz de reconocer que un problema es (para su

propio conocimiento) inaplicable o insuficiente. Si el programa no contiene

suficiente información para contestar una consulta, es incapaz de reconocerlo y

responde no. En esta situación sería más eficiente conocer que la respuesta no es

negativa, sino que no es posible inferir un resultado.

• Los motores de inferencia poseen algunos límites.

APLICACIONES DE PROLOG

RFuzzy: es una herramienta implementada sobre el lenguaje de

programación Prolog, que es capaz de representar y trabajar con lógica

difusa. Se ha utilizado para potenciar la inteligencia de los robots. RFuzzy

se ha aplicado para la programación de robots participantes en la liga

mundial de fútbol de robots (RoboCupSoccer), que se viene desarrollando

desde 1996 con la finalidad de desarrollar la robótica y la inteligencia

artificial. Desde otro punto de vista, la aplicación analiza las medidas

sonoras de una conversación, que se obtienen con otro programa

específico, y en base a las reglas descritas en la nueva aplicación, es capaz

de distinguir las emociones escondidas en una oración, pudiendo

determinar si una persona está triste, asustada, alegre o nerviosa. La

aplicación puede precisar, incluso si la emoción no está clara, el porcentaje

de adecuación del hablante a cada emoción. Fue presentado por la

profesora Susana Muñoz Hernández en la First International Conference

on Fuzzy Computation, celebrada en Madeira, Portugal, en el 2009.

Cloze (Técnica de la Inteligencia Artificial y Aprendizaje de Lenguas

hechas en Prolog): consiste, en la presentación de un texto escrito al cual

se le han sustituido palabras, según un criterio previamente establecido,

por una marca de longitud fija o un espacio de longitud proporcional a la

de la palabra. La tarea del sujeto consiste en adivinar y proponer la palabra

omitida a partir de las claves sintácticas o semánticas dadas por el

contecto. También es conocido como preguntas incrustadas. En el 2013 se

liberó un complemento para Moodle 1.9, 2.x y 3.x que permite la

producción de preguntas tipo Cloze mediante una interfaz gráfica, pero

Page 9: Prolog

Lógica de Computación

9

que modifica el editor HTML estándar de Moodle. Lo cual ayuda a

importar las preguntas dentro del módulo de Examen de Moodle.

Desarrollo de Sistemas Multi – Agentes desarrollados mediante JavaLog:

desarrollado utilizando Java y el intérprete de Prolog aumentado con un

algoritmo de programación lógica inductiva. es un sistema compuesto por

múltiples agentes inteligentes que interactúan entre ellos. Los sistemas

multi pueden ser utilizados para resolver problemas que son difíciles o

imposibles de resolver para un agente individual o un sistema monolítico.

Los ámbitos en los que la investigación de sistemas multi puede ofrecer un

enfoque adecuado incluyen el comercio online, la respuesta a desastres y

el modelado de estructuras sociales.

PROLOG Y LÓGICA DE PREDICADOS

La Lógica de Primer Orden analiza las frases sencillas del lenguaje

(fórmulas atómicas o elementales) separándolas en Términos y Predicados. Los

términos hacen referencia a los objetos que intervienen y los predicados a las

propiedades o relaciones entre estos objetos. Además, dichas fórmulas atómicas

se pueden combinar mediante Conectivas permitiéndonos construir fórmulas

más complejas, llamadas fórmulas moleculares.

Predicados

Se utilizan para expresar propiedades de los objetos, predicados

monádicos, y relaciones entre ellos, predicados poliádicos. En Prolog los

llamaremos hechos.

Debemos tener en cuenta que:

• Los nombres de todos los objetos y relaciones deben comenzar con una

letra minúscula.

• Primero se escribe la relación o propiedad: predicado

• Y los objetos se escriben separándolos mediante comas y encerrados

entre paréntesis: argumentos.

• Al final del hecho debe ir un punto (".").

Page 10: Prolog

Lógica de Computación

10

Ejemplo: símbolo_de_predicado(arg1,arg2,…,argn).

Tanto para los símbolos de predicado como para los argumentos,

utilizaremos en Prolog constantes atómicas.

Ejemplos (ej01.pl):

/* Predicados monádicos: PROPIEDADES */

/* mujer(Per) Per es una mujer */

mujer(clara).

mujer(chelo).

/* hombre(Per) Per es un hombre */

hombre(jorge).

hombre(felix).

hombre(borja).

/* moreno(Per) Per tiene el pelo de color oscuro */

moreno(jorge).

/* Predicados poliádicos: RELACIONES */

/* tiene(Per,Obj) Per posee el objeto Obj */

tiene(jorge,moto).

/* le_gusta_a(X,Y) a X le gusta Y */

le_gusta_a(clara,jorge).

le_gusta_a(jorge,clara).

le_gusta_a(jorge,informatica).

Page 11: Prolog

Lógica de Computación

11

le_gusta_a(clara,informatica).

/* es_padre_de(Padre,Hijo-a) Padre es el padre de Hijo-a */

es_padre_de(felix,borja).

es_padre_de(felix,clara).

/* es_madre_de(Madre,Hijo-a) Madre es la madre de Hijo-a */

es_madre_de(chelo,borja).

es_madre_de(chelo, clara).

/* regala(Per1,Obj,Per2) Per1 regala Obj a Per2 */

regala(jorge, flores, clara).

Términos

Los términos pueden ser constantes o variables, y suponemos definido un

dominio no vacío en el cual toman valores (Universo del Discurso). En la práctica

se toma como dominio el Universo de Herbrand. Para saber cuántos individuos

del universo cumplen una determinada propiedad o relación, cuantificamos los

términos.

Las constantes se utilizan para dar nombre a objetos concretos del

dominio, dicho de otra manera, representan individuos conocidos de nuestro

Universo. Además, como ya hemos dicho, las constantes atómicas de Prolog

también se utilizan para representar propiedades y relaciones entre los objetos

del dominio. Hay dos clases de constantes:

• Átomos: existen tres clases de constantes atómicas:

- Cadenas de letras, dígitos y subrayado (_) empezando por letra

minúscula.

- Cualquier cadena de caracteres encerrada entre comillas simples (').

Page 12: Prolog

Lógica de Computación

12

- Combinaciones especiales de signos: "?-", ":-", ...

• Números: se utilizan para representar números de forma que se puedan realizar

operaciones aritméticas. Dependen del ordenador y la implementación.

- Enteros: en la implementación de Prolog-2 puede utilizarse cualquier

entero que el intervalo [-223,223-1]=[-8.388.608,8.388.607].

- Reales: decimales en coma flotante, consistentes en al menos un dígito,

opcionalmente un punto decimal y más dígitos, opcionalmente E, un «+» o «-» y

más dígitos.

Ejemplos de constantes:

Las variables se utilizan para representar objetos cualesquiera del

Universo u objetos desconocidos en ese momento, es decir, son las incógnitas del

problema. Se diferencian de los átomos en que empiezan siempre con una letra

mayúscula o con el signo de subrayado (_). Así, deberemos ir con cuidado ya que

cualquier identificador que empiece por mayúscula, será tomado por Prolog como

una variable. Para trabajar con objetos desconocidos cuya identidad no nos

interesa, podemos utilizar la variable anónima (_). Las variables anónimas no

están compartidas entre sí.

Ejemplos de variables:

X

Sumando

Primer_factor

Page 13: Prolog

Lógica de Computación

13

_indice

_ (variable anónima)

Una variable está instanciada cuando existe un objeto determinado

representado por ella. Y está no instanciada cuando todavía no se sabe lo que

representa la variable. Prolog no soporta asignación destructiva de variables, es

decir, cuando una variable es instanciada su contenido no puede cambiar. Como

veremos más adelante, la manipulación de datos en la programación lógica se

realiza por medio de la unificación.

Explícitamente Prolog no utiliza los símbolos de cuantificación para las

variables, pero implícitamente sí que lo están. En general, todas las variables que

aparecen están cuantificadas universalmente, ya que proceden de la notación en

forma clausal, y, por tanto, todas las variables están cuantificadas

universalmente, aunque ya no escribamos explícitamente el cuantificador (paso

6ª de la transformación a forma clausal: eliminación de cuantificadores

universales). Pero veamos qué significado tienen dependiendo de su ubicación.

Si las fórmulas atómicas de un programa lógico contienen variables, el significado

de estas es:

• Las variables que aparecen en los hechos están cuantificadas

universalmente ya que en una cláusula todas las variables que aparecen están

cuantificadas universalmente de modo implícito.

Page 14: Prolog

Lógica de Computación

14

• Las variables que aparecen en la cabeza de las reglas (átomos afirmados)

están cuantificadas universalmente. Las variables que aparecen en el cuerpo de

la regla (átomos negados), pero no en la cabeza, están cuantificadas

existencialmente.

• Las variables que aparecen en las preguntas están cuantificadas

existencialmente.

SINTAXIS: HECHOS, PREGUNTAS Y REGLAS

Hecho: Para decir que Laura es uno de los dos progenitores de Damián,

podríamos declarar el siguiente hecho PROLOG:

Progenitor (laura, damian).

“progenitor” es el nombre de la relación o nombre de predicado y “laura” y

“damian” son los argumentos. Los hechos acaban siempre con punto. Nosotros

interpretaremos que Laura, primer argumento de la relación, es la madre de

Damián, segundo argumento de la relación. Sin embargo, este orden es arbitrario

y cada programador puede darle su propio significado. Los nombres de las

relaciones y los argumentos que se refieren a objetos o personas concretas se

escribirán con minúscula.

Preguntas: Sobre un conjunto de hechos se pueden realizar una serie de

preguntas. Por ejemplo:

?- le_gusta_a (juan,maria).

Page 15: Prolog

Lógica de Computación

15

PROLOG busca automáticamente en la base de datos si existe un hecho

que se puede unificar (es decir, tiene el mismo nombre de predicado, el mismo

número de argumentos o arista y cada uno de los argumentos tiene el mismo

nombre, uno a uno) con el hecho que aparece en la pregunta. PROLOG contestará

“SI” si encuentra ese hecho y “NO” si no lo encuentra. La contestación “NO” no

implica que el hecho sea falso (aunque sí lo sea para nuestra base de datos), sino

que no se puede probar (en general) que sea verdadero con el conocimiento

almacenado en la base de datos.

Reglas: Existe en PROLOG la posibilidad de definir la relación

“abuelo(X,Y)” o la relación “tio(X,Y)” como reglas, además de poderlo hacer como

hechos o como conjunción de objetivos. Ejemplo:

Abuelo(X, Y):- progenitor(X,Z), progenitor(Z,Y). tio(X,Y):- progenitor(Z,Y),

progenitor(V,Z), progenitor(V,X).

A la primera parte de la regla se le llama cabeza o conclusión, el símbolo

":-" es el condicional (SI), y a la parte de la regla que está después de “:-“ es el

cuerpo o parte condicional. El cuerpo puede ser una conjunción de objetivos

separados por comas. Las preguntas se le hacen al programa para determinar qué

cosas son ciertas.

SINTAXIS: OBJETOS ESTRUCTURADOS. LISTAS.

Los objetos estructurados (o estructuras) en PROLOG son términos de la

forma f(t1, ..., tn) donde f es un símbolo de función n-ario, o funtor, y t1, ..., tn

son a su vez términos (que pueden ser constantes, variables o a su vez

estructuras).

Ejemplos de estructuras son las siguientes: libro(moby-dick,

autor(herman, melville)) a+(b*c) ó +(a, *(b, c))

Los ejemplos anteriores se representarían de la forma:

Page 16: Prolog

Lógica de Computación

16

Las estructuras se suelen representar por árboles donde el autor es un

nodo y los componentes son los subárboles que cuelgan de dicho nodo.

Una lista es una secuencia ordenada de elementos que puede tener

cualquier longitud. Los elementos de una lista (como los de cualquier otra

estructura) son términos, los cuales pueden ser en particular otras listas. Las

listas pueden representarse como un tipo especial de árbol. Una lista es o bien la

lista vacía, sin elementos, denotada [ ], o bien una estructura cuyo funtor se

denota "." (punto) y con dos componentes llamados "cabeza" y "resto" de la lista.

La lista con un solo elemento a es :(a, [ ]) y su árbol es:

La lista que consta de los elementos a, b y c sería: .(a, .(b, .(c, [ ]))) y en

forma de árbol es:

Pero la forma sintáctica más habitual de escribir las listas es separando los

elementos entre comas y toda la lista encerrada entre corchetes. Las listas

anteriores se escribirían de la forma:

Page 17: Prolog

Lógica de Computación

17

[a] y [a,b,c]

La forma de manejar las listas es dividiéndolas en cabeza (el primer

argumento del funtor punto o el primer elemento de la lista) y resto (el segundo

argumento del funtor punto o la lista formada por el resto de elementos de la

lista).

Page 18: Prolog

Lógica de Computación

18

REGLA DE RESOLUCIÓN

Se obtiene a partir de una pregunta y una sentencia del programa, una

nueva pregunta. En concreto: Dada la pregunta ?A1, A2, ,..., An. donde A1 es un

átomo de la forma p(t1, …, tk) y dada una sentencia del programa B:- B1, B2, ... ,

Bm. Con cabeza B de la forma p(s1, …, sk), si A1 y B son unificables se aplica la

regla de resolución para obtener una nueva pregunta (llamada “resolvente”) ? (B1,

B2, ..., Bm, A2,..., An) g siendo g el umg de los átomos A1 (primer fin de la

pregunta) y B (cabeza de la regla).

Gráficamente

En particular, cuando tenemos una pregunta con un único fin ?A de la

forma p(t1, …, tk) que se resuelve con un hecho del programa B de la forma p(s1,

…, sk), el resultado de aplicar la regla de resolución es la pregunta vacía, que lo

expresaremos con

Es decir, si existe un umg g tal que A g = B g, entonces la nueva pregunta

es vacía lo que significa que la pregunta inicial es cierta para ese programa.

En concreto, el procedimiento a seguir es el siguiente:

Dada una pregunta de la forma ?A1, A2, .., An. se buscará la primera

sentencia del programa B:-B1, ..., Bm. tal que A1 y B sean unificables por un umg

Page 19: Prolog

Lógica de Computación

19

g. PROLOG elige (de entre las posibles sentencias cuya cabeza B se unifica con

A1) la primera introducida en el programa.

Por tanto, el orden en que se introducen las sentencias de un programa es

significativo, entre otras cosas determinará el orden de las respuestas.

Entonces la nueva pregunta (el resolvente) será ?(B1, ..., Bm, A2, ..., An) g.

El proceso continuará de igual forma hasta obtener la pregunta vacía (lo

que corresponde a un éxito), o una pregunta para la cual no exista resolvente con

ninguna sentencia del programa (lo que corresponderá a un fracaso). Esta

estrategia de resolución que sigue PROLOG se denomina estrategia de resolución

SLD. La secuencia de pasos desde la pregunta original hasta la pregunta vacía se

llama refutación SLD.

Ejemplo:

Page 20: Prolog

Lógica de Computación

20

RECORRIDO EN EL ESPACIO DE BUSQUEDA

PROLOG es capaz de dar todas las posibles respuestas a una pregunta, es

decir, buscará todas las posibles refutaciones SLD. El espacio de búsqueda de

soluciones se puede representar mediante un árbol, donde cada rama representa

una posible refutación SLD. (En lugar de expresar en cada paso de resolución la

pregunta a tratar y la sentencia con la que se resuelve, tal y como vimos en el

apartado anterior, indicaremos únicamente el número de la sentencia con la que

se resuelve dicha pregunta, tal y como se muestra en la figura siguiente.)

La exploración del árbol de soluciones PROLOG, es en profundidad, es

decir, explora una rama del árbol hasta llegar al final de ella (a un éxito o fracaso)

y sólo después recorrerá las siguientes ramas de la misma forma. Si dibujamos el

árbol de búsqueda de manera que las distintas posibilidades de resolución de

cada objetivo se dibujen ordenadamente de izquierda a derecha (tal y como se

Page 21: Prolog

Lógica de Computación

21

muestra en el árbol del ejemplo), entonces el orden de exploración de las ramas

es de izquierda a derecha.

El árbol de búsqueda de soluciones para una pregunta y un programa

dados, representa todos los caminos que el sistema debe recorrer para encontrar

las respuestas a la pregunta. Pero, ¿Qué ocurre cuando se llega al final de la rama?

- Si ha sido un éxito (se obtiene ) corresponde a una respuesta del sistema.

- Si ha sido un fracaso se debe seguir buscando por otra rama hasta

encontrar una refutación. El proceso a seguir es hacer una vuelta atrás por los

nodos recorridos hasta llegar a alguno del que salga otra rama. Entonces se

recorre esta rama en profundidad y así sucesivamente.

Por tanto, el recorrido en el árbol es en PROFUNDIDAD y con VUELTA

ATRAS a la última elección hecha. Este proceso de vuelta atrás para recorrer más

ramas del árbol, no sólo se hace para encontrar la primera refutación (que

corresponde a la primera respuesta del sistema), sino también si se quieren

encontrar otras posibles refutaciones (otras posibles respuestas).

Ejemplo:

Veamos el proceso para la pregunta ?es-hija(Z, haran).

- Esta pregunta se unifica con la cabeza de la regla 19 (paso 1), se hace una marca

para esta pregunta en el programa y se intentan satisfacer los fines de la pregunta

?es-padre(haran, Z), es-mujer(Z).

Page 22: Prolog

Lógica de Computación

22

- Se comienza siempre con el fin más a la izquierda, en este caso con ?es-

padre(haran, Z). Este fin se satisface al resolverse con el hecho 5. (paso 2), donde

la variable Z se ha instanciado a lot por g11, se hace una marca para este fin en

dicho punto del programa y se pasa a satisfacer la nueva pregunta obtenida que

es ?es-mujer(lot).

- Como el nuevo fin ?es-mujer(lot) fracasa se hace una vuelta atrás (paso 3),

intentando resatisfacer el fin ?es-padre(haran, Z) (la ligadura de la variable Z con

lot se ha deshecho), buscando desde el punto del programa donde se encontraba

la marca de este fin en adelante (es decir, desde el hecho 6 en adelante).

- Ahora se satisface ?es-padre(haran,Z) al resolverse con el hecho 6 (paso 4) por

lo que se hace una marca para este fin en dicho punto del programa y se pasa a

satisfacer el siguiente fin, que con el nuevo unificador g12 es ?es-mujer(milcah).

- Este fin se satisface al resolverse con el hecho 16 (paso 5) y se hace la marca

correspondiente. Como los dos subfines se han satisfecho, el objetivo principal

?es-hija(Z,haran) también se ha resuelto. Ya se ha encontrado una refutación y

por tanto una respuesta. El sistema contesta con: Z=milcah.

- Si se quieren más respuestas (el usuario escribe ;) el proceso es análogo a si el

último fin ?es-mujer(milcah) hubiera fracasado, es decir, se fuerza de nuevo a

hacer vuelta atrás (paso 6 y paso 7), intentando resatisfacer el fin ?es-

padre(haran,Z) (la ligadura de la variable Z con milcah también se deshace).

- Ahora se busca desde el punto del programa donde se encontraba la marca de

este fin, es decir, desde el hecho 7 en adelante. El proceso es análogo hasta

encontrar la siguiente refutación (pasos 8 y 9) que da lugar a la segunda respuesta

Z=yiscah. Si de nuevo se piden más respuestas, el sistema hace vuelta atrás hasta

el primer objetivo (pasos 10, 11 y 12) y termina (no hay más resoluciones

posibles).

BASE DE DATOS

Es un conjunto de datos pertenecientes a un mismo contexto y

almacenados sistemáticamente para su posterior uso.

Page 23: Prolog

Lógica de Computación

23

Un ejemplo sencillo es comparar una base de datos con una biblioteca;

donde la biblioteca está compuesta en su mayoría por documentos y textos

impresos en papel e indexados para su consulta. Actualmente, y debido al

desarrollo tecnológico de campos como la informática y la electrónica, la mayoría

de las bases de datos están en formato digital, siendo este un componente

electrónico, y por ende se ha desarrollado y se ofrece un amplio rango de

soluciones al problema del almacenamiento de datos.

BASES DE DATOS DEDUCTIVAS

Es un sistema de base de datos, pero con la diferencia de que permite hacer

deducciones a través de inferencias. Se basa principalmente en reglas y hechos

que son almacenados en la base de datos.

Las bases de datos deductivas tienen tres componentes principales: los

hechos, las reglas y el motor de inferencia. Los hechos corresponden a los tuples

en una base de datos relacional. La única diferencia es que se indica el nombre

del tuple pero no se indican los nombres de los atributos. Las reglas indican cómo

deducir hechos nuevos a partir de los hechos almacenados y cómo deducir

relaciones indirectas entre las entidades. Estas reglas se escriben usando un

lenguaje declarativo y, por lo tanto, se indica lo que se desea, pero no se indica el

algoritmo para llegar a esa meta. El motor de inferencia es el que implementa el

algoritmo para deducir nuevos hechos y relaciones a partir de las reglas y los

hechos almacenados.

Las bases de datos deductivas son también llamadas bases de datos

lógicas, a raíz de que se basa en lógica matemática. Este tipo de base de datos

surge debido a las limitaciones de la Base de Datos Relacional de responder a

consultas recursivas y de deducir relaciones indirectas de los datos almacenados

en la base de datos.

Ventajas.

Uso de reglas lógicas para expresar las consultas.

Permite responder consultas recursivas.

Cuenta con negaciones estratificadas.

Page 24: Prolog

Lógica de Computación

24

Capacidad de obtener nueva información a través de la ya

almacenada en la base de datos mediante inferencia.

Uso de algoritmos de optimización de consultas.

Soporta objetos y conjuntos complejos.

Desventajas

Encontrar criterios de interpretación para las reglas deductivas.

Replantear un contexto deductivo.

Desarrollar procedimientos eficaces de deducción.

Lenguaje

Las bases de datos deductivas utilizan un subconjunto del lenguaje Prolog,

llamado Datalog; el cual es declarativo y permite al ordenador hacer deducciones

para contestar a consultas basándose en los hechos y reglas almacenados.

Fases

Fase de Interrogación: Se encarga de buscar en la base de datos

informaciones deducibles implícitas. Las reglas de esta fase se denominan reglas

de derivación.

Fase de Modificación: Se encarga de añadir a la base de datos nuevas

informaciones deducibles. Las reglas de esta fase se denominan reglas de

generación.

Interpretación

Se encuentran dos teorías de interpretación de las bases de datos

deductiva; se consideran las reglas y los hechos como axiomas. Los hechos son

axiomas base que se consideran como verdaderos y no contienen variables. Las

reglas, son axiomas deductivos ya que se utilizan para deducir nuevos hechos.

Teoría de Modelos: Consiste en asignar a un predicado todas las

combinaciones de valores y argumentos de un dominio de valores constantes

dado. A continuación, se debe verificar si ese predicado es verdadero o falso.

Mecanismos

Page 25: Prolog

Lógica de Computación

25

Existen dos mecanismos de inferencia:

Ascendente: Donde se parte de los hechos y se obtiene los nuevos,

aplicando reglas de inferencia.

Descendente: Donde se parte del predicado (objetivo de la consulta

realizada) e intenta encontrar similitudes entre las variables que nos lleven a

hechos correctos almacenados en la base de datos.

LOGICA MODAL

Una lógica modal es un sistema formal que intenta capturar el

comportamiento deductivo de algún grupo de operadores modales. Los

operadores modales son expresiones que califican la verdad de los juicios. Por

ejemplo, en la oración «es necesario que 2+2=4», la expresión «es necesario que»

es un operador modal que califica de necesaria a la verdad del juicio «2+2=4».

En un sentido más restringido, sin embargo, se llama lógica modal al

sistema formal que se ocupa de las expresiones «es necesario que» y «es posible

que». Este artículo trata exclusivamente sobre este sistema formal. Otros

sistemas de lógica modal conocidos son la lógica deóntica, la lógica temporal, la

lógica epistémica y la lógica doxástica.

Vamos a definir ahora la sintaxis formal del lenguaje modal básico.

La signatura del lenguaje va a consistir de dos conjuntos infinitos

numerables, disjuntos entre sí:

o PROP = {p1, p2, . . . }, el conjunto de variables

proposicionales.

o REL = {R1, R2, . . . }, el conjunto de símbolos de relación.

El conjunto de fórmulas FORM en la signatura (PROP, REL) está

definido como:

FORM := p | ¬ϕ | ϕ ∧ ψ | (R)ϕ en donde p ∈ PROP, R ∈ REL y ϕ, ψ ∈

FORM.

Page 26: Prolog

Lógica de Computación

26

El operador [R] se define como [R]ϕ = ¬(R)¬ϕ (de igual forma que

∀x.ϕ es ¬∃x.¬ϕ)

PROPIEDADES DE LA LOGICA MODAL

UTILIDAD DE LA LOGICA MODAL

La lógica tiene importantes funciones en la construcción de las teorías

científicas, como las siguientes: El razonamiento valido, establecido y examinado

por la lógica formal, es utilizado, ya sea para concluir o para derivar

conocimientos contenidos. La sistematización de las ciencias es posible gracias a

la lógica, que permite el establecimiento de ciertos postulados básicos

relacionados lógicamente entre sí. Con la lógica formal, además, es posible probar

indirectamente ciertos conocimientos a partir de conocimientos previamente

establecidos y verificados, los cuales sirven de premisas de las que pueden

inferirse a los otros como conclusiones válidas. La lógica informal, que pretende

no solo examinar la corrección de las argumentaciones sino enseñarnos a

argumentar y ser más racionales. La lógica de investigación se interesa por la

verdad y la manera de obtenerla y fundamentarla, estudiando la practica

científica.

LOGICA TEMPORAL

La lógica temporal es una extensión de la lógica modal, la cual es

prácticamente usada en sistemas de reglas, donde está presente el tiempo. Existe

Page 27: Prolog

Lógica de Computación

27

una cierta relación con otras variedades de lógica, por ejemplo, la lógica modal.

Su estudio tiene importancia en la informática hasta nuestros días.

Por ejemplo, tomemos la sentencia: "Tengo hambre"; aunque su

significado es independiente del tiempo, el valor de verdad o falsedad de la misma

puede variar con el tiempo en un determinado sistema que incluya acciones de

comer; así, en función del sistema, algunas veces será cierta y otras falsa, aunque

nunca será cierta y falsa simultáneamente.

PROPIEDADES DE LA LOGICA TEMPORAL

Algunas de las propiedades típicas que suelen ser especificadas son:

● Alcanzabilidad: es posible alcanzar una situación.

● Seguridad: es seguro que una situación no sucederá.

● Vivacidad: si empieza debe terminar.

● Equidad: un número infinito de veces una situación se podrá dar, se dará

o no se dará nunca. Las propiedades son especificadas normalmente a través de

lógica temporal.

SISTEMAS LOGICOS BASADOS EN LOGICA TEMPORAL

Algunos sistemas lógicos basados en lógica temporal son: Lógica

computacional en árbol (Computational tree logic, CTL), lógica temporal lineal

(Linear-Time temporal logic, LTL) y Lógica temporal de intervalos (Interval

temporal logic, ITL).

USOS DE LA LOGICA TEMPORAL

Page 28: Prolog

Lógica de Computación

28

LTL es una lógica temporal que nos permite referirnos al futuro, en la que

el tiempo se modela como una secuencia infinita de estados. A esta secuencia de

estados a veces se le llama ruta. LTL fue propuesto por primera vez para la

verificación formal de programas de ordenador mediante Amir Pnueli en 1977.

CTL es ampliamente utilizada en:

● Verificación: Tanto de sistemas hardware como sistemas software.

● Inteligencia Artificial: En particular, en sistemas de planificación de

agentes, en los que cada agente planifica sus estrategias de acción teniendo en

cuenta las diferentes opciones futuras.

● Formalización de especificaciones y comportamientos de sistemas