tutorial prolog (turbo)

41
Tutorial del Prolog, Programación Lógica Introducción Conocer Prolog es importante para todo aquel que esté relacionado con las computadoras, debido a que el lenguaje se ha convertido en uno de los principales entornos de programación para inteligencia artificial (IA), una de las principales áreas de aplicación de las computadoras que está emergiendo, aunque posiblemente demasiado lejos del objetivo que persigue. La Inteligencia Artificial está relacionada íntimamente con algunas de las más excitantes áreas de la Informática: Procesadores de última generación, Sistemas Expertos y procesamiento del lenguaje natural. En sus inicios (Los años 80’) Prolog estaba orientado a minicomputadoras o estaciones de trabajo razón por la cual estaba disponible para pocos programadores que tenían acceso a tales computadoras, pero hoy en buena parte, la Inteligencia Artificial está disponible virtualmente a todo el mundo. Prolog es uno de los lenguajes de programación más usado por los investigadores de Inteligencia Artificial, es que a criterio de éstos, Prolog ofrece un método diferente al empleado con los lenguajes más familiares. Si usted se siente atraído por la Inteligencia Artificial, debe saber que el lenguaje no convertirá a su máquina en un cerebro, ni le ofrecerá soluciones inmediatas a aplicaciones poderosas, sin embargo aprenderá a desarrollar algunos métodos de software que han sido ya aplicados por los investigadores de Inteligencia Artificial. Aquí hago un poco de historia: 1 Prolog significa “PROgramming in LOGic” y es un lenguaje de programación de computadoras inventado en 1970 por Alain Colmeraeuer y sus colegas de la Universidad de Marsella (Francia). Rápidamente Prolog se convirtió en el principal lenguaje de la IA en Europa mientras que LIPS era el más utilizado en Estados Unidos. Prolog no había despertado mucho interés en los programadores de todo el mundo, hasta que los científicos japoneses lanzaron su famoso proyecto de quinta generación con el objetivo de diseñar 1 Buena parte de introducción fue tomada del Libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-HILL, 1987. 1

Upload: jorge-ivan-pincay-ponce

Post on 06-Aug-2015

282 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Introducción

Conocer Prolog es importante para todo aquel que esté relacionado con las computadoras, debido a que el lenguaje se ha convertido en uno de los principales entornos de programación para inteligencia artificial (IA), una de las principales áreas de aplicación de las computadoras que está emergiendo, aunque posiblemente demasiado lejos del objetivo que persigue. La Inteligencia Artificial está relacionada íntimamente con algunas de las más excitantes áreas de la Informática: Procesadores de última generación, Sistemas Expertos y procesamiento del lenguaje natural.

En sus inicios (Los años 80’) Prolog estaba orientado a minicomputadoras o estaciones de trabajo razón por la cual estaba disponible para pocos programadores que tenían acceso a tales computadoras, pero hoy en buena parte, la Inteligencia Artificial está disponible virtualmente a todo el mundo. Prolog es uno de los lenguajes de programación más usado por los investigadores de Inteligencia Artificial, es que a criterio de éstos, Prolog ofrece un método diferente al empleado con los lenguajes más familiares.

Si usted se siente atraído por la Inteligencia Artificial, debe saber que el lenguaje no convertirá a su máquina en un cerebro, ni le ofrecerá soluciones inmediatas a aplicaciones poderosas, sin embargo aprenderá a desarrollar algunos métodos de software que han sido ya aplicados por los investigadores de Inteligencia Artificial.

Aquí hago un poco de historia:1 Prolog significa “PROgramming in LOGic” y es un lenguaje de programación de computadoras inventado en 1970 por Alain Colmeraeuer y sus colegas de la Universidad de Marsella (Francia). Rápidamente Prolog se convirtió en el principal lenguaje de la IA en Europa mientras que LIPS era el más utilizado en Estados Unidos. Prolog no había despertado mucho interés en los programadores de todo el mundo, hasta que los científicos japoneses lanzaron su famoso proyecto de quinta generación con el objetivo de diseñar nuevas computadoras y software, los cuales no tendrían rivales a partir de los años 90 (Siglo XX), no fue coincidencia que eligieran a Prolog para su trabajo, de repente la gente comenzó a mirar de otra forma a Prolog y a sus posibilidades.

1 Buena parte de introducción fue tomada del Libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-HILL, 1987.

1

Page 2: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Contenido9.- Variables............................................................................................................- 3 -

Bibliografía...................................................................................................................- 3 -

Programación Lógica.............................................................................................- 4 -

9.- Variables..........................................................................................................- 11 -

2

Page 3: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Contenido…

Introducción

Unidad I1.- Términos Importantes2.- El entorno de Prolog3.- Introduciéndonos Brevemente Al Código De Prolog4.- Hechos: Objetos y Relaciones

Unidad II5.- Sintaxis De Los Programas En Prolog6.- Hechos (Programas, Predicados)7.- Introducción Del Primer Programa Ejemplo8.- El Primer Programa Ejemplo9.- Variables.

Unidad III10.- Reglas Y Vuelta Atrás11.- Objetivos Con Múltiples Argumentos11.- Unificación12.- Comparación De Términos14.- Estructuras De Control15- Aritmética16.- Listas

