Está en la página 1de 15

Introduccin a la programacin lgica en Prolog

La principal idea en la que se basa la programacin lgica es bastante sencilla. Se trata de describir posibles infinitas relaciones entre objetos y luego obtener de forma automtica conclusiones acerca de dichas relaciones. Para esquematizar dicha idea es interesante notar que cuando se describen situaciones en el mundo real (relaciones entre objetos) habitualmente se recurre a sentencias de tipo declarativas como: (a) Todos los amos quieren a sus mascotas (b) Roberto es amo y Harry es su gato Aplicando algunas reglas generales de razonamiento, tales descripciones pueden usarse para obtener nuevas conclusiones. Siguiendo el ejemplo, conociendo (a) y (b) puede concluirse que: (c) Roberto quiere a Harry Ahora bien, para que una computadora pueda tratar sentencias como (a), (b) y (c), la sintaxis debe ser definida precisamente y las reglas de razonamiento formalizadas. Este problema ha sido estudiado por la lgica matemtica y por ende esta constituye el basamento terico de la programacin lgica. Como primer paso para introducir al lector en los fundamentos de la programacin lgica, en los captulos uno y dos, se presentarn los elementos esenciales del lenguaje Prolog. Al finalizar los mismos, se tendr un panorama claro de lo que significa programar con un leguaje perteneciente al paradigma lgico. Esto permitir en una segunda etapa adquirir los conocimientos tericos de la programacin lgica, contando con una referencia slida sobre su aplicacin prctica; situacin que allanar el camino hacia su interpretacin. Prologes un lenguaje de programacin utilizado habitualmente para resolver problemas que pueden ser expresados en trminos de objetos y sus relaciones. La estructura bsica de datos es la proposicin, es decir una frase donde se hace una afirmacin sobre algo, como ser: Roberto es amo Harry es gato Scrates es humano 8 + 7 = 15 El primero que formaliz la relacin entre el lenguaje y los hechos fue Aristteles, mediante un esquema de anlisis que denomin apofansis o logos apofanticos. Segn este esquema, una proposicin puede expresarse en la forma: S es P Ejemplo: Scrates es humano Donde S es el sujeto y P el predicado. Estas proposiciones se suelen expresar en notacin polaca (debida a Lukasevick): P(S) Ejemplo: humano(scrates).

1 ________________________ Ing. Jos Fernndez Zamora

En la cual el predicado humano se aplica sobre el sujeto Scrates. En los ejemplos anteriores el predicado se aplica a un solo sujeto, pero si se desea expresar en Prolog Roberto quiere a Harry, es necesario recurrir a predicados que se aplican a ms de un sujeto: quiere_a(roberto,harry). Aqu se podra observar que Harry no es estrictamente un sujeto, sino que lingsticamente es un objeto directo, sin embargo por cuestiones de uniformidad y para hacer ms generales las relaciones, Harry ser considerado sujeto. En estos casos el predicado es interpretado como una relacin entre sujetos, por ejemplo quiere_a es una relacin que vincula al sujeto Roberto con el sujeto Harry, se dice que esta es una relacin binaria porque relaciona a dos sujetos. Generalizando una relacin que vincula a N sujetos con un predicado ser una relacin N-aria. Incluso las proposiciones con predicados aplicados a un solo sujeto sern consideradas como relaciones. Hay an un problema filosfico ms que tratar antes de comenzar a programar. Es comn que para describir relaciones entre objetos se utilicen reglas. Por ejemplo, la regla Una persona quiere a un animal determinado, si dicha persona es un amo y el animal en cuestin es su mascota, dice algo sobre lo que significa ser amo y tener una mascota. Tambin brinda informacin sobre como saber si una determinada persona quiere a un animal. Lo importante a tener en cuenta sobre las reglas es que a menudo estas son simplificadas, pero siguen siendo aceptables como definiciones. Es claro que el ejemplo no cubre todos los casos en los que una persona quiere a un animal, pero tampoco es posible ni deseable definir una regla tan general. Lo ideal es concentrarse en aqullas reglas especficas del problema que se desea resolver. Se puede concluir que programar en Prolog consiste en: declarar algunos hechos acerca de objetos y sus relaciones, definir algunas reglas acerca de objetos y sus relaciones, y hacer consultas sobre objetos y sus relaciones. Por ejemplo, supngase que se le comunica al intrprete Prolog la regla que define cuando una persona quiere a un animal. Se puede realizar una consulta para saber si Roberto quiere a Harry. Prolog debe buscar lo indicado por los hechos y reglas suministradas, y dar una respuesta del tipo s o no. Se puede, por lo tanto, considerar a Prolog como una base de datos que contiene hechos y reglas, y que adems provee una forma de realizar inferencias de un hecho a otro. A continuacin se introducirn cada uno de los fundamentos de Prolog, explicando en el presente captulo los elementos bsicos del lenguaje para definir relaciones y realizar consultas a la base; y en el captulo siguiente, formas de realizar inferencias acerca de las relaciones mediante la introduccin del concepto de reglas. Hechos El primer elemento a estudiar ser la descripcin de hechos. Los mismos sirven para comunicarle al intrprete distintas situaciones sobre objetos. Un hecho es una afirmacin sobre algo, por lo tanto Juan ama a Isabel es un hecho compuesto por dos objetos Juan e Isabel, y una relacin ama_a. Para que Prolog pueda trabajar con est e tipo de

