Está en la página 1de 12

INFORME SOBRE LENGUAJE FUNCIONAL PROLOG Historia

Prolog es un lenguaje de programacin simple pero poderoso desarrollado en la Universidad de Aix-Marseille (Marsella, Francia) por los profesores Alain Colmerauer y Philippe Roussel, como una herramienta prctica para programacin lgica. Naci de un proyecto que no tena como objetivo la implementacin de un lenguaje de programacin, sino el procesamiento de lenguajes naturales. Alain Colmerauer y Robert Pasero trabajaban en la parte del procesado del lenguaje natural y Jean Trudel y Philippe Roussel en la parte de deduccin e inferencia del sistema. Interesado por el mtodo de resolucin SL, Trudel persuadi a Robert Kowalski para que se uniera al proyecto, dando lugar a una versin preliminar del lenguaje Prolog a finales de 1971 y apareciendo la versin definitiva en 1972. Esta primera versin de Prolog fue programada en ALGOL W.Inicialmente se trataba de un lenguaje totalmente interpretado hasta que, en 1983, David H.D. Warren desarroll un compilador capaz de traducir Prolog en un conjunto de instrucciones de una mquina abstracta denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces Prolog es un lenguaje semi-interpretado. Si bien en un principio se trataba de un lenguaje de uso reducido, la aparicin de intrpretes del mismo para microordenadores de 8 bits (ej: micro-PROLOG) y para ordenadores domsticos de 16 bits (ej:Turbo PROLOG de Borland, entre otros muchos) a lo largo de la dcada de 1980 contribuy notablemente a su popularizacin. Otro importante factor en su difusin fue la adopcin del mismo para el desarrollo del proyecto de la quinta generacin de computadoras a principios de la dcada de los 1980, en cuyo contexto se desarroll la implementacin paralelizada del lenguaje llamada KL1 y del que deriva parte del desarrollo moderno de Prolog. Las primeras versiones del lenguaje diferan, en sus diferentes implementaciones, en muchos aspectos de sus sintaxis, emplendose mayormente como forma normalizada el dialecto propuesto por la Universidad de Edimburgo , hasta que en 1995 se estableci un estndar ISO (ISO/IEC 13211-1), llamado ISO-Prolog.

1.1. INTRODUCCIN
PROLOG es un lenguaje de programacin declarativo. Los lenguajes declarativos se diferencian de los lenguajes imperativos o procedurales en que estn basados en formalismos abstractos (PROLOG est basado en la lgica de predicados de primer orden y LISP, otro lenguaje de programacin declarativa, en lambda calculo), y por tanto su semntica no depende de la mquina en la que se ejecutan. Las sentencias en estos lenguajes se entienden sin necesidad de hacer referencia al nivel mquina para explicar los efectos colaterales. Por tanto, un programa escrito en un lenguaje declarativo puede usarse como una especificacin o una descripcin formal de un problema. Otra ventaja de los programas escritos en lenguajes declarativos es

que se pueden desarrollar y comprobar poco a poco, y pueden ser sintetizados o transformados sistemticamente. PROLOG es un lenguaje de programacin muy til para resolver problemas que implican objetos y relaciones entre objetos. Est basado en los siguientes mecanismos bsicos, que se irn explicando a lo largo de este captulo: Unificacin Estructuras de datos basadas en rboles Backtracking automtico

La sintaxis del lenguaje consiste en lo siguiente: Declarar hechos sobre objetos y sus relaciones Hacer preguntas sobre objetos y sus relaciones Definir reglas sobre objetos y sus relaciones Cada una de estas partes se explica en los siguientes apartados. Fundamentos de PROLOG

1.2 OBJETIVO GENERAL Introducir los conceptos fundamentales de la programacin lgica y aprender a programar en Prolog.