Unidad IV17.- Ejemplos

Bibliografía

Apéndice

3

Page 4: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

UNIDAD I

1.- Términos Importantes2

Programación Lógica.La programación lógica es un paradigma de los lenguajes de programación en el cual los programas se consideran como una serie de aserciones lógicas. De esta forma, el conocimiento se representa mediante reglas, tratándose de sistemas declarativos. Una representación declarativa es aquélla en la que el conocimiento está especificado, pero en la que la manera en que dicho conocimiento debe ser usado no viene dado. El más popular de los sistemas de programación lógica es el PROLOG.

LógicaComo su nombre lo implica PROLOG se basa en manipulaciones lógicas y no es único en éste aspecto, a éste grupo pertenecen varios lenguaje de programación, tales lenguajes trabajan con lógica proposicional, también conocida como lógica de predicados o cálculo proposicional. Por ejemplo, las siguientes sentencias son hechos:

La gente con zapatos de baseball juega al baseball.La persona # 1 tiene zapatos de baseball.

Lo que puede inferirse, calcularse, figurarse, deducirse o determinarse de éstos hechos es que la persona # 1 juega al baseball.

Prolog hace que la computadora maneje la parte de inferir.

Prolog tiene un motor de inferencia integrado que automáticamente busca los hechos y construye o prueba conclusiones lógicas. Así, dado el problema puede parecer trivial, pero si usted tuviera una base de datos técnicas almacenada con miles de hechos y reglas, no sería práctico darle a un humano esa lista y pedirle una respuesta de manera práctica, pues en el procesamiento del lenguaje natural, la base de datos contendría reglas acerca del reconocimiento y comprensión del lenguaje

“Todos los humanos son mortales” y “Todos los griegos son humanos”, se llega a la conclusión válida de que

“Todos los griegos son mortales”. Aristóteles

2 Términos tomados del libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-HILL, 1987.

4

Page 5: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

2.- El entorno de PROLOG (Versión SWI Versión 7.1.16-7-gfe807f8)

Imagen 1: Pantalla principal de PROLOG

Los programas en PROLOG generalmente buscan a través de una lista de reglas y hechos intentando responder a preguntas, pero también puede hacer otras cosas que otros lenguajes de programación hacen: pueden realizar juegos, dibujar gráficos o resolver ecuaciones. Usted se hará preguntas y obtendrá respuestas en la ventana dialog.

Imagen 2: Menú desde el cual se puede editar o crear archivos (.pl) en SWI Prolog

5

Page 6: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Imagen 3: Ventana del editor de códigos (.pl) en SWI Prolog

Desde el menú PROLOG, la ventana del Editor de códigos

Ventana Dialog.-

Ventana Message.- Algunas variedades del Prolog no dicen cuando algo está mal. Si usted comete alguna falta de escritura o si tiene algún problema con su

6

Page 7: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

programa, el intérprete o compilador del Prolog le dará como mucho un crítico mensaje de error. El Turbo Prolog usa la ventana Message para decirle lo que está sucediendo, sea correcto o incorrecto.

La Ventana Trace.- Aunque su programa cumpla con las reglas sintácticas del Turbo Prolog oficial, puede que no realice exactamente lo que quiere. Aunque que realice lo que ha planificado, puede que quiera saber lo que hace desde el principio hasta final. Éste el propósito de la ventana Trace. Puede añadir órdenes al Turbo Prolog forzando al programa a que trabaje paso a paso en vez de seguido. Después de cada paso la ventana parará y mostrará lo que el programa está haciendo.

3.- Introduciéndonos Brevemente Al Código De Prolog3

El árbol genealógico, un problema comúnmente resuelto en Prolog

Prolog se enmarca en el paradigma de los lenguajes declarativos, lo que lo diferencia enormemente de otros lenguajes más populares tales como Fortran, Pascal, C, etc.

En todos los mencionados, las instrucciones se ejecutan normalmente en orden secuencial, es decir, una a continuación de otra, en el mismo orden en que están escritas, que sólo varía cuando se alcanza una instrucción de control (un bucle, una instrucción condicional o una transferencia).

Los programas en Prolog se componen de cláusulas que constituyen reglas del tipo "modus ponens", es decir, "Si es verdad el antecendente, entonces es verdad el consecuente". No obstante, la forma de escribir las cláusulas es al contrario de lo habitual. Primero se escribe el consecuente y luego el antecedente. El antecedente puede ser una conjunción de condiciones que se denomina secuencia de objetivos.

Cada objetivo se separa con una coma y puede considerarse similar a una instrucción o llamada a procedimiento de los lenguajes imperativos. En Prolog no existen instrucciones de control. Su ejecución se basa en dos conceptos: la unificación y el backtracking. Gracias a la unificación, cada objetivo determina un subconjunto de cláusulas susceptibles de ser ejecutadas. Cada una de ellas se denomina punto de elección. Prolog selecciona el primer punto de elección y sigue ejecutando el programa hasta determinar si el objetivo es verdadero o falso. En caso de ser falso

3 A Wikepedia Projects, http://www.wikipedia.com

7

Aunque aún falta dar muchas indicaciones en cuanto a código, este ejemplo nos muestra algunas cosas