2 ________________________ Ing. Jos Fernndez Zamora

hechos, es necesario como se mencion anteriormente, escribirlos de forma standard. As el ejemplo anterior debe comunicarse al intrprete como sigue: ama_a(juan,isabel). Para comprender cabalmente como deben describirse los hechos en Prolog, adems de respetar la notacin de Lukasevick como se puede observar en el ejemplo, hay que tener en cuenta lo siguiente: Los nombres de todas las relaciones y objetos deben comenzar con letra minscula. Los objetos deben separarse mediante comas. Todos los hechos deben culminar con el carcter correspondiente al signo de puntuacin .. Es importante tener en cuenta el orden en el cual son escritos los objetos de una relacin en la descripcin de un hecho, puesto que aunque el orden es arbitrario, debe guardarse una consistencia. En el ejemplo anterior ama_a(juan,isabel) no es equivalente a ama_a(isabel,juan).El primer hecho, dice que Juan ama a Isabel, mientras que el segundo afirma que Isabel ama a Juan. Para que el segundo hecho fuese reconocido por el intrprete, ser necesario comunicrselo explcitamente como el primero. A continuacin se dan algunos ejemplos de relaciones con sus posibles interpretaciones en lenguaje natural: valioso(oro). mujer(isabel). presta(jose, dinero, pedro). rey(juan). progenitor(zeus, hercules). El oro es valioso. Isabel es mujer. Jos le presta dinero a Pedro. Juan es Rey. Zeus es el progenitor de Hercules.

Cada vez que se utiliza un nombre, este se refiere a un objeto individual y particular. En algunos casos es fcil saber a que individuo seala un nombre, ejemplos de esto son juan e isabel, pero en otros como por ejemplo oro, o valioso, esto no es tan sencillo. Por ejemplo, el nombre oro puede referirse a un particular trozo de este metal, al cual se lo designo con el nombre oro, o tal vez pueda referirse al elemento qumico de valor atmico 79. Por lo tanto valioso(oro) puede tener dos interpretaciones. Se puede pensar que: (a) un trozo de oro particular, el cual se design con el nombre oro, es valioso; o (b) que el elemento qumico oro es valioso. Es el programador, en los casos en que un nombre se preste a varias interpretaciones, quien debe decidir cual es la interpretacin que se debe dar, y la misma debe ser consistente a lo largo del programa para evitar sorpresas desagradables. Es importante aclarar en este momento algo de terminologa. Los nombres de los objetos encerrados en los parntesis, son llamados argumentos, mientras que el nombre de la relacin que aparece antes de los parntesis es llamado predicado. As, valioso es un predicado con un argumento o relacin unaria y progenitor un predicado con dos argumentos o relacin binaria. Los nombres de los objetos y relaciones son completamente arbitrarios, la nica restriccin a tener en cuenta, es que debe mantenerse la consistencia en cuanto a las interpretaciones. De todas formas, aunque bien podra representarse el hecho

3 ________________________ Ing. Jos Fernndez Zamora