1.3 LOS HECHOS PROLOG Para explicar los fundamentos de PROLOG vamos a utilizar el tpico ejemplo de las relaciones familiares. Para decir que Laura es uno de los dos progenitores de Damin, podramos declarar el siguiente hecho PROLOG: Progenitor(laura, damian). progenitor es el nombre de la relacin 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 relacin, es la madre de Damin, segundo argumento de la relacin. 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 escribirn con minscula. Otros ejemplos de hechos pueden ser los siguientes: le_gusta_a(juan,maria).

valioso(oro). tiene(juan,libro). da(juan,libro,maria). Los nombres tambin son arbitrarios y el programador decidir la interpretacin que haga de ellos. La relacin le_gusta_a(juan,maria) es equivalente a la relacin a(b,c), aunque para que la interpretacin sea ms sencilla, se recomienda que los nombres se elijan de forma que ayuden a su interpretacin. Los hechos no tienen que reflejar el mundo real necesariamente, pero ser nica y exclusivamente lo que PROLOG tomar como verdadero. Un conjunto de hechos (tambin llamados clusulas), junto con un conjunto de reglas, forman lo que se llama una base de datos PROLOG. 1.4 LAS PREGUNTAS PROLOG Sobre un conjunto de hechos se pueden realizar una serie de preguntas. Por ejemplo: ?- le_gusta_a(juan,maria). PROLOG busca automticamente en la base de datos si existe un hecho que se puede unificar (es decir, tiene el mismo nombre de predicado, el mismo nmero de argumentos -o aridad - 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 contestacin 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. Para realizar preguntas ms interesantes, como por ejemplo, qu le gusta a Mara o cules son los padres de Damin, se usarn las variables. En PROLOG las variables empiezan por mayscula. Por ejemplo: ?-le_gusta_a(maria,X). ?-progenitor(Y,damian). Para obtener la o las respuestas, PROLOG recorre la base de datos hasta encontrar el primer hecho que coincide con el nombre de la relacin y su aridad y con los argumentos que no son variables. Marca esa posicin para poder recordar dnde se qued en el recorrido por la base de datos. La o las variables se instancian al valor que le corresponde segn el lugar que ocupan en la relacin, y ese valor es la respuesta que proporciona PROLOG. Si pulsamos RETURN no obtendremos ms que la primera respuesta. Si se quieren obtener todas las respuestas (para el caso de que exista ms de una)

se teclea ;. Cuando pulsamos ;, PROLOG sigue automticamente la bsqueda desde la marca de posicin en la que se haba quedado en la base de datos. Se dice entonces que PROLOG intenta resatisfacer la pregunta. Se desinstancian las variables que se haban instanciado, y sigue buscando otro hecho que coincida sintcticamente con la pregunta. A este mecanismo se le llama backtracking, y PROLOG lo hace automticamente. Para resolver preguntas ms complejas, como por ejemplo, se gustan Juan y Mara? o tienen Ana y Damin un progenitor comn, es decir, son hermanos? O quin es el nieto(s) de Toms?, se utilizan conjunciones de objetivos, es decir, preguntas separadas por comas, que en PROLOG corresponden a la Y lgica. ?-le_gusta_a(juan,maria), le_gusta_a(maria,juan). ?-progenitor(X,ana), progenitor(X,damian). ?-progenitor(tomas,X), progenitor(X,Y). En una conjuncin de objetivos correspondientes a la misma pregunta, la misma variable se refiere al mismo objeto (en el segundo ejemplo, X se refiere a la misma persona). En preguntas u objetivos distintos, el mismo nombre de variable se refiere a distintos objetos (la X del segundo y el tercer ejemplo se refieren a personas distintas). Para buscar las soluciones a una conjuncin de objetivos, PROLOG establece una marca de posicin para cada objetivo, y recorre toda la base de datos en la bsqueda de cada objetivo. 1.5 OPERADORES EN PROLOG Como hemos especificado antes, para construir programas en Prolog necesitamos una serie de elementos. Vamos a especificarlos: tomos: Es una definicin genrica de un objeto del mundo que queremos representar. Predicados: Nos permite especificar caractersticas de los objetos de nuestro mundo o las relaciones entre ellos. Hechos Es algo que est ocurriendo en el mundo, caracterstica o relacin entre objetos. En el lenguaje natural un hecho podra ser por ejemplo que Lgica y Compatibilidad es una asignatura de Ingeniera Informtica. Expresan relaciones entre objetos. Suponiendo que se quiera 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). Los nombres de objetos y relaciones deben comenzar con una letra minscula. Primero se escribe la relacin, y luego los objetos separados por comas y encerrados entre parntesis. Al final de un hecho debe ir un punto ("."). El orden de los objetos dentro de la relacin es arbitrario, pero debemos ser coherentes a lo largo de la base de hechos. Variables No es variable con el concepto que se tiene de ella en la programacin habitual. En Prolog, una variable representa el valor de un tomo. Representan objetos que el mismo PROLOG determina. Una variable puede estar instanciada no instanciada. Estar instanciada cuando existe un objeto determinado representado por la variable. Los nombres de variables comienzan siempre por una letra mayscula. Un caso particular es la variable annima, representada por el carcter subrayado ("_"). Es una especie de comodn que utilizaremos en aquellos lugares que debera aparecer una variable, pero no nos interesa darle un nombre concreto ya que no vamos a utilizarla posteriormente. Reglas Las reglas se utilizan en PROLOG para significar que un hecho depende de uno ms hechos. Son la representacin de las implicaciones lgicas del tipo p ---> q (p implica q). Una regla consiste en una cabeza y un cuerpo, unidos por el signo ":-". La cabeza est formada por un nico hecho. El cuerpo puede ser uno ms hechos (conjuncin de hechos), separados por una coma (","), que acta como el "y" lgico. Las reglas finalizan con un punto ("."). La cabeza en una regla PROLOG corresponde al consecuente de una implicacin lgica, y el cuerpo al antecedente. Este hecho puede conducir a errores de representacin. Supongamos el siguiente razonamiento lgico: tiempo(lluvioso) ----> suelo(mojado) suelo(mojado) Que el suelo est, mojado, es una condicin suficiente de que el tiempo sea lluvioso, pero no necesaria. Por lo tanto, a partir de ese hecho, no podemos deducir mediante la implicacin, que est, lloviendo (pueden haber regado las calles). La representacin correcta en PROLOG, sera:

