Programación Prolog Tutorial Revisado 2014

Embed Size (px)

Citation preview

Introduccin

Conocer Prolog es importante para todo aquel que est relacionado con las computadoras, debido a que el lenguaje se ha convertido en el principal entorno de programacin para inteligencia artificial (IA), una de las principales reas de aplicacin de las computadoras que est emergiendo, aunque posiblemente demasiado lejos del objetivo que persigue. La Inteligencia Artificial est relacionada ntimamente con algunas de las ms excitantes reas de la Informtica: Procesadores de ltima generacin, Sistemas Expertos y procesamiento del lenguaje natural.

En sus inicios (Los aos 80) Prolog estaba orientado a minicomputadoras o estaciones de trabajo razn por la cual estaba disponible para pocos programadores que tenan 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 programacin ms usado por los investigadores de Inteligencia Artificial, es que a criterio de stos, Prolog ofrece un mtodo diferente al empleado con los lenguajes ms familiares.

Si usted se siente atrado por la Inteligencia Artificial, debe saber que el lenguaje no convertir a su mquina en un cerebro, ni le ofrecer soluciones inmediatas a aplicaciones poderosas, sin embargo aprender a desarrollar algunos mtodos de software que han sido ya aplicados por los investigadores de Inteligencia Artificial.

Aqu hago un poco de historia:[footnoteRef:1] Prolog significa PROgramming in LOGic y es un lenguaje de programacin de computadoras inventado en 1970 por Alain Colmeraeuer y sus colegas de la Universidad de Marsella (Francia). Rpidamente Prolog se convirti en el principal lenguaje de la IA en Europa mientras que LIPS era el ms utilizado en Estados Unidos. Prolog no haba despertado mucho inters en los programadores de todo el mundo, hasta que los cientficos japoneses lanzaron su famoso proyecto de quinta generacin con el objetivo de disear nuevas computadoras y software, los cuales no tendran rivales a partir de los aos 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 introduccin fue tomada del Libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-HILL, 1987.]

Contenido

Introduccin

Unidad I1.-Trminos Importantes2.-El entorno de Prolog3.-Introducindonos Brevemente Al Cdigo De Prolog4.-Hechos: Objetos y Relaciones

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

Unidad III10.-Reglas Y Vuelta Atrs11.-Objetivos Con Mltiples Argumentos11.-Unificacin12.-Comparacin De Trminos14.-Estructuras De Control15-Aritmtica16.-Listas

Unidad IV17.-EjemplosBibliografaApndice

pUnidad I1.-Trminos Importantes[footnoteRef:2] [2: Trminos tomados del libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-HILL, 1987.]

Programacin Lgica.La programacin lgica es un paradigma de los lenguajes de programacin en el cual los programas se consideran como una serie de aserciones lgicas. De esta forma, el conocimiento se representa mediante reglas, tratndose de sistemas declarativos. Una representacin declarativa es aqulla en la que el conocimiento est especificado, pero en la que la manera en que dicho conocimiento debe ser usado no viene dado. El ms popular de los sistemas de programacin lgica es el PROLOG.

LgicaComo su nombre lo implica PROLOG se basa en manipulaciones lgicas y no es nico en ste aspecto, a ste grupo pertenecen varios lenguaje de programacin, tales lenguajes trabajan con lgica proposicional, tambin conocida como lgica de predicados o clculo 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 automticamente busca los hechos y construye o prueba conclusiones lgicas. As, dado el problema puede parecer trivial, pero si usted tuviera una base de datos tcnicas almacenada con miles de hechos y reglas, no sera prctico darle a un humano esa lista y pedirle una respuesta de manera prctica, pues en el procesamiento del lenguaje natural, la base de datos contendra reglas acerca del reconocimiento y comprensin del lenguaje