progenitor(zeus,hercules) como a(b,c), y recordar que progenitor es a, zeus b y hercules c; es clara la conveniencia de seleccionar nombres que recuerden lo que representan. Como ltima reflexin, cabe sealar que es posible definir hechos que no son ciertos en el mundo real. Por ejemplo pez(rinoceronte) o matemtico(borges). Por ms que estas relaciones son visiblemente falsas en el mundo real (el rinoceronte no es un pez y Borges es un escritor, no un matemtico), l interprete Prolog no lo sabe y para este son perfectamente vlidas. De esto se puede deducir como conclusin que los hechos en Prolog permiten simplemente la expresin de relaciones arbitrarias entre objetos. Problema resuelto N 1 Escribir en Prolog los datos relevantes, (a los efectos genealgicos), del siguiente prrafo: La familia de Luis no es muy numerosa, sus padres, Carlos y Susana, tuvieron tres hijos: Roberto, Amalia, y Luis, de los cuales Luis es el menor. Carlos, a su vez, tiene una hermana mayor llamada Isabel, siendo ambos hijos de Ana y Guillermo. Los padres de Susana, Mercedes y Ernesto, tuvieron otra hija bastante menor que ella, a quien bautizaron con el nombre de Anglica, la que es tan bella como su nombre. Los dos hijos de Luis y su esposa Laura, llamados Federico y Carla, estn estudiando letras. Respuesta A los efectos genealgicos, no interesa demasiado si alguien es bello, mayor o estudia, por lo tanto se propone el siguiente juego de relaciones para almacenar los datos sustanciales, o sea los de parentesco: progenitor(carlos, roberto). progenitor(carlos, amalia). progenitor(carlos, luis). progenitor(susana, roberto). progenitor(susana, amalia). progenitor(susana, luis). progenitor(ana, carlos). progenitor(ana, isabel). progenitor(guillermo, carlos). progenitor(guillermo, isabel). progenitor(mercedes, susana). progenitor(mercedes, angelica). progenitor(ernesto, susana). progenitor(ernesto, angelica). progenitor(luis, federico). progenitor(luis, carla). progenitor(laura, federico). progenitor(laura, carla). Esta forma de escribir las proposiciones, si bien responde parcialmente al problema presentado, tiene dos grandes inconvenientes: a) Hay una gran redundancia de palabras, el predicado y los nombres se repiten muchas veces. b) Pese a la cantidad de relaciones escritas, quedan muchos datos sin almacenar, por ejemplo las relaciones de hermano, abuelo, to, etc. Si se incluyeran todas estas proposiciones la redundancia sera mucho mayor, y la cantidad de relaciones aumentara considerablemente.
4 ________________________ Ing. Jos Fernndez Zamora

Ms adelante se vern formas de incluir toda la informacin del prrafo reduciendo la redundancia. Consultas Una vez que se tiene algunos hechos almacenados en la base de datos del intrprete, se pueden realizar consultas sobre ellos. Una consulta en Prolog es como un hecho, con la diferencia que se le debe anteponer el smbolo ?-. Una posible consulta sera: ?- progenitor(zeus, hercules). Esta consulta puede interpretarse en lenguaje natural de la siguiente forma: Es Zeus progenitor de Hercules?. A lo cual el intrprete responder de acuerdo a los hechos que previamente hayan sido ingresados a la base. Bsicamente, Prolog buscar en la base de datos un hecho que aparee (o que haga match segn la literatura inglesa) con el hecho de la consulta. Dos hechos aparean si sus predicados y sujetos son idnticos. Si tal hecho es encontrado, entonces la respuesta a la consulta ser yes, es decir que es cierto que Zeus es progenitor de Hercules. Si no se encuentra un hecho que aparee entonces asumir que es falso que Zeus es progenitor de Hercules, y el intrprete responder no. Reflexionando un poco sobre lo expresado en el prrafo anterior, se deduce fcilmente que para Prolog todo lo que no existe en su base de datos, o sea su universo, no es verdadero. Esto es as, a pesar de que la consulta en cuestin se refiera a un hecho cierto en el mundo real. Inversamente, pueden definirse hechos que no se corresponden con situaciones del mundo real y sin embargo para el intrprete son verdaderos. Problema resuelto N 2 Usando la base de datos generada en el problema resuelto N 1, y con lo que se conoce hasta ahora, escribir consultas para obtener la siguiente informacin: a) b) c) d) Es Carlos progenitor de Guillermo? Es Jorge progenitor de Gonzalo? Es Carlos progenitor de Amalia? Usando el predicado padre responder: Es Carlos padre de Roberto?

Respuesta ?- progenitor(carlos, guillermo). Rpta: no ?- progenitor(jorge, gonzalo). Rpta: no ?- progenitor(carlos, amalia). Rpta: yes ?- padre(carlos, roberto). Rpta: no Las respuestas de las tres primeras consultas son claras. En cuanto a la cuarta, Prolog responde no, lo cual no significa que es falso que Carlos es el padre de Roberto, sino que nada aparea con la consulta formulada. Es importante recordar entonces que para la programacin lgica, no es distinto que falso. Los hechos y consultas realizadas hasta este momento, no revisten ningn inters particular. Todo lo que se hizo fue obtener la misma informacin que se ingres. Para poder realizar consultas ms interesantes, es necesario adquirir un nuevo concepto, el de variables.