suelo(mojado):- tiempo(lluvioso). suelo(mojado). Advirtase que la regla est "al revs". Esto es as por el mecanismo de deduccin hacia atrs que emplea PROLOG. Si cometiramos el error de representarla como: tiempo(lluvioso):- suelo(mojado). suelo(mojado). PROLOG, partiendo del hecho de que el suelo est mojado, deducira incorrectamente que el tiempo es lluvioso. Para generalizar una relacin entre objetos mediante una regla, utilizaremos variables. Por ejemplo: Representacin tiene(X,ruedas) lgica Representacin PROLOG es_un_coche(X) ---->

tiene(X,ruedas):- es_un_coche(X). Con esta regla generalizamos el hecho de que cualquier objeto que sea un coche, tendr ruedas. Al igual que antes, el hecho de que un objeto tenga ruedas, no es una condicin suficiente de que sea un coche. Por lo tanto la representacin inversa sera incorrecta. Por lo visto hasta ahora, las clusulas PROLOG son de tres tipos: hechos, reglas y preguntas. Las clusulas PROLOG consisten en una cabeza y un cuerpo. Los hechos son clusulas que tienen cabeza pero no tienen cuerpo. Las preguntas slo tienen cuerpo. Las reglas tienen siempre cabeza y cuerpo. Los hechos son siempre ciertos. Las reglas declaran cosas que son ciertas dependiendo de una condicin. El programa PROLOG (o base de datos PROLOG) est formado por hechos y reglas y para PROLOG no hay ninguna distincin entre ambas. Las preguntas se le hacen al programa para determinar qu cosas son ciertas.