[footnoteRef:3] [3: http://www-history.mcs.st-andrews.ac.uk/history/References/Aristotle.html]

, Todos los humanos son mortales y Todos los griegos son humanos, se llega a la conclusin vlida de que Todos los griegos son mortales. Aristteles

2.-El entorno de Prolog

Por unos segundos ver la pantalla con la que Broland Presenta al Turbo Prolog 2.0.

Despus la barra espaciadora ver la siguiente ventana, que es la principal de Turbo Prolog 2.0, en breve describo cada una de ellas:

Ventana Editor.- Es la ventana que se utilizar para escribir nuestros cdigos, note que en la parte superior de la misma se encuentran ciertos datos que entre cosas nos informan de la lnea donde nos encontramos, la columna donde nos encontramos, as como tambin el nombre del archivo que estamos editando (en el ejemplo WORK.PRO), as tambin se indica si el editor est en modo insert.

Ventana Dialog.- Los programas en PROLOG generalmente buscan a travs de una lista de reglas y hechos intentando responder a preguntas, pero tambien pude hacer otras cosas que otros lenguajes de programacin hacen: pueden realizar juegos, dibujar grficos o resolver ecuaciones. Usted se har preguntas y obtendr respuestas en la ventana dialog.

Ventana Message.- Algunas variedades del Prolog no dicen cuando algo est mal. Si usted comete alguna falta de escritura o si tiene algn problema con su programa, el interprete o compilador del Prolog le dar como mucho un crtico 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 sintcticas 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 propsito de la ventana Trace. Puede aadir rdenes al Turbo Prolog forzando al programa a que trabaje paso a paso en vez de seguido. Despus de cada paso la ventana parar y mostrar lo que el programa est haciendo.

3.-Introducindonos Brevemente Al Cdigo De Prolog[footnoteRef:4] [4: A Wikepedia Projects, http://www.wikipedia.com]

Aunque an falta dar muchas indicaciones en cuanto a cdigo, este ejemplo nos muestra algunas cosas

El rbol genealgico, un problema comnmente resuelto en Prolog

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

En todos los mencionados, las instrucciones se ejecutan normalmente en orden secuencial, es decir, una a continuacin de otra, en el mismo orden en que estn escritas, que slo vara cuando se alcanza una instruccin de control (un bucle, una instruccin condicional o una transferencia).

Los programas en Prolog se componen de clusulas 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 clusulas es al contrario de lo habitual. Primero se escribe el consecuente y luego el antecedente. El antecedente puede ser una conjuncin de condiciones que se denomina secuencia de objetivos.

Cada objetivo se separa con una coma y puede considerarse similar a una instruccin o llamada a procedimiento de los lenguajes imperativos. En Prolog no existen instrucciones de control. Su ejecucin se basa en dos conceptos: la unificacin y el backtracking. Gracias a la unificacin, cada objetivo determina un subconjunto de clusulas susceptibles de ser ejecutadas. Cada una de ellas se denomina punto de eleccin. Prolog selecciona el primer punto de eleccin y sigue ejecutando el programa hasta determinar si el objetivo es verdadero o falso. En caso de ser falso 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 eleccin. Entonces se toma el siguiente punto de eleccin que estaba pendiente y se repite de nuevo el proceso. Todos los objetivos terminan su ejecucin 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

Unidad II

4.-Hechos: Objetos y Relaciones

En la forma ms sencilla Prolog trata con objetos y las relaciones entre ellos. Puede incluso or hablar de l como lenguaje orientado a objeto. Un objeto no es necesariamente algo tangible, puede ser cualquier cosa que puede representarse simblicamente en una computadora, he aqu unos ejemplos de objetos:

carlosfelipedianaIsabel

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

reyreinaprncipeprincesamadrepadrehijo

Habr observado que ninguna de estas palabras comienza en maysculas, pues no es ninguna falta, pues maysculas y minsculas tienen significado diferente en Prolog.

He aqu otro conjunto de objetos y relaciones:

vacamurcilagoiguanasecoyahelechoibm_pcapple_macintosh

y las relaciones son:

animalmineralvegetalmamiferoreptilcomputadora

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 programacin es el conjunto de reglas que gobiernan que las palabras estn bien escritas, la posicin en que deben escribirse estas palabras, los lugares donde van las puntuaciones, etc. Aunque comprenda la teora 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 compaas de Software son a veces muy diferentes.

El Turbo Prolog contiene la mayora de las caractersticas y sintaxis del Prolog descritos en el popular libro Programming in Prolog de W.F cloksin, las mismas se irn describiendo conforme avance en ste tutorial.

6.-Hechos (Programas, Predicados)

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 relacin llamada "tiene". La forma de representarlo en PROLOG es:

tiene (coche, ruedas).

Es decir

relacion (objeto)

Obsrvese que el objeto est entre parntesis, y la relacin le precede, cuando se escribe de sta forma la relacin se conoce como predicado

Un programa Prolog est formado por predicados. Cada predicado est definido unvocamente por su nombre y su aridad.

La aridad es el nmero de argumentos (o parmetros) 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 ms clusulas. En nuestro ejemplo, humano est definido por dos clusulas.

Las clusulas 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 lgicas, que pueden tener varios antecedentes pero un nico consecuente. Este tipo de reglas se denominan clusulas 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 ningn antecedente.

7.-Introduccin Del Primer Programa Ejemplo[footnoteRef:5] [5: Tomado del libro Aplique Turbo Prolog escrito por Phillip R. Robinson de la Editorial McGRAW-HILL, 1987.]

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 carcter 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 lnea, ejemplo:

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

2. Divisiones del programaLa mayora de los programas en Turbo Prolog estn organizados en cuatro secciones principales:

Clasulas (clauses) Predicados (predicates) Dominios (domains) Objetivos

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

Clusulas (clauses)Los hechos que construyo con los objetivos y relaciones se listan en la seccin de clauses, esta seccin puede incluir reglas y construcciones que se detallaran brevemente ms adelante.

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

Dominios (domains)Esta seccin se usa para decirle al Prolog que tipo de dato van a manejar los predicados y ahorrar trabajo al Prolog.

Objetivos (goal)Esta seccin le dice al Turbo Prolog lo que ha de encontrar en lo que desea que la computadora haga con la informacin 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 slo una seccin 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 tambin trabaja de sta forma, pero suministra una seccin objetivo (goal) para permitirle ejecutar los programas en forma no interactiva. Usted puede escribir el objetivo en el cdigo original de tal forma que tan pronto como ejecute el programa, ste pueda trabajar en la bsqueda de la solucin deseada.

8.-El Primer Programa Ejemplo

/* Ejemplo Animal, vegetal o computadora */doaminscosa = symbol

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

Note que en ste programa no aparece la seccin goal en la ventana editor, asi tambin 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 relacin con animal y contesto no, pues la razn que no le especificamos en el cdigo una clauses o predicates correspondiente.

9.-Variables.Hay otra forma de hacer preguntas. Si se conoce la relacin pero no los objetos, puede usar variables. Cualquier palabra objeto que comienza con un letra mayscula se considera una variable. Despus de la mayscula puede tener cualquier nmero de letras (mayscula o minscula), junto con dgitos y caracteres de subrayado. La forma ms rpida 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

Unidad III

10.-Reglas Y Vuelta AtrsEl Turbo Prolog ofrece mucho ms que los hechos y variables elementales escrito ya antes en ste tutorial.

Trminos.- son los bloques de construccin de Turbo Prolog 2.0. Un trmino puede ser una constante una variable o una estructura. Lo que hemos venido usando hasta ahora han sido constantes, tales como:

MurcilagoVacaIbm_pcapple_macintosh

Tambin hemos trabajados con variables aunque slo con la popular X una constante representa un objeto o relacin especfica. Una variable (la cual comienza siempre con una letra mayscula) representa un objeto cuyo nombre an no se conoce cuando se est haciendo el programa. Examinaremos ms adelante las estructuras.

Aridad.- La aridad de un predicado es el nmero de argumentos que tiene (hasta ahora slo he explicado ejercicios con predicados de una aridad). Pero la mayora de ejemplos en Prolog no son de esa manera, observe el siguiente ejemplo.

Tiburn (pierna, humano)

para describir la relacin (predicado) entre los dos argumentos pierna y humano. Esto podra traducirse como los tiburones se comen la piernas de los humanos. Pero recuerde que el significado es el que Usted quiera darle, por que tambin lo podra 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 caractersticas bsicas de antigua computadora, puede incluso tener un predicado sin argumentos (? Se ver mas adelante).

Considere que las letras que empiezan con maysculas se toman como variables (es por eso que usamos los _ en algunos casos).

11.-Objetivos Con Mltiples ArgumentosLos programas que trabajan con mltiples argumentos pueden cumplir con objetivos ms complejos. Ejemplo:

observa (guillermo, roberto)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 posicin observa al objeto de la segunda posicin; es decir: Guillermo observa a Roberto y no Roberto observa a Guillermo. (El cdigo que escribi an 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 smbolo para ellos. La palabra symbol significa siempre una cierta cosa.

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

Tambin puede variables en ambos argumentos y vea como responde Prolog en la ventana Dialog

Uso de variables annimas, se usa slo un carcter 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.

Analice los ltimos ejemplos que se presentan en sta ventana

Objetivos CompuestosLos objetivos pueden ser an ms complejos que los vistos en la seccin 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 clusulas 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.

Desde luego puede aplicar lo aprendido anteriormente y ejecutar variables annimas, u otra cosa.

De la misma manera tambin puede usar el operador Or que se debe escribir or o tambin ; el operador Not lo estudiamos ms adelante.

ReglasCmo en su espacio lo escrib, la seccin clauses tambin puede incluir reglas, una rega tpica dice que algo es verdad si algo es verdad, las reglas hacen que Prolog pase de se un diccionario a ser una mquina pensante. Aadamos la sguiente regla al ejemplo:

feliz (gregorio) if observa (brenda, gregorio)

Y

nervioso (Quien) if observa (guillermo, Quien)

Al final de los hechos asegrese de poner .

La siguiente es una muestra de cmo debe estar su cdigo 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).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 clusulas, buscando uno que coincida con feliz. Luego compraba si dicho predicado tiene la misma aridad, si es as contna el proceso y cuando encuentra la palabra if concluye que esto no es hecho si no una regla.

Vuelta atrs (Backtracking)En ste punto el Turbo Prolog vuelve a la primera clusula y comienza a bsqueda hacia atrs en la lista esto se llama vuelta atrs y es una importante caracterstica del Prolog. Siempre que necesita ser satisfecho un subobjetivo, el Prolog vuelve hacia atrs de la Base de Datos, buscando siempre de arriba hacia abajo y de izquierda a derecha. Hasta encontrar una coincidencia. La vuelta hacia atrs puede fcilmente crecer en complejidad conforme las reglas y los dems objetivos sean ms 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

Instanciacin y vinculacinSi prueba el objetivo feliz (Quien) obtendr una respuesta Gregorio despus del mismo tipo de bsqueda. 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, slo debera escribir esta palabra al inicio del programa.

tracedomainspersona = symbol

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

observa (guillermo, roberto).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)).

