INTELIGENCIA EN REDES DE COMUNICACIONES

INMACULADA LUENGO LÓPEZ Mª ESTHER MARTÍN REBOLLO

IRC Práctica final ÍNDICE Introducción_______________________________________________3 Objetivo de la práctica _____________________________________3 Desarrollo de la práctica____________________________________4 Resultados obtenidos ______________________________________7 Aprendizaje _______________________________________________9 Código del programa______________________________________11 Bibliografía_______________________________________________15 Página 2 de 15 .

Objetivo de la práctica El fin de esta práctica ha sido desarrollar un programa en PROLOG que adivine el animal que ha pensado el usuario mediante el empleo de una serie de preguntas sobre las características del mismo a las que el jugador debe responder afirmativa o negativamente. todo lo que no figura explícitamente como un hecho y tampoco se puede deducir es falso. se le formularán al usuario preguntas sobre las características que tiene el animal que ha pensado. a partir de estas reglas. Página 3 de 15 . Otra característica es que el orden de las cláusulas cambia el resultado final. que el usuario podría introducir cuando el programa no adivinase el animal que éste había pensado. y la asunción de un mundo cerrado. También se ha contemplado la posibilidad de que el programa aprenda nuevos animales. Sus principales características son que se trata de una programación dinámica. son también datos. hemos definido un conjunto de reglas que debe verificar cada uno de los animales que el programa conoce y. PROLOG es un lenguaje lógico declarativo que se basa en cláusulas de Horn. La decisión de utilizar PROLOG para el desarrollo de esta práctica se debe a que es un lenguaje sencillo que proporciona una sintaxis para la construcción de sistemas expertos (en nuestro caso un sistema experto que identifique a los animales a partir de sus características). además de dicho animal. Para ello.IRC Práctica final Introducción En esta práctica hemos decidido implementar un programa en PROLOG para adivinar animales a partir de preguntas que se le van haciendo al usuario. una pregunta que lo diferencie del animal que ha respondido erróneamente el programa. Para ello se debe introducir. En esta práctica vamos a analizar el problema de un árbol de decisión con aprendizaje. y tanto las reglas como los objetivos.

avestruz. mamíferos. conejo. león. hombre. Esta estructura será un árbol. en primer lugar nos tendremos que plantear la estructura que va a tener nuestra lista de animales. salamandra. La lista de los animales que se han tenido en cuenta para el desarrollo de esta práctica es: rana. en el que en las hojas se encontraran los distintos animales. tigre. y llegaremos a ellos por medios de las distintas características diferenciadoras que tiene cada uno. águila. cocodrilo. En primer lugar. anfibios. pato. jirafa. gallina. Para realizar esta clasificación se tienen que tener en cuenta que las preguntas a realizar nos tienen que caracterizar una de las hojas frente a otra. oso. tortuga. serpiente. mostramos el árbol que vamos a desarrollar: Página 4 de 15 . y así poder llegar a la hoja deseada sin ningún tipo de ambigüedad. carpa y pez espada. aves y peces.IRC Práctica final Desarrollo de la práctica Para la implementación del programa deseado. Siendo una de las principales características su clasificación en: reptiles. pingüino. y para mostrar con mayor claridad el fundamento del programa.

IRC Práctica final Página 5 de 15 .