Page 8: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

entra en juego el 'backtracking', que consiste en deshacer todo lo ejecutado situando el programa en el mismo estado en el que estaba justo antes de llegar al punto de elección. Entonces se toma el siguiente punto de elección que estaba pendiente y se repite de nuevo el proceso. Todos los objetivos terminan su ejecución bien en "verdadero", bien en "falso", tal como lo ilustra el siguiente bien comentado ejemplo:

.%%%% declaraciones%%

padrede('juan', 'maria'). % juan es padre de mariapadrede('pablo', 'juan'). % pablo es padre de juanpadrede('pablo', 'marcela').padrede('carlos', 'debora').

% A es hijo de B si B es padre de A

hijode(A,B) :- padrede(B,A).

% A es abuelo de B si A es padre de C y C es padre B

abuelode(A,B) :- padrede(A,C), padrede(C, B).

% A y B son hermanos si el padre de A es tambien el padre de B y % si A y B no son lo mismo

hermanode(A,B) :- padrede(C,A) , padrede(C,B), A <> B.

% A y B son familiares si A es padre de B o A es hijo de B o A es % hermano de B

familiarde(A,B) :- padrede(A,B) ; hijode(A,B) ; hermanode(A,B).

Las Consultas se hacen desde la ventana Dialog

%%%% consultas%%

% juan es hermano de marcela??- hermanode('juan', 'marcela').yes

% carlos es hermano de juan??- hermanode('carlos', 'juan').no

% pablo es abuelo de maria??- abuelode('pablo', 'maria').yes

% maria es abuelo de pablo??- abuelode('maria', 'pablo').no

8

Page 9: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

9

Page 10: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Unidad II

4.- Hechos: Objetos y Relaciones

En la forma más sencilla Prolog trata con objetos y las relaciones entre ellos. Puede incluso oír hablar de él como lenguaje orientado a objeto. Un objeto no es necesariamente algo tangible, puede ser cualquier cosa que puede representarse simbólicamente en una computadora, he aquí unos ejemplos de objetos:

carlos felipediana Isabel

Aquí algunas relaciones que son útiles cuando se consideran estos objetos:

rey reina príncipeprincesa madre padrehijo

Habrá observado que ninguna de estas palabras comienza en mayúsculas, pues no es ninguna falta, pues mayúsculas y minúsculas tienen significado diferente en Prolog.

He aquí otro conjunto de objetos y relaciones:

vaca murciélago iguana secoyahelecho ibm_pc apple_macintosh

y las relaciones son:

animal mineral vegetal mamiferoreptil computadora

Ahora ya está preparado para escribir unas cuantas sentencias en Prolog pero antes debe conocer un poco la sintaxis del programa.

5.- Sintaxis De Los Programas En Prolog

La sintaxis de un lenguaje de programación es el conjunto de reglas que gobiernan que las palabras están bien escritas, la posición en que deben escribirse estas palabras, los lugares donde van las puntuaciones, etc. Aunque comprenda la teoría de un lenguaje, no podrá hacer nada con el si no se conoce su sintaxis.

Existen varios tipos de sintaxis en Prolog. Implementaciones del lenguaje de diferentes compañías de Software son a veces muy diferentes.

El Turbo Prolog contiene la mayoría de las características y sintaxis del Prolog descritos en el popular libro Programming in Prolog de W.F cloksin, las mismas se irán describiendo conforme avance en éste tutorial.

6.- Hechos (Programas, Predicados)

10

Page 11: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Expresan relaciones entre objetos. Supongamos que queremos expresar el hecho de que "un coche tiene ruedas". Este hecho, consta de dos objetos, "coche" y "ruedas", y de una relación llamada "tiene". La forma de representarlo en PROLOG es:

tiene (coche, ruedas).

Es decir

relacion (objeto)

Obsérvese que el objeto está entre paréntesis, y la relación le precede, cuando se escribe de ésta forma la relación se conoce como predicado

Un programa Prolog está formado por predicados. Cada predicado está definido unívocamente por su nombre y su aridad.

La aridad es el número de argumentos (o parámetros) de un predicado. Ejemplo:

humano (pepe).humano (juan).

Para referenciar este predicado se utiliza únicamente su nombre y aridad: humano. Cada predicado en Prolog puede estar definido por una o más cláusulas. En nuestro ejemplo, humano está definido por dos cláusulas.

Las cláusulas a su vez pueden ser de dos tipos:

hechos y reglas.

Los hechos son afirmaciones que consideramos ciertas en nuestro programa.

Las reglas son implicaciones lógicas, que pueden tener varios antecedentes pero un único consecuente. Este tipo de reglas se denominan cláusulas de Horn.

Ej. humano(X) mortal(X).

que utilizando la sintaxis de Prolog se escribe:

mortal (X):- humano(X).

Los hechos se pueden considerar casos particulares de reglas en donde no hay ningún antecedente.

7.- Introducción Del Primer Programa Ejemplo4

4 Tomado del libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-HILL, 1987.

11

Page 12: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

La siguiente es una lista de la lista de hechos de la segunda lista de objetos y relaciones mencionados anteriormente:

animal (vaca)animal (murcielago)animal (iguana)vegetal (secoya)computadora (ibm_pc)computadora (apple_macintosh)

Note que no debe dejar espacios en blancos, así que puede usar el carácter de subrayado.

Antes de introducir éste programa en la ventana editor de Prolog e interactuar con él desde la ventana dialog, necesitamos saber otros dos detalles:

1. Los comentariosLos comentarios en prolog se deben escribir entre /* y */, ejemplo:

/* Esto es un ejemplo de comentario en Turbo Prolog 2.0 */

Otra forma es con % al inicio de la línea, ejemplo:

% Esta es otra manera de hacer comentarios en% Turbo Prolog 2.0

2. Divisiones del programaLa mayoría de los programas en Turbo Prolog están organizados en cuatro secciones principales:

Claúsulas (clauses) Predicados (predicates) Dominios (domains) Objetivos

Nota: No necesariamente deben estar todas estas secciones en un programa en Prolog, pero vale familiarizarse con ellas.

Cláusulas (clauses)Los hechos que construyo con los objetivos y relaciones se listan en la sección de clauses, esta sección puede incluir reglas y construcciones que se detallaran brevemente más adelante.

Predicados (predicates)Los predicados son las relaciones (termino heredado de la lógica formal, el cual es una de las bases del Prolog), en esta sección se declaran los predicados que vaya a usar en su programa.

Dominios (domains)

12

Page 13: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Esta sección se usa para decirle al Prolog que tipo de dato van a manejar los predicados y ahorrar trabajo al Prolog.

Objetivos (goal)Esta sección le dice al Turbo Prolog lo que ha de encontrar en lo que desea que la computadora haga con la información que se le ha suministrado en las otras tres secciones.

Normalmente un programa tendrá las secciones de clauses y predicates, pero es posible tener un programa que tenga sólo una sección objetivo (goal).

Debido a que prolog puede usarse interactivamente, es frecuente ejecutar un programa y esperar que luego se le pregunte un objetivo (desde la ventana dialog). Es que el Turbo Prolog también trabaja de ésta forma, pero suministra una sección objetivo (goal) para permitirle ejecutar los programas en forma no interactiva. Usted puede escribir el objetivo en el código original de tal forma que tan pronto como ejecute el programa, éste pueda trabajar en la búsqueda de la solución deseada.

8.- El Primer Programa Ejemplo

/* Ejemplo Animal, vegetal o computadora */

Note que en éste programa no aparece la sección goal en la ventana editor, asi también note que vez compilado el programa (F9) y luego ejecutado (R) aparece la palabra goal en la ventana dialog para allí expresar los objetivos y que el prolog pueda trabajar, en el ejemplo le preguntamos a Prolog si el objeto perro tiene relación con animal y contesto no, pues la razón que no le especificamos en el código una clauses o predicates correspondiente.

Variables.

Hay otra forma de hacer preguntas. Si se conoce la relación pero no los objetos, puede usar variables. Cualquier palabra objeto que comienza con un letra mayúscula se considera una variable. Después de la mayúscula puede tener cualquier número de letras (mayúscula o minúscula), junto con dígitos y

13

doaminscosa = symbol

predicatescomputadora (cosa)vegetal (cosa)animal (cosa)

clausesanimal (vaca)animal (murcielago)animal (iguana)vegetal (secoya)computadora (ibm_pc)computadora (apple_macintosh)

Page 14: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

caracteres de subrayado. La forma más rápida de ver lo que puede hacer una variable es hacer una pregunta al programa, de la siguiente manera:

animal (X)

como un objetivo, pronto verá la siguiente pantalla.

goal: animal (X)X = vacaX= muercielagoX= iguana3 Solutions

14

Page 15: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Unidad III

10.- Reglas Y Vuelta AtrásEl Turbo Prolog ofrece mucho más que los hechos y variables elementales escrito ya antes en éste tutorial.

Términos.- son los bloques de construcción de Turbo Prolog 2.0. Un término puede ser una constante una variable o una estructura. Lo que hemos venido usando hasta ahora han sido constantes, tales como:

MurciélagoVacaIbm_pcapple_macintosh

También hemos trabajados con variables aunque sólo con la popular “X” una constante representa un objeto o relación específica. Una variable (la cual comienza siempre con una letra mayúscula) representa un objeto cuyo nombre aún no se conoce cuando se está haciendo el programa. Examinaremos más adelante las estructuras.

Aridad.- La aridad de un predicado es el número de argumentos que tiene (hasta ahora sólo he explicado ejercicios con predicados de una aridad). Pero la mayoría de ejemplos en Prolog no son de esa manera, observe el siguiente ejemplo.

Tiburón (pierna, humano)

para describir la relación (predicado) entre los dos argumentos “pierna” y ”humano”. Esto podría traducirse como “los tiburones se comen la piernas de los humanos”. Pero recuerde que el significado es el que Usted quiera darle, por que también lo podría tomar como “las piernas son la parte de los humanos que atraen a los tiburones”. Se pueden escribir comentarios en los programas para explicar lo que intenta decir un predicado. Esto ayuda al programador, pero si lo que usted quiere es ayudar al compilador debe hacer algo como esto:

computadora (ibm_pc,_512,_2_floppy,_DOS_2,_2serial,_lparallel, _Hercules,_Princeton)