11.-UnificacinLa unificacin, como ya se ha comentado, es el algoritmo que se encarga de resolver las igualdades lgicas. Aunque la unificacin en Prolog sustituye a la asignacin de los lenguajes procedurales, no hay que confundirla con esta, son operaciones totalmente distintas. La operacin de unificacin 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.-Comparacin De TrminosPara comparar trminos existen varios operadores. De estos operadores, los ms importantes son el igual (==) y el distinto (\==). Para stos hay que tener en cuenta que dos trminos son iguales solamente si son exactamente el mismo trmino (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.

Resolucin De Varios Ejercicios Programas

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

Despus 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 slo si todas son ciertas, la respuesta ser s (pregunta 2). Si no encuentra ningn 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 unificacin. Esto significa que si en la pregunta hay alguna variable, sta unificar con los trminos 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 ms 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 clusulas Operador ;

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

Normalmente se utiliza la disyuncin mediante clusulas puesto que resulta ms claro.

La negacin 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 precaucin de aplicar la negacin nicamente en llamadas a predicados donde todas las variables existentes estn 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 quin es hurfano con huerfano(X) dir que no, es decir, que no hay ningn hurfano, lo cual no es correcto.

15-AritmticaComo hemos visto, en la unificacin no se evalan expresiones. Para ello existe un operador especial is que antes de realizar la unificacin evala la parte derecha como si se tratase de una expresin aritmtica.

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

Para que esta evaluacin 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 apndice 1 hay una tabla con las operaciones y funciones ms 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

Comparacin AritmticaExisten varios operadores para comparar expresiones aritmticas. Estos operadores evalan sus dos operandos antes de realizar la comparacin. En el apndice 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 nmero indeterminado de trminos. En Prolog se escriben de la siguiente forma:

[1, 2, 3]

Los trminos 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 vaca.

La nica operacin 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 unificacin.

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).

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 */

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 Genealgico de una familia y pretende mostrarles como PROLOG puede servir como un manejador de bases de datos. El ejercicio del rbol genealgico. Consideren el siguiente cdigo 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 definicin de la relacin 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 informacin 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 informacin de un archivo con el texto anterior. Por ejemplo, despus de cargar el archivo, puede uno preguntar al sistema si Rebeca es hija de