1.6. OPERADORES EN PROLOG Son predicados predefinidos en PROLOG para las operaciones matemticas bsicas. Su sintaxis depende de la posicin que ocupen, pudiendo ser infijos o prefijos. Por ejemplo el operador suma ("+"), podemos encontrarlo en forma prefija '+ (2,5)' o bien infija, '2 + 5'. Tambin dispone de predicados de igualdad y desigualdad. X = Y igual X \= Y distinto X < Y menor X > Y mayor X =< Y menor o igual X >= Y mayor o igual

Al igual que en otros lenguajes de programacin es necesario tener en cuenta la precedencia y la asociatividad de los operadores antes de trabajar con ellos. En cuanto a precedencia, es la tpica. Por ejemplo, 3+2*6 se evala como 3+ (2*6). En lo referente a la asociatividad, PROLOG es asociativo por la izquierda. As, 8/4/4 se interpreta como (8/4)/4. De igual forma, 5+8/2/2 significa 5+((8/2)/2). El operador 'is'. Es un operador infijo, que en su parte derecha lleva un trmino que se interpreta como una expresin aritmtica, contrastndose con el trmino de su izquierda. Por ejemplo, la expresin '6 is 4+3.' es falsa. Por otra parte, si la expresin es 'X is 4+3.', el resultado ser la instanciacin de X: X=7 Una regla PROLOG puede ser esta: Densidad(X, Y):- poblacin(X, P), rea(X, A), Y is P/A.

1.7. LA SINTAXIS PROLOG Los objetos o trminos PROLOG pueden ser objetos simples o estructuras. Los objetos simples pueden ser constantes o variables. Las constantes sern tomos o nmeros. Los tomos empiezan con letra minscula (nunca con nmeros), pueden contener caracteres especiales y pueden ser nombres entre comillas simples. Los nmeros sern enteros o reales, sin una definicin explcita de tipos.

PROLOG se utiliza para una programacin simblica, no numrica, por eso los enteros se utilizarn por ejemplo para contar el nmero de elementos de una lista, pero los reales son poco utilizados. Las variables empiezan con mayscula o con subrayado. Las variables annimas son aquellas cuyo nombre es slo el carcter subrayado (_). Se usan cuando no es importante el nombre de la variable o cuando la variable no puede unificar con otra, dentro de la misma clusula.

Por ejemplo: tiene_un_hijo(X):-progenitor(X,Y). Y no unifica con otra variable en la definicin de la relacin tiene_un_hijo, por lo que es aconsejable sustituirla por una variable annima (en algunos entornos de programacin PROLOG se advierte sobre la conveniencia de ello). tiene_un_hijo(X):-progenitor(X,_). Es importante sealar que el alcance de una variable es la clusula donde aparece, y el alcance de una constante es todo el programa PROLOG. 1.8. SIGNIFICADO DECLARATIVO Y PROCEDURAL DE LOS PROGRAMAS En un lenguaje declarativo puro, sera de esperar que el orden en el que aparecen los hechos y las reglas en la base fuera independiente de los datos, sin embargo en PROLOG no es as. El significado declarativo tiene que ver slo con las relaciones definidas por el programa. De esta manera, el significado declarativo determina cul ser la salida del programa. Por otro lado, el significado procedural determina cmo se ha obtenido esta salida; es decir, como evala las relaciones PROLOG. Si tenemos un conjunto de hechos y reglas con el mismo nombre de relacin y la misma aridad, puede ser conveniente que los hechos estn situados en la base de datos antes que las reglas, (sobre todo, si los hechos son excepciones de las reglas). Adems tambin suele ser aconsejable poner la regla para salirse de la recursividad antes que la regla recursiva. La habilidad de PROLOG para calcular de forma procedural es una de las ventajas especficas que tiene el lenguaje. Como consecuencia esto anima al programador a considerar el significado declarativo de los programas de forma relativamente independiente de su significado procedural. Es decir, las ventajas de la forma declarativa de este lenguaje son claras (es ms fcil pensar las soluciones y muchos detalles procedurales son resueltos automticamente por el propio lenguaje) y podemos aprovecharlas. Los aspectos declarativos de los programas son, habitualmente, ms fciles de entender que los procedurales. Esta es la principal razn por la que el programador debe concentrarse en el significado declarativo y evitar distraerse por los detalles de cmo se ejecutan los programas. El acercamiento a la programacin declarativa no es suficiente. Una vez se tenga el concepto claro, y cuando se trabaje con programas grandes, los aspectos procedurales no se pueden ignorar por completo por razones de eficiencia. No obstante, el estilo declarativo a la hora de pensar en PROLOG