Como notará son las características básicas de antigua computadora, puede incluso tener un predicado sin argumentos (¿…? Se verá mas adelante).

Considere que las letras que empiezan con mayúsculas se toman como variables (es por eso que usamos los “_” en algunos casos).

11.- Objetivos Con Múltiples ArgumentosLos programas que trabajan con múltiples argumentos pueden cumplir con objetivos más complejos. Ejemplo:

observa (guillermo, roberto)

15

Page 16: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

observa (juan, juana)observa (federico, felicia)observa (miguel, guillermo)observa (brenda, gregorio)observa (roberto, roberto)observa (federico, gregorio)observa (guillermo, felipe)

Llame a la ventana editor y escriba lo siguiente:

El predicado “observa” significa que el objeto de la primera posición observa al objeto de la segunda posición; es decir: “Guillermo observa a Roberto” y no “Roberto observa a Guillermo”. (El código que escribió aún no funciona).

Ahora puede incluir predicados y dominios en el ejercicio. Todos los argumentos son del mismo tipo y pueden estar incluidos en el mismo dominio (“symbol” es el mejor dominio para usarlo para nombres de cosas o personas). Recuerde que persona es nuestro símbolo para ellos. La palabra “symbol” significa siempre una cierta cosa.

16

Page 17: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Apliquemos un poco de lo ya visto, y manejemos argumentos múltiples pero con una variable y observe como Prolog responde en la ventana Dialog.

También puede variables en ambos argumentos y vea como responde Prolog en la ventana Dialog

Uso de variables anónimas, se usa sólo un carácter subrayado y el Prolog le responde Yes o No. Ejemplo:

Observa (juan, _)

Prolog le dirá si Juan observa a alguien o no pero no le dará el nombre.

17

Page 18: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Analice los últimos ejemplos que se presentan en ésta ventana

Objetivos CompuestosLos objetivos pueden ser aún más complejos que los vistos en la sección anterior, observe el siguiente ejemplo de la figura siguiente.

Los operadores And, Or y NotSi tiene el siguiente objetivo (se muestra en la figura):

observa (guillermo, roberto) and observa (juan, juana)

En el objetivo estará preguntando “¿Es verdad por las cláusulas que se tienen que Guillermo observa a Roberto y Juan observa a Juana” Este objetivo será considerado verdad si ambos partes del mismo son verdaderas, tal como lo muestra la siguiente figura:

Nota: La palabra “and” puede ser reemplazado por “,” en algunas implementaciones de Prolog.

18

Page 19: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Desde luego puede aplicar lo aprendido anteriormente y ejecutar variables anónimas, u otra cosa.

De la misma manera también puede usar el operador Or que se debe escribir “or” o también “;” el operador Not lo estudiamos más adelante.

ReglasCómo en su espacio lo escribí, la sección clauses también puede incluir reglas, una rega típica dice que algo es verdad si algo es verdad, las reglas hacen que Prolog pase de se un diccionario a ser una máquina “pensante”. Añadamos la sguiente regla al ejemplo:

feliz (gregorio) if observa (brenda, gregorio)

Y

nervioso (Quien) if observa (guillermo, Quien)

Al final de los hechos asegúrese de poner “.”

La siguiente es una muestra de cómo debe estar su código en la ventana edit.

domainspersona = symbol

predicatesobserva (persona, persona)feliz (persona)nervioso(persona)

clauses

observa (guillermo, roberto).observa (juan, juana).observa (federico, felicia).observa (miguel, guillermo).

19

Page 20: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

observa (brenda, gregorio).observa (roberto, roberto).observa (federico, gregorio).observa (guillermo, felipe).feliz (erico) if observa (brenda, erico).feliz (gregorio) if observa (brenda, gregorio).nervioso (Quien) if observa (guillermo, Quien).

El Turbo Prolog intentará satisfacer o identificar el objetivo “feliz (gregorio)”. De arriba hacia abajo, buscará entre las cláusulas, buscando uno que coincida con “feliz”. Luego compraba si dicho predicado tiene la misma aridad, si es así contnúa el proceso y cuando encuentra la palabra “if” concluye que esto no es hecho si no una regla.

Vuelta atrás (Backtracking)En éste punto el Turbo Prolog vuelve a la primera cláusula y comienza a búsqueda hacia atrás en la lista esto se llama vuelta atrás y es una importante característica del Prolog. Siempre que necesita ser satisfecho un subobjetivo, el Prolog vuelve hacia atrás de la Base de Datos, buscando siempre de arriba hacia abajo y de izquierda a derecha. Hasta encontrar una coincidencia. La vuelta hacia atrás puede fácilmente crecer en complejidad conforme las reglas y los demás objetivos sean más complejos.

Buscando en los hechos el Turbo Prolog pronto encuentra el hecho “observa (brenda, gregorio)”. Identifica el subobjetivo con ese hecho y vuelve a la regla “feliz (gregorio) if observa (brenda, gregorio)“, sabiendo entonces que la parte de la regla “feliz (gregorio)” puede utilizarse para identificar el objetivo general, ya que la parte derecha era “true”