5 ________________________ Ing. Jos Fernndez Zamora

Variables El concepto de variable introduce formas ms refinadas de consultar la base. En Prolog, una variable es un comodn que ocupa el lugar de un sujeto desconocido, en lgica de predicados esto se denomina variable de sujeto. Contando ahora con el concepto de variables, es posible realizar consultas como De quin es progenitor Carlos?, en lugar de realizar la tediosa tarea de preguntar Es Carlos progenitor de Roberto?, Es Carlos progenitor de Amalia?, y as sucesivamente, para que Prolog responda cada vez yes o no. Con el objetivo de averiguar de quin es progenitor Carlos, se puede realizar la siguiente consulta: ?- progenitor(carlos, X). En Prolog adems de poder dar nombres a objetos particulares, existe la posibilidad de usar nombres como X que ocupan el lugar de objetos a ser determinados por el intrprete. Este segundo tipo de nombres son las variables. A diferencia de los nombres comunes, los nombres de variables deben comenzar con una letra mayscula, para que puedan ser identificadas por el intrprete. Cuando Prolog usa variables, las mismas pueden tener dos estados, instanciadas y no instanciadas. Una variables est instanciada cuando se conoce el objeto por el cual toma el lugar, y no lo est en el caso contrario. Cuando el intrprete responde una pregunta como Es Carlos progenitor de X?, busca entre todos sus hechos para encontrar individuos de los cuales Carlos es progenitor. Es decir que trata de encontrar un objeto con el cual instanciar la variable. Problema resuelto N 3 Usando la base de datos: juega(guillermo, tenis). juega(guillermo, truco). juega(gabriela, tenis). Responder las siguientes consultas: a) b) a) A que juega Guillermo? Alguien juega tenis? ?- juega(guillermo, X). X=tenis

Respuesta

y el interprete quedara aguardando por instrucciones. Las instrucciones posibles en este punto son dos. Una que concluya la consulta. La otra que contine buscando qu otras cosas juega Guillermo. Si se presiona la tecla ENTER, el intrprete asumir que ya s e encontr la respuesta deseada y concluir la bsqueda; en cambio si se presiona la tecla ; seguida de ENTER, Prolog continuar buscando a partir del hecho juega(guillermo,tenis), un nuevo hecho que aparee con la consulta. En el instante que se realiza la consulta del ejemplo, la variable X, no esta instanciada an. Entonces Prolog busca en la base de datos, hechos que apareen con la consulta. Si una variable no instanciada aparece como argumento, Prolog permitir a dicho argumento aparearse con cualquier otro en la misma posicin. El segundo argumento en el ejemplo puede ser cualquiera, porque la consulta fue realizada con una variable no instanciada en dicho lugar. Es por tal motivo que se mencion anteriormente que las variables funcionan
6 ________________________ Ing. Jos Fernndez Zamora

como un comodn. Una vez que se encontr un hecho que aparea con la consulta, la variable es instanciada con el objeto que ocupa su posicin. As en el ejemplo X es instanciada con tenis. Adems, la posicin del hecho que apare con la consulta es marcada por el intrprete, previendo que le sea indicado en un futuro continuar la bsqueda. Si tal es el caso, Prolog deber continuar buscando a partir de la posicin sealada previamente, para lo cual necesitar como paso previo poner nuevamente la variable en estado de no instanciacin. b) ?- juega(X, tenis). X=guillermo;