comenzando por el animal situado más a la izquierda del árbol y por la pregunta del nodo raíz.. mamíferos. Según ésta sea afirmativa o negativa. Las características que nos permiten clasificarlos dentro de estos grupos se harán aparte para que el código del programa sea más claro y más general. De esta forma. para evitar repetir al usuario preguntas ya realizadas anteriormente. y no necesitará verificar ninguna condición. que en nuestro caso es el pez espada. con las que la utilizamos sean dinámicas. cuando lleguemos a una hoja del árbol el programa dará como solución un animal que cumpla todas las preguntas anteriormente realizadas. necesitaremos que las funciones cumple y no_cumple. de izquierda a derecha en la figura del árbol. Para cada uno de los animales se realizarán las preguntas sobre las características que debe cumplir. avanzaremos hacia una u otra rama del árbol. vamos a utilizar una función que se llamará sera(Animal). reptil…). como las relacionadas con el tipo de animal (anfibio. y pasamos a llamar a la función preguntar(caracteristica). En la función preguntar será donde realizaremos la pregunta sobre la característica determinada a verificar y en la que almacenaremos la respuesta.. y si no se cumple será fail. Esto lo implementaremos con la ayuda de la función assert. Se seguirán verificando las características para un mismo animal siempre que se responda afirmativamente a las preguntas y se pasará a comprobar las características del animal siguiente (el situado inmediatamente a la derecha del animal actual) cada vez que se responda negativamente a una de las preguntas. Además tendremos que borrar los valores almacenamos. aves y peces. que nos ayudara a ir almacenando las respuestas a las distintas características. En primer lugar. que determinará principalmente el orden en el que se deben ir comprobando los distintos animales (¿será una rana?. Ahora pasamos a comentar la función verificar(caracteristica) que ya hemos nombrado anteriormente. Mediante estas reglas podremos realizar una primera clasificación de los animales en anfibios. y así poder seguir avanzando en el árbol.IRC Práctica final Comenzamos analizando el código desarrollado. El animal que no cumpla ninguna de las características preguntadas será el que está en la hoja situada más a la derecha del árbol.). Debido a la utilización de la función assert en este punto. ya que simplemente es el que no cumple ninguna de las anteriores. En esta función decimos que si se cumple la característica el resultado será true. con la ayuda Página 6 de 15 . reptiles.

Además una vez adivinado el animal. se nos ofrecerá la oportunidad de seguir jugando. sin haber realizado ninguna pregunta. Si olvidásemos realizar este borrado. Resultados obtenidos Ahora vamos a probar el funcionamiento de nuestro programa.IRC Práctica final de la función retract. una vez que hayamos mostrado al usuario el animal adivinado. por ejemplo la jirafa. Vamos a pensar un animal de los que conoce. para lo que llamaremos a la función borrar en la parte principal del programa. El programa nos irá haciendo preguntas recorriendo el árbol de la siguiente forma: Página 7 de 15 . en la siguiente ejecución comenzaríamos directamente dando como animal adivinado el obtenido en el caso anterior. en lugar de tener que volver a ejecutar el programa.

IRC Práctica final Página 8 de 15 .

Una vez conocidos el animal y una característica que lo distinga. Página 9 de 15 . De no ser así. hemos empleado la función asserta que nos permite introducir nuevas reglas al principio de la base de datos. Esta nueva regla se tratará de igual forma que las definidas de forma explícita en el programa. Por lo tanto. lo añadimos mediante la función asserta. El programa sólo podrá aprender cuando no acierte el animal que había pensado el usuario. tendremos que preguntarle al usuario cuál era el animal que había pensado y que nos indique una característica de éste que permita al programa diferenciarlo del animal que el había ofrecido como solución. Aprendizaje Nos hemos planteado también la posibilidad de que el programa pueda aprender nuevos animales. lo primero que tenemos que hacer una vez identificado el animal por el programa es preguntarle si hemos acertado dicho animal. Para implementarlo.IRC Práctica final La captura del programa obtenida es la siguiente: Podemos ver que el programa va haciendo las preguntas en el orden indicado en el árbol hasta adivinar que el animal que se había pensado era la jirafa.

Para ello. La captura del programa es la siguiente: Ahora podemos comprobar que ha insertado mono en la base de datos: Página 10 de 15 . que no está incluido en la base de datos del programa.IRC Práctica final Veamos un ejemplo de aprendizaje de nuestro programa. hemos pensado en el mono.

pero no es demasiado importante porque sigue adivinando correctamente los animales inicialmente introducidos. sera(Animal). write('RESPONDE A LAS SIGUIENTES PREGUNTAS'). nl. nl." /*Comienza el juego*/ /*Para implementar el juego partiremos de un árbol en el que tendremos todos los animales que podemos adivinar y las relaciones entre ellos*/ start :nl. write('PARA ADIVINAR EL ANIMAL EN EL QUE ESTAS PENSANDO. nl. que puede identificar este animal del ofrecido anteriormente como solución: En mayor inconveniente que tiene el método que hemos seguido es que ya no nos permite realizar las preguntas en el orden inicial. teclea: " ?.IRC Práctica final Y además.start. '). Código del programa /* ADIVINO EL ANIMAL EN EL QUE ESTAS PENSANDO Para empezar el juego. /*En primer lugar llamamos a la función hipótesis. */ Página 11 de 15 .

/*Aprendizaje de nuestro programa*/ /*Comprobamos si hemos acertado el animal*/ write('¿He acertado? (s/n) '). write(Animal). asserta( (sera(Respuesta1) :.jirafa. !.tortuga. /* Hipótesis de animales que se van a comprobar */ sera(rana) :. Página 12 de 15 . habremos encontrado la respuesta*/ nl.IRC Práctica final Con esta función empezaremos en el nodo raíz e iremos avanzando en el árbol */ /*Cuando lleguemos a una hoja del árbol. nl.rana. sera(hombre) :. !.salamandra. intentamos introducir una regla para su aprendizaje*/ ( (Respuesta == s) -> borrar. nl. write('Dime una pregunta para '). sera(jirafa) :.hombre. seguir_jugando . sera(cocodrilo) :. !.serpiente.cocodrilo. !. write('****************************************'). write(': '). write('****************************************'). write(Animal). read(Respuesta2). sera(salamandra) :. write(Respuesta1). write(' que lo diferencie de '). !. nl. read(Respuesta1). borrar. nl.Animal. !. write('¿Qué animal es? '). nl. verificar(Respuesta2)) ) . sera(tortuga) :. sera(serpiente) :. /*En el caso de no haber acertado. write('Creo que el animal es '). nl. seguir_jugando).conejo. nl. nl. sera(conejo) :. nl. !. !. read(Respuesta).

!.carpa. anfibio. conejo :. !. /*Aves*/ Página 13 de 15 .sangre_fria.mamifero. !. sera(leon) :. !.pez_espada. verificar(tiene_cuello_largo).leon.sangre_fria. sera(aguila) :. omnivoro.mamifero.oso. cocodrilo :. /*Reptiles*/ serpiente :. sera(avestruz) :.aguila. anfibio. verificar(se_arrastra). tigre :. sera(pinguino) :. sera(tigre) :. /*Mamíferos*/ jirafa :. sera(pato) :. !.sangre_fria.mamifero. verificar(salta).mamifero.gallina. verificar(razona). sera(carpa) :. !. !. sera(pez_espada):.pinguino. Práctica final /* Reglas con las que identificaremos los distintos animales */ /*Anfibios*/ rana :. verificar(tiene_rayas). herbivoro.avestruz. oso :. !.tigre. sera(gallina) :. hombre :. !.sangre_fria.sangre_fria.mamifero. salamandra :. verificar(tiene_caparazon). tortuga :.pato. leon :. herbivoro.mamifero. omnivoro.IRC sera(oso) :.

write(Pregunta). pinguino :. verificar(es_domestico). voladora. write('? (s/n) '). voladora :. Esto lo haremos con la función preguntar*/ preguntar(Pregunta) :write('¿Tiene el animal la siguiente característica: ').verificar(tiene_pelo). verificar(es_ave_rapaz). Práctica final /* Reglas con las que clasificaremos los animales en: anfibios. gallina :. mamíferos. desde aquí llamaremos a la función que preguntara por cada característica */ verificar(S) :(cumple(S) -> true . mamifero :. Página 14 de 15 .verificar(tiene_alas). voladora.ave.verificar(tiene_sangre_fria). aves y peces */ /* Para ello utilizaremos la función verificar */ sangre_fria :.ave.IRC aguila :.verificar(es_herbivoro).verificar(vuela).ave. avestruz :.verificar(vive_rio). /*Peces*/ carpa :. /* Función verificar.verificar(es_omnivoro). pez_espada. herbivoro :.verificar(vive_tierra_y_agua).ave. reptiles.ave. ave :. omnivoro :. anfibio :. se irán realizando preguntas con las distintas características. (no_cumple(S) -> fail . /* Para avanzar por el árbol. verificar(corre_veloz). preguntar(S))). pato :.

Ed. Addison-Wesley Iberoamericana.dynamic cumple/1.verificar/1. fail). read(Respuesta3). nl). hacia una rama u otra del árbol */ /*Con assert. assert(no_cumple(Pregunta)).retract(no_cumple(_)).fail.no_cumple/1.IRC read(Respuesta). borrar.sera/1. ( (Respuesta3 == s) -> start . guardamos el camino seguido */ ( (Respuesta == s) -> assert(cumple(Pregunta)) . nl. seguir_jugando :/*Ofrecemos la oportunidad de volver a jugar otra vez*/ write('¿Quieres seguir jugando? '). /* Borramos todos los valores almacenados con assert que indican el camino seguido en el árbol */ borrar :. Bibliografía Prolog Francis Giannesini.fail. write('ESPERO QUE HAYAS DISFRUTADO JUGANDO CONMIGO'). nl. write('ADIOS'). Henry Kanoui y otros. 1989 Manual online de swi-prolog Jan Wielemaker Principles of programming languages XXI Wael Aboelsaadat - Página 15 de 15 . Práctica final /*Avanzamos en función de la respuesta a la característica. borrar :. nl. nl. nl.retract(cumple(_)). /*Hace dinámicas las funciones que se van a añadir con assert*/ :.

Sign up to vote on this title
UsefulNot useful