Instanciación y vinculaciónSi prueba el objetivo “feliz (Quien)” obtendrá una respuesta Gregorio después del mismo tipo de búsqueda. La única diferencia es que la variable quien necesita ser instanciada a “gregorio”. El Turbo Prolog encuentra el predicado “feliz”, comprobará su aridad, instanciará la variable “Quien” a la constante “gregorio”, actualizará el objetivo de la parte derecha de la regla, identificará al nuevo objetivo y vuelve a la regla. Entonces pondrá la parte izquierda de la regla a “true”, identificará la parte izquierda del objetivo se cumple e imprimirá el valor dado a la variable. Si desea ver paso a paso lo que sucede puede usar la ventana trace, sólo debería escribir esta palabra al inicio del programa.

tracedomains

persona = symbol

predicatesobserva (persona, persona)feliz (persona)nervioso(persona)

clauses

observa (guillermo, roberto).

20

Page 21: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

observa (juan, juana).observa (federico, felicia).observa (miguel, guillermo).observa (brenda, gregorio).observa (roberto, roberto).observa (federico, gregorio).observa (guillermo, felipe).feliz (erico) if observa (brenda, erico).feliz (gregorio) if observa (brenda, gregorio).nervioso (Quien) if observa (guillermo, Quien).

Notas:

Como variante al “if” puede usar “:-“El operador Not se puede usar de la siguiente forma: feliz (erico) if Not (observa (brenda, erico)).

21

Page 22: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

11.- UnificaciónLa unificación, como ya se ha comentado, es el algoritmo que se encarga de resolver las igualdades lógicas. Aunque la unificación en Prolog sustituye a la asignación de los lenguajes procedurales, no hay que confundirla con esta, son operaciones totalmente distintas. La operación de unificación se representa mediante el operador =.

Ejercicios:X = pepe.3 = X.X = Y.X = 3, X = 5.f(3, 2) = f(X, 2).f(X, p(a) ) = f(p(Y), Y).X = 3 + 2.5 = 3 + 2.X + 3 = 2 + Y.f(X, f(X) ) = f(Y, Y).

12.- Comparación De TérminosPara comparar términos existen varios operadores. De estos operadores, los más importantes son el igual (==) y el distinto (\==). Para éstos hay que tener en cuenta que dos términos son iguales solamente si son exactamente el mismo término (mismo valor y mismo tipo).

Ej.5 == 5 Yes5 == ‘5’ No Estamos comparando un entero con un átomo.5 == 2 + 3 No Estamos comparando un entero con una estructura.5 == X No Estamos comparando un entero con una variable.

Resolución De Varios Ejercicios Programas

Ej.humano(pepe).humano(juan).mortal(X):-humano(X).

Después de cargar este fichero podremos hacer preguntas como las siguientes:

[eclipse 1]: humano(pepe). Yes[eclipse 2]: mortal(pepe). Yes[eclipse 3]: mortal(javi). No[eclipse 4]: mortal(X).X = pepe more? (;)X = juan

Si encuentra la pregunta como un hecho, la respuesta es directamente que sí (pregunta 1 del ejemplo anterior). Si encuentra la pregunta como la cabeza (o consecuencia) de una regla, toma cada uno de los predicados del cuerpo de la regla como nuevas preguntas y sólo si todas son ciertas, la respuesta será sí (pregunta 2). Si no encuentra ningún hecho o regla que haga cierta la pregunta, la respuesta será no (pregunta 3). Es importante tener en cuenta que para comprobar si la pregunta coincide con un hecho o con la cabeza de una regla se aplica unificación. Esto

22

Page 23: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

significa que si en la pregunta hay alguna variable, ésta unificará con los términos del hecho o regla, es decir, será igual a los valores que hacen cierta la pregunta. Esto se utiliza para extraer resultados (pregunta 4). Si existe más de un resultado, habrá que pulsar “;” para verlos.

Ejercicio:Sea el siguiente programa Prolog:

padre(juan, pepe).padre(pepe, javi).padre(pepe, jose).padre(antonio david).

Completarlo con varias reglas que definan las relaciones hijo, abuelo, hermano, primo, etc. Por ejemplo, para hijo será:

hijo(X, Y):- padre(Y, X).

14.- Estructuras De ControlEn Prolog, a diferencia de lenguajes procedurales como Pascal o C, no existen estructuras de control para bucles. Éstos se implementan mediante predicados recursivos. En cambio existen estructuras de control nuevas que no existen en otros lenguajes y que describiremos como And, Or, Not (ya se revisaron en éste manual).

Varias cláusulas Operador ‘;’

numero(X):- numero(X):-integer(X). integer(X);numero(X):- real(X).real(X).

Normalmente se utiliza la disyunción mediante cláusulas puesto que resulta más claro.

La negación se realiza mediante el operador not. El operador ‘not’ antes de la llamada a un predicado P cambia su valor de verdad, es decir, si el predicado P tiene éxito, not P fallará y si el predicado P falla, not P tendrá éxito.

Ej.no_entero(X):-not integer(X).

Sin embargo hay que tener la precaución de aplicar la negación únicamente en llamadas a predicados donde todas las variables existentes estén ya instanciadas, ya que si no el comportamiento no es el esperado.

Ej.padre(pepe, juan).huerfano(X):-not padre(Z, X).