Si se le indica al intrprete que siga buscando otras personas que jueguen tenis, presionando para esto la tecla ; y luego ENTER, la respuesta sera: X=gabriela; repitiendo la ltima accin concluira: no es decir no hay mas respuestas posibles. Variables annimas Las consultas que normalmente se realizan a una base de datos, llevan entre sus argumentos variables sin instanciar, con el objetivo de que ellas sean instanciadas luego con valores constantes, como fue el caso del ejercicio anterior. Pero hay situaciones en las que no es de inters el valor de una determinada variable, en cuyo caso se utiliza una variable annima, la cual se denota con el signo de subrayado _. Por ejemplo la consulta: ?- juega(X, tenis). puedereemplazarse por: ?- juega(_, tenis). si lo nico que interesa saber es si alguien juega tenis, y no cul o cuales son las personas que lo hacen. De esta manera, la variable _, reemplaza el nombre de la persona que no es de inters conocer. La variable annima es una variable que no instancia con nada. Se utiliza toda vez que es necesario reconocer la existencia de un argumento, pero no se desea instanciarlo con un valor constante. Conjunciones El tipo de consultas a la base vistas hasta este momento, tienen la particularidad de estar constituidas por un solo hecho que debe verificarse, pero existen casos en los cuales el nmero de hechos a verificar es superior. Consideremos la consulta Juegan Guillermo y Gabriela tenis?. Con las herramientas presentadas hasta el momento, existe solo una forma de verificar esta consulta, y consiste en preguntar primero al intrprete si Guillermo juega tenis, y ante una respuesta afirmativa, preguntar si Gabriela juega tenis, luego si la respuesta es yes se puede afirmar que Guillermo y Gabriela juegan tenis. Existe una forma ms sencilla de realizar este tipo de consultas. Esto se logra mediante consultas conjuntivas; que consisten en dos o ms hechos unidos por conjunciones lgicas. El ejemplo del prrafo anterior puede resolverse empleando consultas conjuntivas como sigue: ?- juega(guillermo, tenis), juega(gabriela, tenis).
7 ________________________ Ing. Jos Fernndez Zamora

La coma que separa a ambos hechos de la consulta representa una conjuncin. Para que una consulta conjuntiva sea verdadera debe demostrarse la veracidad de todos sus predicados. La consulta del ejemplo es verdadera, si es cierto que Guillermo juega tenis y tambin lo es que Gabriela juega tenis. Cada predicado que debe ser demostrado en una consulta ser llamado de ahora en adelante meta. Es importante tener en cuenta que no solo deben cumplirse como se dijo anteriormente todas las metas, sino que tambin estas deben ser alcanzadas en el orden de ocurrencia dentro de la consulta, debido no a la lgica, sino a una de las caractersticas semiprocedurales que presenta Prolog y que sern estudiadas a medida que vayan apareciendo a lo largo del libro. En el ejemplo es sencillo ver como procedera el intrprete : como primer paso tratara de alcanzar como es de suponer la primer meta, esto es, demostrar que Guillermo juega tenis; luego, si la primer meta es alcanzada, intentara demostrar que Gabriela juega tenis, es decir la segunda meta. Si la segunda meta es tambin demostrada, la consulta obtendr como respuesta afirmativa yes. En el caso supuesto que la primer meta fuese falsa, automticamente la respuesta sera no, y no se intentar demostrar la segunda. El uso de variables en las consultas conjuntivas, complica el procedimiento de respuesta usado por el intrprete, a la vez que potencia las posibilidades del lenguaje. A continuacin se ejemplifica lo que sucede en tales casos, mediante un ejercicio resuelto. Problema resuelto N 4 Usando la base de datos generada en el Problema resuelto N 1, utilizando una consulta conjuntiva responder: Son Carlos y Susana padres del mismo hijo? Respuesta ?- progenitor(carlos, X), progenitor(susana, X). es decir, encontrar alguna persona X de la cual Carlos sea progenitor y Susana tambin. En este caso Prolog responde la consulta intentando satisfacer la primer meta. Si esta se encuentra en la base de datos, o sea Carlos es progenitor de alguien X, entonces Prolog marcar la posicin e intentar satisfacer la prxima meta; si tambin es alcanzada, Prolog marca la posicin en la base y se habr encontrado una solucin que satisface ambas metas. Es importante considerar que cada meta mantiene su propia marca de posicin. Si, por ejemplo, la segunda meta no es alcanzada, Prolog tratar de resatisfacer la meta previa, en el ejemplo la primera. Por lo tanto Prolog inspecciona completamente la base por cada meta, lo cual justifica mantener una marca de posicin por meta. Cuando una meta deba ser resatisfecha, el intrprete continuar a partir de la marca. El proceso de agotar todas las posibilidades existentes para cada meta se denominaBacktracking y es un concepto fundamental dentro de la programacin en Prolog, por lo que se le ha dedicado un captulo dentro de este libro. Por el momento ser suficiente con entender como funciona este concepto intuitivamente. Generalizando el concepto, una consulta conjuntiva es, valga la redundancia, una conjuncin de metas a satisfacer, toda ellas separadas por comas. Cuando Prolog encuentra una conjuncin de metas, trata de satisfacerlas de izquierda a derecha. Si una de las metas es alcanzada, Prolog marca el lugar en la base de datos, y lo asocia a la meta en cuestin. En este instante toda variable que aparezca en la meta es instanciada. Si una variable es instanciada, toda ocurrencia de la misma, en las metas subsiguientes tambin
8 ________________________ Ing. Jos Fernndez Zamora