debe ser estimulado y los aspectos procedurales ignorados para favorecer el uso de las restricciones. 1.9 ENTORNO DE DESARROLLO Prolog es un lenguaje de programacin seminterpretado. Su funcionamiento es muy similar a Java. El cdigo fuente se compila a un cdigo de byte el cul se interpreta en una mquina virtual denominada Warren Abstract Machine (comnmente denominada WAM). Por eso, un entorno de desarrollo Prolog se compone de:

Un compilador: Transforma el cdigo fuente en cdigo de byte. A diferencia de Java, no existe un Standard al respecto. Por eso, el cdigo de byte generado por un entorno de desarrollo no tiene por qu funcionar en el intrprete de otro entorno. Un intrprete: Ejecuta el cdigo de byte. Un shell o top-level. Se trata de una utilidad que permite probar los programas, depurarlos, etc. Su funcionamiento es similar a los interfaces de lnea de comando de los sistemas operativos. Una biblioteca de utilidades: Estas bibliotecas son, en general, muy amplias. Muchos entornos incluyen (afortunadamente) unas bibliotecas standard-ISO que permiten funcionalidades bsicas como manipular cadenas, entrada/salida, etc.

Generalmente, los entornos de desarrollo ofrecen extensiones al lenguaje como pueden ser la programacin con restricciones, concurrente, orientada a objetos, etc. Sera injusto no mencionar aqu el entorno de desarrollo ms popular: SICStus Prolog, si bien, se trata de un entorno de desarrollo comercial (no gratuito). SICStus, CIAO Prolog, y posiblemente otros ms, ofrecen entornos integrados generalmente basados en Emacs que resultan muy fciles de usar. CIAO Prolog adems ofrece un auto documentador similar al existente para Java adems de un preprocesador de programas. Prcticamente todos ellos son multiplataforma.

1.9. EL ENTORNO DE PROGRAMACIN ECLIPSE ECLiPSe es un entorno de programacin que contiene el lenguaje de programacin PROLOG y algunas extensiones que permitirn manejar bases de datos (incluyendo bases de datos declarativas y bases de conocimiento), programacin lgica basada en restricciones (en concreto programacin lgica basada en restricciones sobre dominios finitos), y programacin concurrente. ECLiPSe dispone de un editor interno al que se a ccede tecleando [user]. Desde la entrada de ECLiPSe, del cual se sale pulsando D. Sin embargo se recomienda que se abran dos sesiones, en una de ellas se utiliar un editor (el

favorito de cada alumno) y en la otra sesin se tendr abierto ECLiPSe. De esta manera el ciclo cambiar cdigo/compilar/ejecutar con debugger se hace cambiando slo de ventana, sin tener que salirse cada vez del entorno de ECLiPSe. Un vez generado un fichero con el editor (por ejemplo lo llamaremos prueba) y grabado, se carga y compila en ECLiPSe mediante el objetivo [prueba]. (terminado en punto). Para utilizar el debbuger podemos teclear trace. o spy(nombre del predicado y aridad).. trace hace un debbuger minucioso. Tecleando c (de creep) o retorno de carro, pasaremos por todos los subobjetivos que definen nuestro programa PROLOG; con s (de skip) podemos saltar todo lo referente a la clusula en donde lo tecleemos. spy(nombre del predicado y aridad). slo har el debbuger del predicado en el que hayamos puesto el spy. Cada vez que hacemos alguna cosa en el entorno ECLiPSe (compilar, ejecutar, hacer una traza, etc.), el prompt del eclipse va cambiando, incrementando de 1 en 1 el nmero del final de la entrada. Ese nmero puede utilizarse posteriormente como forma de escritura rpida del comando que contena esa entrada. Por ejemplo: <eclipse1>[prueba]. <eclipse2>inversa([a,b,c],L). <eclipse3>inversa([a,b,c],[c,b,a]). Supongamos que en este punto queremos cambiar el cdigo de prueba. Despus de grabar el fichero, compilaramos y ejecutaramos con las siguientes llamadas: <eclipse4>1. <eclipse5>2. <eclipse6>3.