Para la pregunta huerfano(pepe) funcionará bien y dirá que sí, pero si preguntamos quién es huérfano con huerfano(X) dirá que no, es decir, que no hay ningún huérfano, lo cual no es correcto.

23

Page 24: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

15- AritméticaComo hemos visto, en la unificación no se evalúan expresiones. Para ello existe un operador especial ‘is’ que antes de realizar la unificación evalúa la parte derecha como si se tratase de una expresión aritmética.

X is 3 + 2 es equivalente a X = evaluar(3 + 2)

Para que esta evaluación se pueda llevar a cabo es necesario que la parte derecha no contenga ninguna variable sin instanciar, en caso contrario el sistema dará error. En el apéndice 1 hay una tabla con las operaciones y funciones más comunes en Prolog.

Ej.: ResultadoX is 3 + 2. X = 5 Yes5 is 3 + 2 YesX is 3 + Y Error. No se puede evaluar.X is ln(exp(2) ) X = 2.0 Yes

Comparación AritméticaExisten varios operadores para comparar expresiones aritméticas. Estos operadores evalúan sus dos operandos antes de realizar la comparación. En el apéndice 1 se pueden ver los distintos operadores existentes.

5 =:= 2 + 3. es equivalente a evaluar(5) =:= evaluar(2 + 3)

16.- ListasLa única estructura de datos predefinida de Prolog son las listas. Sirven para agrupar un número indeterminado de términos. En Prolog se escriben de la siguiente forma:

[1, 2, 3]

Los términos son de cualquier tipo, y se pueden mezclar dentro de una misma lista:

[1, pepe, 6.3, [10, 0], A]

El átomo ‘[]’ se utiliza para indicar la lista vacía.

La única operación permitida sobre listas es separar la lista en su primer elemento y el resto de la lista. Al primer elemento de la lista se le denomina cabeza y al resto de la lista cola. El operador que se utiliza para separar la lista es la barra vertical: '|'. [1| [2] ] representa [1, 2] Para separar una lista determinada en su cabeza y su cola, se utiliza unificación.

Ej. Si la lista L es [1, 2, 3]L = [Cab| Cola]. Da como resultado:Cab = 1Cola = [2, 3]

Ej. Predicado para mostrar todos los elementos de una lista:mostrar([]).mostrar([Cab| Cola]):-writeln(Cab),mostrar(Cola).

24

Page 25: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Unidad IV

17.- Ejemplos

EjemploPara este ejemplo igual que el otro necesitaremos un editor de textos para escribir los hechos y reglas que lo componen. Un ejemplo sencillo de programa PROLOG es el siguiente:

quiere_a(maria,enrique).quiere_a(juan,jorge).quiere_a(maria,susana).quiere_a(maria,ana).quiere_a(susana,pablo).quiere_a(ana,jorge).varon(juan).varon(pablo).varon(jorge).varon(enrique).mujer(maria).mujer(susana).mujer(ana).teme_a(susana,pablo).teme_a(jorge,enrique).teme_a(maria,pablo).

/* Esta linea es un comentario */

quiere_pero_teme_a(X,Y) :- quiere_a(X,Y), teme_a(X,Y).querido_por(X,Y) :- quiere_a(Y,X).puede_casarse_con(X,Y) :- quiere_a(X,Y), varon(X), hembra(Y).puede_casarse_con(X,Y) :- quiere_a(X,Y), hembra(X), varon(Y).

Una vez creado, lo salvaremos para su posterior consulta desde el interprete PROLOG

EjemploPara este ejemplo igual que el otro necesitaremos un editor de textos para escribir los hechos y reglas que lo componen. Un ejemplo sencillo de programa PROLOG es el siguiente:

quiere_a(maria,enrique).quiere_a(juan,jorge).quiere_a(maria,susana).quiere_a(maria,ana).quiere_a(susana,pablo).quiere_a(ana,jorge).varon(juan).varon(pablo).varon(jorge).varon(enrique).mujer(maria).mujer(susana).mujer(ana).teme_a(susana,pablo).teme_a(jorge,enrique).teme_a(maria,pablo).

/* Esta linea es un comentario */

25

Page 26: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

quiere_pero_teme_a(X,Y) :- quiere_a(X,Y), teme_a(X,Y).querido_por(X,Y) :- quiere_a(Y,X).puede_casarse_con(X,Y) :- quiere_a(X,Y), varon(X), hembra(Y).puede_casarse_con(X,Y) :- quiere_a(X,Y), hembra(X), varon(Y).

Una vez creado, lo salvaremos para su posterior consulta desde el interprete PROLOG.

EjercicioDe un Árbol Genealógico de una familia y pretende mostrarles como PROLOG puede servir como un manejador de bases de datos. El ejercicio del árbol genealógico. Consideren el siguiente código PROLOG:

hij (abraham, teraj).hij (najor, teraj).hij (aram, teraj).% hij (sara, teraj).hij (lot, aram).hij (hija mayor, lot).hij (hija menor, lot).hij (moab, hija mayor).hij (moab, lot).hij (ben ammi, hija menor).hij (ben ammi, lot).hij (esau, isaac).hij (esau, rebeca).hij (jacob, isaac).hij (jacob, rebeca).