lo estar. Prolog entonces tratar de resolver la meta siguiente, comenzando desde el principio de la base de datos. Como cada meta en turno de ser satisfecha, dejar una marca en la base de datos, por si debe ser resatisfecha ms adelante. En cualquier momento que una meta falle (no pueda alcanzar un hecho que aparee), Prolog intentar resatisfacer la meta anterior, comenzando de la marca en la base de datos que le corresponda. Tambin pondr en estado de no instanciacin cualquier variable que haya sido instanciada en la meta en cuestin. A medida que Prolog no pueda ir satisfaciendo las metas, tratar de volver a evaluar la meta anterior, este proceso tiene su fin cuando se alcanza la meta inicial, si esta falla entonces la conjuncin completa falla. Estos intentos repetidos de satisfacer y resatisfacer las metas de una conjuncin, constituyen el proceso de backtracking mencionado anteriormente. Disyunciones Del mismo modo que existen las consultas conjuntivas en Prolog, donde todas las metas deben satisfacerse para que la consulta sea verdadera, existen tambin las consultas disyuntivas, en las que basta que el interprete logre alcanzar alguna de las metas para responder positivamente a la consulta. El siguiente es un ejemplo de consulta disyuntiva: ?- juega(gabriela, tenis); juega(gabriela, truco). donde el punto y coma que separa cada una de las consultas simples representa la disyuncin. En lenguaje natural esta consulta equivale a Juega Gabriela tenis o truco? Para resolver esta consulta el intrprete tratara, en primer lugar, de demostrar que Gabriela juega al tenis. En caso de lograrlo, no continuara intentando demostrar el resto de las metas sino que se detendra y contestara afirmativamente a la consulta. En otro caso, se propondra demostrar que Gabriela juega al truco. Si fuera posible demostrar esto la respuesta sera yes, caso contrario sera no, ya que no existen otras metas a probar. En general, para responder a una consulta disyuntiva, Prolog intenta satisfacer alguna de las metas comenzando a evaluarlas de izquierda a derecha. Pasa a la siguiente meta nicamente en el caso de haber agotado todas las posibilidades de que la primera sea verdadera. Este proceso se detiene si logr demostrarse una meta, en cuyo caso la respuesta a la consulta ser positiva independientemente de la verdad o falsedad de las metas restantes, o bien si se lleg al final de la consulta sin poder demostrar ninguna meta, siendo este el nico caso en que la respuesta ser negativa. Consultas ms complejas pueden formarse combinando consultas conjuntivas y disyuntivas. Para esquematizar este tipo de consultas se presenta a continuacin un ejercicio resuelto. Problema resuelto N 5 Sobre la base de datos del ejercicio resuelto N 3, realizar la siguiente consulta: Juega Gabriela al tenis y al truco, o juega Guillermo al tenis y al truco?. Respuesta ?- juega(gabriela, tenis), juega(gabriela, truco); juega(guillermo, tenis), juega(guillermo, truco). yes

9 ________________________ Ing. Jos Fernndez Zamora

La respuesta afirmativa se debe a que es posible demostrar que Guillermo juega tanto al tenis como al truco.En esta consulta puede observarse que la conjuncin tiene mayor prioridad que la disyuncin, es por ello que la consulta se evalu como: O juega(gabriela, tenis) y juega(gabriela, truco) O bien juega(guillermo, tenis) y juega(guillermo, truco). y no en alguna otra forma. Este orden de evaluacin puede alterarse mediante el uso de parntesis. De este modo la consulta: ?- juega(gabriela, tenis), (juega(guillermo, tenis); juega(guillermo, truco)) ser evaluada como: juega(gabriela, tenis) y (o juega(guillermo, tenis) o bien juega(guillermo, truco)) Aritmtica Como ltimo tema a tratar en con este captulo, se introducirn algunas nociones acerca del manejo de nmeros que realiza Prolog. Cabe aclarar que dentro de este lenguaje no es tan importante como en otros lenguajes el trabajo con nmeros, debido a la naturaleza de las aplicaciones para las cuales es utilizado normalmente. Para trabajar con este tipo de datos, se necesita hacer uso de lo que se denominan operaciones aritmticas. Tales operaciones sirven para realizar comparaciones entre nmeros y calcular resultados. Prolog provee para esto ciertos predicados standard del tipo autoconstrudos (built-in), es decir, que no es necesario definirlos. Una particularidad que presentan estos predicados con respecto a los que se han utilizado anteriormente es su notacin infija. Como se ha mencionado anteriormente, se pueden dividir las operaciones aritmticas en dos grandes grupos: comparacin entre nmeros, y clculo de resultados. Dentro del primer grupo, los predicados provistos son los siguientes: X=Y X \= Y X<Y X>Y X <= Y X >= Y X e Y ocupan el lugar del mismo nmero X e Y ocupan el lugar de distintos nmeros X es menor que Y X es mayor que Y X es menor o igual que Y X es mayor o igual que Y