PROGRAMANDO EN PROLOG A la hora de programar en Prolog se tiene dos cuerpos principales: la especificacin de los hechos y las preguntas sobre esos objetos o relaciones. Cuando se crea una base de datos con esa especificacin de hechos se puede poner a hacer preguntas sobre esa especificacin dando como resultado s o no. Prolog saca la respuesta explorando cada uno de los hechos introducidos en la base de datos hasta encontrar uno que coincida, que ser el caso en la que la respuesta ser afirmativa, o hasta que termine toda la base de datos, cuyo

caso dar una respuesta negativa. Las preguntas que hacemos sobre la base de hechos pueden ser ms complejas usando operadores lgicos como AND, OR y NOT. En este caso, Prolog busca que la satisfaccin a la primera parte de la pregunta y si lo es, lo busca en la segunda.

2. VENTAJAS Y DESVENTAJAS DE LA PROGRAMACIN LGICA

Ventajas
1. La habilidad de PROLOG para calcular de forma procedural es una de las ventajas especficas que tiene el lenguaje. Como consecuencia esto anima al programador a considerar el significado declarativo de los programas de forma relativamente independiente de su significado procedural. Es decir, las ventajas de la forma declarativa de este lenguaje son claras (es ms fcil pensar las soluciones y muchos detalles procedurales son resueltos automticamente por el propio lenguaje) y podemos aprovecharlas. 2. Una ventaja desde el punto de vista del usuario es la facilidad para programar ya que se pueden escribir programas rpidamente, con pocos errores originando programas claramente legibles, aun si no se conoce muy bien el lenguaje. 3. No hay que pensar demasiado en la solucin del problema, ya que Prolog infiere sus respuestas basndose 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 asignacin. Cada relacin est auto contenida, lo que permite una mayor modularidad, portabilidad y reusabilidad de relaciones entre programas. 5. Polimorfismo: se trata de un lenguaje de programacin sin tipos, lo que un alto nivel de abstraccin e independencia de los datos (objetos). 4. En Prolog, se puede representar incluso los mismos programas Prolog como estructuras. 5. Prolog utiliza un mecanismo de bsqueda 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 dinmico y automtico de memoria. 6. En prolog se utiliza notacin prefija e infija mientras que en Lisp solo utiliza notacin prefija.

Desventajas
1. La resolucin automtica no siempre es eficiente, por lo que eventualmente se podra dar una respuesta incorrecta a una consulta. 2. Poco eficientes. 3. Poco utilizado en aplicaciones reales. 2. Prolog algunas veces es incapaz de reconocer que un problema es (para su propio conocimiento) inaplicable o insuficiente. Si el programa

no contiene suficiente informacin para contestar una consulta, es incapaz de reconocerlo y responde no. En esta situacin sera ms eficiente conocer que la respuesta no es negativa, sino que no es posible inferir un resultado. 3. Los motores de inferencia poseen algunos lmites.

También podría gustarte