11
Instalación: 1. Descargar la SWI-Prolog de la siguiente página: http://www.swi-prolog.org/download/stable 2. Ejecutamos el archivo .exe que descargamos y seguimos el asistente 3. Una vez instalado procedemos a ejecutarlo y presenciamos la interfaz, muy parecida a la línea de co mandos de los sistemas operativos donde haremos nuestras consultas. Primeros pasos: Editor de Texto: Para comenzar a escribir nuestros programas SWI-Prolog tiene integrado un editor de texto que podemos abrir desde el menú File>New o podemos utilizar nuestro editor de texto favorito algunos de

Manuals Wipro Log

Embed Size (px)

DESCRIPTION

iuo

Citation preview

Page 1: Manuals Wipro Log

Instalación:

1. Descargar la SWI-Prolog de la siguiente página:http://www.swi-prolog.org/download/stable

2. Ejecutamos el archivo .exe que descargamos y seguimos el asistente

3. Una vez instalado procedemos a ejecutarlo y presenciamos la interfaz, muy

parecida a la línea de comandos de los sistemas operativos donde haremos nuestras consultas.

Primeros pasos:

Editor de Texto: Para comenzar a escribir nuestros programas SWI-Prolog tiene integrado un editor de texto que podemos abrir desde el menú File>New o podemos utilizar nuestro editor de texto favorito algunos de ellos permiten la instalación de paquetes para resaltar la sintaxis de prolog, solo hay que recordar guardar el archivo con la extensión “.pl” .

Ejecutar Programa: Para ejecutar un programa vamos al menú File>consult, seleccionamos el archivo .pl que tiene escrito nuestro código.

Page 2: Manuals Wipro Log

Una vez realizado esto podremos hacer las consultas que queramos. Si modificamos el programa usaremos el comando “make.” para compilar los cambios.

consulta: Supongamos hemos cargado nuestro programa con la siguiente base de conocimientos:

mujer (mia).mujer (Jody).

mujer (yolanda).

Y queremos saber si Mia es mujer, entonces en la consola de SWI ejecutamos:

?- mujer(mia)

Y prolog nos responderá: true

GTrace: Es una herramienta para ver de manera gráfica cómo se va ejecutando nuestro programa esta herramienta es de mucha utilidad para debugear nuestro código en caso de tener errores. La forma de ejecutarlo es antes de nuestra consulta escribir “gtrace ,consulta();”.

Prolog:

Page 3: Manuals Wipro Log

Sólo hay tres construcciones básicas en Prolog: hechos, reglas y consultas. Una colección de hechos y reglas se llama una base de conocimientos (o una base de datos) y la programación Prolog tiene que ver con la escritura bases de conocimiento. Es decir, los programas Prolog, simplemente son las bases de conocimiento, colecciones de hechos y reglas que describen alguna colección de relaciones que encontramos interesante.

Entonces, ¿cómo usamos un programa Prolog? Al plantear consultas. Es decir, haciendo preguntas acerca de la información almacenada en la base de conocimientos.

Ahora bien, esto probablemente suena bastante extraño. Ciertamente, no es obvio que tiene mucho que ver con la programación. Pero, como veremos más adelante, el camino de la programación Prolog tiene mucho sentido, al menos para ciertas tareas; por ejemplo, es útil en la lingüística computacional e Inteligencia Artificial (AI).

Los hechos, las reglas y las consultas son términos en prolog existen 4 tipos de términos: átomos, números, variables y términos.

Átomos: Un átomo puede ser:

● Una cadena de caracteres formada por letras mayúsculas, letras minúsculas, dígitos y guiones bajos, que comienza con una letra minúscula. He aquí algunos ejemplos: tocar_Guitarra, irAlCine, jugador2.

● Una secuencia arbitraria de caracteres encerrados entre comillas simples.Por ejemplo, “Vicente”, “%$&$”, “Mago de oz”, la secuencia de caracteres es el nombre del atomo. Nota que podemos utilizar espacios en blanco.

● Una cadena de caracteres especiales algunos de ellos con un significado predefinido como :- .

Números: Los números reales no son particularmente importantes en las aplicaciones

típicas Prolog. Sin embargo la mayoría de las implementaciones de prolog soportan el uso de números de punto flotante.

Los enteros por otro lado son útiles para tareas como contar los elementos de una lista y otras operaciones que discutiremos más adelante. Variables:

Una variable es una cadena de caracteres formada por letras mayúsculas, letras minúsculas, dígitos y guiones bajos, que comienza con una letra mayúscula. Por ejemplo, X, Y, Variable,Carro __, Lista.

Page 4: Manuals Wipro Log

Un único guión bajo “_” define una variable especial conocida como variable anónima se utiliza en el mismo lugar de las variables estándar, pero nunca son instanciadas bajo ningún valor en particular.

Términos complejos: Los términos complejos se construyen con un functor seguido de una

secuencia de argumentos. Los argumentos se escriben entre paréntesis y se separan por comas, paréntesis deben escribirse enseguida del functor sin dejar espacios, el functor debe ser un átomo, es decir, una variable no puede usarse como functor, por otro lado, los argumentos pueden ser átomos o variables. Un ejemplo de un término complejo puede ser:

tocaGuitarra(raul).Su functor es “tocarGuitarra” y su argumento es “raul”.

Podemos construir términos más complejos anidando términos complejos dentro de un término complejo:

almacenar(Registro, libro(titulo(’2001: A Space Odyssey’), autor(’Arthur C. Clarke’))).

Su functor es “almacenar” y tiene dos argumentos la variable “Registro” y el término complejo llamado “libro” con dos términos complejos como argumento “titulo” y “autor” con sus respectivos argumentos.

El número de argumentos que tiene un argumento es llamado aridad. Por ejemplo, mujer(mia) es un término complejo de aridad 1, y ama(vicente,mia) es un término complejo de aridad 2. En la documentación de SWI-Prolog para indicar la aridad de un predicado utilizan la notación: functor/aridad

La aridad es importante para Prolog. Prolog nos permite definir predicados con el mismo functor pero con diferente número de argumento. Por ejemplo:

ama(vicente,mia).ama(vicente,mia,karla).

Para Prolog estos son dos predicados distintos debido a que tienen distinta aridad.

Reglas:Hasta ahora hemos definido solo hechos pero además también se pueden

introducir reglas. Una regla dice que algo es verdad si otra cosa es verdad. Para definir una regla utilizaremos el símbolo “:-” que significa “si”.

tiene_hambre(perro):-come(perro,croquetas)

Operador AND:

Page 5: Manuals Wipro Log

Si queremos representar en prolog una conjuncion utilizaremos el símbolo de coma, por ejemplo para representar:

conoce(mario,maria) ⋀ conoce(juan,juana)escribimos en Prolog:

conoce(mario,maria) , conoce(juan,juana)

Unificación:Informalmente, unificar es el proceso por el cual dos o más expresiones se

convierten en idénticas mediante la aplicación de una sustitución, denominada unificadora.

Dos términos unifican si son el mismo término o si contienen variables que puedan ser instanciadas con términos de tal forma que resulten siendo iguales. Esto significa por ejemplo que el término “mia” y “mia” unifican porque son el mismo, el término “X” y “X” unifican porque son la misma variable, el término “mujer(mia)” y “mujer(mia)” unifican porque son el mismo término complejo, el término “mujer(mia)” y “mujer(vicente)” no unifican porque no son el mismo término y ninguno de ellos contiene variables que puedan ser instanciadas para hacerlos iguales.

¿Que pasa con los términos “mia” y “X”? No son el mismo término.Sin embargo, la variable X puede ser instanciada como mia lo que hace que sean iguales. Algo similar ocurre con los términos “mujer(X)” y “mujer(mia)” unifican porque se pueden hacer iguales mediante la instanciación de X como mia. Sin embargo no es posible unificar los términos loves(vincent,X) y loves(X,mia) no existe una forma de instanciar X que haga que los términos sean iguales.

Prueba de Búsqueda: Ahora que sabemos sobre unificación, estamos en posición de aprender

como Prolog realiza búsquedas en una base de conocimientos.Supongamos que estamos trabajando con la siguiente base de conocimientos:

f(a).f(b).

g(a).g(b).

h(b).

k(X):-f(X), g(X), h(X).Y supongamos ahora hacemos la consulta:

?-k(Y).Probablemente es claro que solo hay una respuesta para esta consulta, llamada k(b), pero ¿como hace prolog para saberlo?.

Page 6: Manuals Wipro Log

Prolog lee la base de conocimientos y trata de unificar k(Y) ya sea con un hecho o con la cabeza de una regla. Busca en la base de conocimientos de arriba hacia abajo y lleva a cabo la unificación si es posible.

Cuando Prolog unifica una variable de una consulta en una variable de una regla o hecho, genera una variable nueva (supongamos _G34 en nuestra consulta) para representar las variables compartidas.