En estos momentos, el lector se preguntar como es posible que Prolog sepa que una relacin 3 = 3 es verdadera, cuando no se la ingresado a la base. Para comprender esto, puede suponerse que el intrprete posee una base virtual con todas las posibles relaciones entre los nmeros. Cabe sealar que el usuario no puede definir una nueva relacin para un predicado autoconstrudo del lenguaje. As, por ejemplo, no es posible definir el predicado 3 >4. Ejemplos de cmo trabaja el intrprete con este tipo de relaciones son: ?- 3 = 3. yes ?- 4 > 5. no ?- 3 = 5. no
10 ________________________ Ing. Jos Fernndez Zamora

Para las operaciones del segundo grupo (clculo de resultados), el intrprete utiliza el predicado is, tambin de notacin infija. El argumento de la derecha, es una operacin aritmtica, y el de la izquierda debe ser un objeto que se aparee con el resultado de la operacin. Ejemplos del uso de este predicado son : ?- 5 is 3 + 2. yes ?- X is 9 + 4. X = 13 ?- 3 is 2 + 5. no Es importante aclarar que si bien pueden utilizarse variables del lado derecho de la expresin, estas deben encontrarse instanciadas previamente. Esto se debe a la forma en la cual el intrprete resuelve el predicado, evaluando en primera instancia la operacin de la derecha, y luego aparendola con el valor de la izquierda. Los operadores ms comunes y que la mayora de los intrpretes Prolog permiten utilizar a la derecha del predicado is son: X+Y X-Y X*Y X/Y X mod Y La suma de X e Y La resta de X e Y El producto de X e Y El cociente de X dividido por Y El resto de X dividido por Y

11 ________________________ Ing. Jos Fernndez Zamora

Resolver los siguientes ejercicios Construir los siguientes programas en Prolog 1. Armar una base de datos con la siguiente informacin sobre los vuelos de una aerolnea, el predicado puede ser es_vuelo, por ejemplo: es_vuelo(buenos_aires, crdoba). Ciudad de origen Buenos Aires Buenos Aires Buenos Aires Crdoba Crdoba Crdoba San Juan San Juan San Juan Mendoza Santa Rosa Ciudad de destino Crdoba Santa Rosa San Juan Santa Fe Tucumn Santa Rosa Tucumn Mendoza Neuqun Tucumn San Juan

2. Usando la base de vuelos, expresar las siguientes preguntas como consultas Prolog: a) b) c) d) e) 3. Tengo algn vuelo de Crdoba a Santa Rosa? Existe un vuelo desde Santa Fe hasta Neuqun? Existe un vuelo desde Tucumn hasta San Juan? Hacia que ciudades van los vuelos que parten de Crdoba? De donde provienen los vuelos que llegan a San Juan? Con la base de vuelos, contestar las siguientes preguntas:

a) Existe algn vuelo desde Santa Rosa a Mendoza pasando por San Juan? b) Existe algn vuelo desde Buenos Aires a San Juan pasando por alguna otra ciudad? c) Por que ciudad intermedia pasa un vuelo que parte de Buenos Aires y llega a Santa Fe? d) Por cules dos ciudades intermedias pasa un vuelo que salga de Crdoba y llega a Mendoza? 4. Suponer que se tiene la siguiente base de datos con informacin sobre la jerarqua militar de un pas hipottico: tiene_rango(bush, coronel). tiene_rango(komehini, soldado). tiene_rango(kadafi, soldado). tiene_rango(fujimori, soldado). tiene_rango(gonzalez, capitan). tiene_rango(gorbachov, general). tiene_rango(chirac, cabo).
12 ________________________ Ing. Jos Fernndez Zamora