? hij (rebeca, batuel).

Ms interesante todava 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 algn X tal que la relacin hij se cumple entre ese X y abraham. Las variables en PROLOG se indican con cadenas de caracteres cuya primer letra es una mayscula. Esta es la razn por la cual todos los nombres estn en minscula y no comienzan con Mayscula como indica el buen espaol. Las respuestas de PROLOG ante esos dos tipos de preguntas son similares. En ambas aparece el yes de confirmacin. Sin embargo, en el segundo caso, la respuesta va acompaada de una indicacin 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 bsicas anteriores, para definir nuevas relaciones por medio de reglas que en lo sucesivo llamaremos clusulas:

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

Esta es la forma PROLOG de escribir la clusula: 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 clusula introduce una facilidad muy importante en un lenguaje de programacin: recursin. Para definir la nocin de descendencia, se apela a la misma definicin de descendencia. Computacionalmente esto slo es factible cuando, en la definicin, se cuenta tambin con una clusula como la penltima que nos permite terminar la deduccin. Hablaremos mucho de la recursin a lo largo de este curso.

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

? to(lot, Y). % Quien es to de Lot.? ta(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 continuacin:

Una pregunta en PROLOG puede tener ms de una respuesta. Si uno quiere encontrar TODAS las respuestas a una pregunta puede hacerla a travs del comando findall, cuya sintaxis es:

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 tambin la pregunta:

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

y observen que ocurre.

En lgica, a diferencia de los lenguajes naturales (como el espaol o el ingls), el diseador del lenguaje hace un esfuerzo especial por evitar la ambigedad en las palabras u oraciones: Cada oracin debe apuntar a un solo significado. Adems, quien "habla" (escribe) el lenguaje lgico, 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.

Bibliografa: Jess Correas Fernndez, e-mail: [email protected]. Departamento de Inteligencia Artificial de la Facultad de Informtica de la Universidad Politcnica 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 ms del 60 % de ste trabajo). Wikepedia Projects, http://www.wikipedia.com

e-mail:[email protected], 2005 - 2006

Apndice: Predicados Ms Comunes De Prolog

- 1 -