Si usamos el proceso de búsqueda de un modo gráfico obtenemos el siguiente diagrama:

.Todo lo que esté encerrado en una caja es una consulta o una meta. Siempre que tengamos una lista de metas (f(_G34),g(_G34),h(_G34)), Prolog intenta satisfacerlas una por una de izquierda a derecha. Cuando unificamos f(_G34), la variable _G34 es instanciada a “a” y la instanciación aplica a todas las ocurrencias de _G34 en la lista de metas.

Backtracking: La consulta anterior no esta terminada, podemos ver que no hay forma de

satisfacer h(a) que fue la última meta que obtuvimos. La única información que tenemos de h en la base de conocimientos es h(b) y no se puede unificar con h(a).

Prolog decide que ha cometido un error y checa si ha saltado alguna forma posible de unificar la meta con un hecho o con la cabeza de una regla. Esto lo hace regresando por la ruta mostrada en el diagrama buscando alternativas. Ahora, no hay otra alternativa en la base de conocimientos para unificar con g(a), pero si hay otra alternativa para unificar f(_G34). Los puntos en la búsqueda en los que hay varias alternativas para unificar una meta se les conoce como “puntos de decisión” choice points). Prolog mantiene un seguimiento de los puntos de decisión que va

Page 7: Manuals Wipro Log

encontrando, por si toma una decisión equivocada puede regresar al punto anterior y tratar con otra ruta. Este proceso se conoce como “vuelta atrás” (backtraking) y es fundamental para prolog.

En nuestra consulta nuestro punto de decisión es:f(_G34), g(_G34), h(_G34).

Entonces al fallar con h(a) prolog realiza una vuelta atrás a este punto y comienza una búsqueda con diferentes alternativas.

Recursividad: En términos generales, un predicado se define de forma recursiva si en una o

más reglas en su definición se refiere a si mismo.

Considere la siguiente base de conocimientos: is_digesting(X,Y) :- just_ate(X,Y). is_digesting(X,Y) :-

just_ate(X,Z),is_digesting(Z,Y). just_ate(mosquito,blood(john)). just_ate(frog,mosquito). just_ate(stork,frog).

A primera vista esto parece bastante normal: es sólo una base de conocimientos que contiene tres hechos y dos reglas. Pero la definición del predicado is_digesting / 2 es recursivo. Tenga en cuenta que is_digesting / 2 es (al menos parcialmente) se define en términos de sí mismo, para el funtor is_digesting / 2 ocurre tanto en la cabeza y el cuerpo de la segunda regla. Crucialmente debe haber un “escape” en

Page 8: Manuals Wipro Log

todo predicado definido recursivamente, en este caso es proporcionado por el predicado just_ate/2 de la primera regla.

Aritmética: Prolog ofrece una serie de herramientas aritméticas básicas para la

manipulación de números enteros (es decir, los números de la forma ...- 3, -2, -1, 0, 1, 2, 3, 4 ...).

Con la notación anterior Prolog nos responderá si la operación es correcta: ?- 8 is 6+2.

true Una forma más que resulta de mayor interés para realizar operaciones aritméticas es la siguiente:

?- X is 6+2. X = 8

También podemos usar operaciones aritméticas en la definición de un predicado: add_3_and_double(X,Y) :- Y is (X+3)*2.

Si realizamos una consulta:?- add_3_and_double(1,X).X = 8

Listas:Una lista es una secuencia finita de elementos separados por comas y

encerrados entre corchetes:[mia, vicente, julio, yolanda][mia, padre(raul),X,2,mia]

[][mia,[vicente,julio],[raul,novia(raul)]]

Como podemos ver en el segundo ejemplo todo tipo de objeto puede ser un elemento de una lista. El primer elemento de esta lista es “mia” que es un átomo, el segundo es “padre(raul)” que es un término complejo, el tercer término es una variable y el cuarto es un número, también podemos ver que el mismo elemento

Page 9: Manuals Wipro Log

puede aparecer varias veces en la misma lista, esto ocurre con el quinto elemento “mia” que es el mismo que el primer elemento.

El tercer ejemplo nos muestra una lista vacía.

Una característica muy importante de las listas lo podemos ver en el ejemplo 4, una lista puede contener otras listas.

Podemos pensar que la estructura para toda lista no vacía consiste en dos partes, una cabeza que es simplemente el primer elemento de la lista y una cola que son todos los elementos restantes.