Este texto contiene una definición de la relación hijo o hija de. Así, hij (X,Y) debe leerse como “X es hijo o hija (o descendiente inmediato) de Y”. Observe que esto es similar a una tabla de una base de datos. Cada átomo hij , corresponde a un registro de la base de datos. Uno puede colocar toda esa información y la siguiente en un archivo:

masculino(teraj).masculino(abraham).masculino(najor).masculino(aram).masculino(lot).masculino(moab).masculino(ben ammi).masculino(ismael).femenino(sara).femenino(agar).femenino(hija mayor).femenino(hija menor).femenino(melca).

Y entonces, uno puede interactuar y extraer información de un archivo con el texto anterior. Por ejemplo, después de cargar el archivo, puede uno preguntar al sistema si Rebeca es hija de

? hij (rebeca, batuel).

26

Page 27: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Más interesante todavía es poder preguntar si acaso cierto personaje tiene un hijo o hija:

? hij (X, abraham).

La “X” es una variable. Literalmente, estamos preguntando si existe algún X tal que la relación hij se cumple entre ese X y abraham. Las variables en PROLOG se indican con cadenas de caracteres cuya primer letra es una mayúscula. Esta es la razón por la cual todos los nombres están en minúscula y no comienzan con Mayúscula como indica el buen español. Las respuestas de PROLOG ante esos dos tipos de preguntas son similares. En ambas aparece el “yes” de confirmación. Sin embargo, en el segundo caso, la respuesta va acompañada de una indicación de un valor que permite que la respuesta se responda afirmativamente. Nada de lo anterior supera a las facilidades que ofrece un manejador cualquiera de base de datos. La diferencia comienza a surgir cuando uno usa las relaciones básicas anteriores, para definir nuevas relaciones por medio de reglas que en lo sucesivo llamaremos cláusulas:

hija( X, Y ) :- hij (X, Y), femenino( X ).

Esta es la forma PROLOG de escribir la cláusula: X es hija de Y si X es descendiente inmediata de Y y X es del sexo femenino. Por supuesto, muchas otras relaciones se pueden definir:

hijo(X, Y) :- hij (X, Y), masculino( X ).padre( X , Y ) :- hij ( Y, X ), masculino( X ).madre( X, Y ) :- hij ( Y, X ), femenino( X ).abuela( X, Y ) :- madre( X, Z ), hij ( Y, Z ).abuelo( X, Y ) :- padre( X, Z ), hij ( Y, Z ).descendiente( X, Y ) :- hij ( X, Y ).descendiente( X, Y ) :- descendiente( X, Z ), descendiente(Z, Y).

La última cláusula introduce una facilidad muy importante en un lenguaje de programación: recursión. Para definir la noción de descendencia, se apela a la misma definición de descendencia. Computacionalmente esto sólo es factible cuando, en la definición, se cuenta también con una cláusula como la penúltima que nos permite terminar la deducción. Hablaremos mucho de la recursión a lo largo de este curso.

Para completar el ejercicio, pedimos a los estudiantes que construyan las definiciones adecuadas para responder a las preguntas:

? tío(lot, Y). % Quien es tío de Lot.? tía(Y, sara) % Quien es sobrino o sobrina de Sara.? prim (X, Y) % Quien es primo o prima de quien

Un recurso del sistema PROLOG que puede ser muy útil para responder estas y otras preguntas es el comando findall, que explicamos a continuación:

Una pregunta en PROLOG puede tener más de una respuesta. Si uno quiere encontrar TODAS las respuestas a una pregunta puede hacerla a través del comando findall, cuya sintaxis es:

27

Page 28: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

findall( Variable ´o estructura, PREGUNTA, lista de respuestas ).Por ejemplo, para preguntar quienes son los hijos de Abraham, puede uno decirle a PROLOG:

? findall( X, hijos( X, abraham ), L ).

y observar el “valor” asignado a L.

Si el tiempo no apremia, prueben también la pregunta:

? findall( X, descendiente( X, abraham), L ).

y observen que ocurre.

En lógica, a diferencia de los lenguajes naturales (como el español o el inglés), el diseñador del lenguaje hace un esfuerzo especial por evitar la ambigüedad en las palabras u oraciones: Cada oración debe apuntar a un solo significado. Además, quien "habla" (escribe) el lenguaje lógico, procura evitar la inconsistencia entre sus oraciones y declaraciones: no deben emitirse declaraciones contradictorias.

Los grandes problemas y el lenguaje

Todo el mundo ama a un amanteImplica que?

Todo el mundo ama a alguien.

Bibliografía: Jesús Correas Fernández, e-mail: [email protected]. Departamento de Inteligencia

Artificial de la Facultad de Informática de la Universidad Politécnica de Madrid. Madrid 17 de julio de 2002.

Libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-HILL, 1987 (de allí se tomo más del 60 % de éste trabajo).

Wikepedia Projects, http://www.wikipedia.com

e-mail:[email protected]

FACCI, 2005 - 2006

28

Page 29: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

Apéndice: Predicados Más Comunes De Prolog

29

Page 30: Tutorial Prolog (Turbo)

Tutorial del Prolog, Programación Lógica

30