tiene_rango(hussein, sargento). tiene_rango(ford, teniente). tiene_rango(arafat, mayor). es_jefe_de(general, coronel). es_jefe_de(coronel, mayor). es_jefe_de(mayor, capitn). es_jefe_de(capitn, teniente). es_jefe_de(teniente, sargento). es_jefe_de(sargento, cabo). es_jefe_de(cabo, soldado). Traducir las siguientes consultas al espaol, e indicar cules seran las respuestas del sistema en cada caso sin usar la computadora: a) b) c) d) e) ?-es_jefe_de(teniente, X), es_jefe_de(X, Y). ?-es_jefe_de(X, Y), tiene_rango(hussein, X), tiene_rango(Z,Y). ?-tiene_rango(bush,X); tiene_rango(arafat, X). ?-tiene_rango(X,Y), es_jefe_de(mayor Y). ?-es_jefe_de(X, sargento), not(tiene_rango(kadafi, X)).

(not es un predicado autoconstrudo del lenguaje que es verdadero cuando su argumento es un predicado falso y viceversa). Escribir en Prolog las siguientes consultas: a) Que rango tiene el jefe de Gonzalez? b) Es Chirac jefe de Hussein? c) Quin o quienes dependen directamente de Chirac? 5. Reescribir la base de vuelos incluyendo el tiempo de viaje, de acuerdo con la siguiente tabla: Ciudad de origen Buenos Aires Buenos Aires Buenos Aires Crdoba Crdoba Crdoba San Juan San Juan San Juan Mendoza Santa Rosa Ciudad de destino Crdoba Santa Rosa San Juan Santa Fe Tucumn Santa Rosa Tucumn Mendoza Neuqun Tucumn San Juan Duracin (min) 80 70 120 40 60 75 85 15 100 95 80

Usar un predicado ternario, por ejemplo: vuelo(buenos_aires, cordoba, 80).

13 ________________________ Ing. Jos Fernndez Zamora

Efectuar las siguientes consultas: a) Cunto se tarda para ir desde Crdoba hasta Tucumn? b) Cunto se tarda para ir desde Buenos Aires hasta Santa Fe pasando por Crdoba? c) Cunto se tarda para ir desde Buenos Aires hasta San Juan pasando por Crdoba y Santa Rosa? d) Saliendo desde Buenos Aires, a qu ciudades se puede llegar en menos de 90 minutos? e) Cules son los vuelos de mas de una hora de duracin? f) Cul es la diferencia de tiempo entre el vuelo directo de Buenos Aires a San Juan y el que pasa por Santa Rosa? 6. Armar una base con la siguiente informacin alimentaria: una racin de pollo tiene 270 caloras, un flan 190 y una de buen asado 380. Hoy me propongo no almorzar mas de 580 caloras. Obtener respuestas a las siguientes preguntas usando consultas:

a) b) c) d)

Cuntos flanes me puedo comer? Puedo comer el asado y el pollo? Si me como el pollo y el flan, cuntas caloras, menos que las mximas ingiero? Cuntas caloras ingiero si me como el pollo y dos flanes?

14 ________________________ Ing. Jos Fernndez Zamora

Armar una base con la siguiente informacin 1. 2. 3. Una racin de pollo tiene 270 caloras Un flan 190 caloras y un buen asado 380 caloras Hoy me propongo no almorzar ms de 580 Caloras. Obtener respuestas a las siguientes preguntas: A. Cuntos flanes me puedo comer? B. puedo comer el asado y el pollo? C. Si me como el pollo y el flan, cuntas caloras menos que las mximas ingeniero. D. Cuntas caloras ingiero si me como el pollo y dos flanes?

Definir una relacin que vincule la seccion en la que trabaje un empleado, su sueldo bsico y su antiguedad, con el sueldo que cobra. Para ello tiene en cuenta q a cada empleado se le paga un sueldo basico mas un adicional que se calcula de la siguiente manera: A.- los que trabajan en la seccin uno ganan 500 mas, y sobre el total un adicional x antigedad del 10% si tiene menos de 5 aos, y del 20% si tiene 5 aos a mas. B.- Los que trabajan en la seccin dos cobran 700 soles mas, pero no cobran adicional por antigedad. Definir el predicado sueldo. sueldo(seccion,basico,antigedad,cobrar)

15 ________________________ Ing. Jos Fernndez Zamora

También podría gustarte