CARRERA DE INGENIERIA EN SISTEMAS INFORMATICOS INTELIGENCIA ARTIFICIAL II TRABAJO DE INVESTIGACIN DEL PRIMER PARCIAL
TEMAS: Desarrollo de un Sistema Experto para la recomendacin de libros
AUTORES: Morrillo Saltos John Jairo Zamora Intriago Joaqun
FECHA: Mircoles, 09 de julio 2014
PERIODO: Mayo Octubre 2014
PORTOVIEJO MANAB - ECUADOR
1. Introduccin
La Inteligencia Artificial comenz como el resultado de la investigacin en psicologa cognitiva y lgica matemtica. Se ha enfocado sobre la explicacin del trabajo mental y construccin de algoritmos de solucin a problemas de propsito general. Punto de vista que favorece la abstraccin y la generalidad. La Inteligencia Artificial es una combinacin de la ciencia del computador, fisiologa y filosofa, tan general y amplio como eso, es que rene varios campos (robtica, sistemas expertos, por ejemplo), todos los cuales tienen en comn la creacin de mquinas que pueden "pensar". La idea de construir una mquina que pueda ejecutar tareas percibidas como requerimientos de inteligencia humana es un atractivo. Las tareas que han sido estudiadas desde este punto de vista incluyen juegos, traduccin de idiomas, comprensin de idiomas, diagnstico de fallas, robtica, suministro de asesora experta en diversos temas. En el presente documento se redacta de manera clara y sencilla como se realizaron los distintos procesos que posee el sistema experto que le permite obtener una recomendacin bibliogrfica Se explicar de manera detallada el funcionamiento de la aplicacin; as como tambin el marco terico relacionado con la ejecucin de la misma, lo que permitir un mayor entendimiento, al momento de la implementacin del software EL lenguaje de programacin utilizado para el proyecto son Java Netbeans para el entorno de desarrollo, Prolog y el gestor de base de datos Mysql
2. OBJETIVOS 2.1 Objetivo general Desarrollar un sistema experto que permita recomendar bibliografa 2.2 Objetivos especficos Investigar la como se realiza la conexin entre Prolog, Netbeans y Mysql Desarrollar el sistema experto mediante la ayuda del entorno de desarrollo de Netbeans, la base de conocimiento de Prolog y el gestos de base de datos Reforzar los conocimientos adquiridos durante el curso de Inteligencia Artificial II mediante el desarrollo de la aplicacin
3. Marco Terico 3.1 Prolog Prolog es un lenguaje de programacin creado para representar y utilizar el conocimiento que se tiene sobre un determinado dominio. Ms exactamente, el dominio es un conjunto de objetos y el conocimiento se representa por un conjunto de relaciones que describen las propiedades de los objetos y sus interrelaciones. Un conjunto de reglas que describa estas propiedades y estas relaciones es un programa PROLOG. Una definicin ms accesible para el usuario comn sera: Prolog es un lenguaje de programacin que es usado para resolver problemas que envuelven objetos y las relaciones entre ellos. Su definicin basada en la lgica formal, permite ejecutar estatutos que no son otra cosa que oraciones de un lenguaje lgico elemental particular de clusulas. Prolog por su naturaleza muestra una habilidad para describir gramticas, en particular gramticas libres de contexto. Un programa Prolog est formado por una secuencia de enunciados (clusulas): hechos, reglas y variables.
3.1.1 Hechos 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).
3.1.2 Reglas Las reglas se utilizan en Prolog para significar que un hecho depende de uno o ms hechos. Es la representacin de las implicaciones lgicas del tipo p ---> q (p implica q). Algunas caractersticas son: Una regla consiste en una cabeza y un cuerpo, unidos por el signo " :- ". La cabeza esta formada por un nico hecho. El cuerpo puede ser uno o ms hechos (conjuncin de hechos), separados por una coma (","), que acta como el "y" lgico. Las reglas finalizan con un punto (".").
3.1.3 Variables Representan objetos que el mismo PROLOG determina. Una variable puede estar instanciada o no instanciada. Esta instanciada cuando existe un objeto representado por una variable. De este modo, cuando preguntamos Un coche tiene X ?, Prolog busca en los hechos cosas que tiene un coche y respondera: X = ruedas. Instanciando la variable X con el objeto ruedas. Los nombres de variables comienzan siempre por una letra mayscula.
3.2 Netbeans Es un entorno integrado de desarrollo o IDE (Integrated Development Environment) En l podemos realizar todas las tareas asociadas a la programacin Editar el cdigo Compilarlo Ejecutarlo Depurarlo Simplica alguna de las tareas que, sobre todo en proyectos grandes, son tediosas Nos asiste (parcialmente) en la escritura de cdigo, aunque no nos libera de aprender el lenguaje de programacin Nos ayuda en la navegacin de las clases predenidas en la plataforma (miles) Aunque puede ser costoso su aprendizaje, los benecios superan las dicultades
3.3 MySQL Es un sistema de administracin de bases de datos (Database Management System, DBMS) para bases de datos relacionales. As, MySQL no es ms que una aplicacin que permite gestionar archivos llamados de bases de datos.
Existen muchos tipos de bases de datos, desde un simple archivo hasta sistemas relacionales orientados a objetos. MySQL, como base de datos relacional, utiliza multiples tablas para almacenar y organizar la informacin. MySQL fue escrito en C y C++ y destaca por su gran adaptacin a diferentes entornos de desarrollo, permitiendo su interactuacin con los lenguajes de programacin ms utilizados como PHP, Perl y Java y su integracin en distintos sistemas operativos.
Tambin es muy destacable, la condicin de open source de MySQL, que hace que su utilizacin sea gratuita e incluso se pueda modificar con total libertad, pudiendo descargar su cdigo fuente. Esto ha favorecido muy positivamente en su desarrollo y continuas actualizaciones, para hacer de MySQL una de las herramientas ms utilizadas por los programadores orientados a Internet.
3.4 Sistema experto Los sistemas expertos se pueden considerar como el primer producto verdaderamente operacional de la inteligencia artificial. Son programas de ordenador diseados para actuar como un especialista humano en un dominio particular o rea de conocimiento. En este sentido, pueden considerarse como intermediarios entre el experto humano, que transmite su conocimiento al sistema, y el usuario que lo utiliza para resolver un problema con la eficacia del especialista. El sistema experto utilizar para ello el conocimiento que tenga almacenado y algunos mtodos de inferencia. A la vez, el usuario puede aprender observando el comportamiento del sistema. Es decir, los sistemas expertos se pueden considerar simultneamente como un medio de ejecucin y transmisin del conocimiento. Lo que se intenta, de esta manera, es representar los mecanismos heursticos que intervienen en un proceso de descubrimiento. stos mecanismos forman ese conocimiento difcil de expresar que permite que los expertos humanos sean eficaces calculando lo menos posible. Los sistemas expertos contienen ese "saber hacer". La caracterstica fundamental de un sistema experto es que separa los conocimientos almacenados (base de conocimiento) del programa que los controla (motor de inferencia). Los datos propios de un determinado problema se almacenan en una base de datos aparte (base de hechos). Una caracterstica adicional deseable, y a veces fundamental, es que el sistema sea capaz de justificar su propia lnea de razonamiento de forma inteligible por el usuario.
4. Configuracin para la conexin de Prolog, MySQL y Netbeans 1. Creamos una base de datos en Mysql (en nuestro caso sern 3 tablas: libro, categora y una entidad dbil llamada lib_cat) 2. Realizamos el origen de datos a travs de ODBC. Una conexin DNS del sistema 2.1 Nos dirigimos a panel de control >> herramientas administrativas >> orgenes de datos ODBC
2.2 Nos dirigimos hacia la pestaa DNS de sistema y hacemos click en el botn Agregar
2.3 Para agregar el nuevo origen de datos debemos instalar el Driver Connector/ODBC de Mysql, el cual lo podemos descargar en la siguiente direccin web: http://dev.mysql.com/downloads/connector/odbc/ y lo instalamos
2.4 Una vez agregado el driver lo seleccionamos (lo encontramos con el nombre MySQL ODBC 5.3 Driver) y damos click en finalizar
2.4 Se abrir una ventana de configuracin de MySQL donde ingresamos el nombre de la conexin, el servidor (localhost), el usuario Mysql con su respectivo password y la base de datos con la cual deseamos realizar la conexin y damos clik en el botn <<Ok>>
3. Realizamos un archivo en Prolog donde mediante reglas establecemos la conexin sentencias sql (inserciones y busqueda) (Ver cdigo en la seccin de anexos) 4. Realizamos las interfaces en Netbeans IDE, para realizar la conexin con Prolog debemos agregar las libreras del mismo paraa ello damos click derecho en la carpeta de libreras del proyecto y escogemos la opcin Add JAR/Folder y buscamos el archivo jpl.jar en la siguiente ruta C:\Program Files\pl\lib y lo agregamos
5. Manual de uso del sistema experto Al ejecutar el programa de muestra la siguiente venta principal donde podemos observar las funciones que realiza el sistema
Fig. 1 Ventana principal del sistema experto 1. Para realizar el ingreso de libros damos click en el botn <<Ingresar libros>>, se muestra una nueva ventana donde podemos ingresar el nombre del libro, el nombre del autor y podemos escoger la categora a la que pertenece, damos click en el botn <<Registrar libro>>. En la barra de informacin podemos observar el estado del ingreso del libro
Fig. 2 Ventana de ingreso de libros 2. Para solicitar la recomendacin de un libro damos clik en el botn <<Pedir recomendacin>>, se muestra una nueva ventana donde podemos escoger la categora del libro que deseamos y damos click en el botn <<Ver recomendacin>>. En la parte derecha de la pantalla podemos observar la lista de libros recomendados para la categora seleccionada
Fig. 3 Ventana de recomendacin de libros
6. Conclusiones Al finalizar la presente investigacin se puede concluir que: La conexin entre Mysql, Prolog y Netbeans no es compleja, solo debemos configurar la conexin ODBC, agregar las libreras de Prolog en Netbeans y luego realizar las reglas que permitan la conexin con la base de datos , las sentencias SQL y las reglas que permitan realizar la inferencia del sistema experto
El sistema experto desarrollado permite mediante la seleccin de una categora de libros la recomendacin de bibliografa, lo cual conlleva a la reduccin de tiempos de bsqueda manuales sobre los mismos
Mediante la implementacin del presente sistema experto podemos reforzar los conocimientos tericos impartidos en el cuso de Inteligencia Artificial II y asi poder obtener una mejor comprensin de los mismos
7. Recomendaciones: Al concluir la presente investigacin se puede recomendar lo siguiente: El uso de Mysql, Prolog y Netbeans para la realizacin de sistemas expertos, ya que Mysql es un gestor de base de datos muy fcil de usar en Prolog la podemos realizar las reglas y hechos que permiten al sistema experto tomar decisiones, de una manera muy sencilla, y Netbeans es un IDE muy flexible para el desarrollo de interfaces grficas
El sistema experto permite reducir de tiempos de bsqueda sobre libros, y ayuda en la toma de decisiones para la recomendacin de bibliografa
Implementar la parte prctica de la materia mediante la realizacin de sistemas expertos o cualquier otro tipo de sistemas para la comprensin de la parte terica de la misma
8. Bibliografa: La presente investigacin tuvo como principal fuente de informacin las siguientes direcciones web:
9. Anexos Cdigo del archivo de conexin en Prolog abrir_conexion :-odbc_connect('swiprolog', _, [ user(root), %password(root), alias(swiprolog), open(once) ]). cerrar_conexion :-odbc_disconnect('swiprolog'). %Artificio para conseguir la cadena de Insercion para la tabla libros cadenaPH(A,B,C):- concat(A,'","',Z),concat(Z,B,W),concat('INSERT INTO libros(nombre,autor) VALUES("',W,D), concat(D,'")',C). inserta_datos_PH(P,H,X) :-cadenaPH(P,H,Cadena), odbc_query('swiprolog', Cadena, affected(X)). %Obtener el ultimo registro de la base de datos ultimo_ingresado(N) :- odbc_query('swiprolog', 'SELECT MAX(id) FROM libros',row(N)). %Artificio para conseguir la cadena de Insercion para la tabla lib_cat cadena_lib_cat(A,B):- ultimo_ingresado(N), concat(N,'","',Z),concat(Z,A,W), concat('INSERT INTO lib_cat(id_lib,id_cat) VALUES("',W,D), concat(D,'")',B). inserta_datos_lib_cat(H,X) :- cadena_lib_cat(H,Cadena), odbc_query('swiprolog', Cadena, affected(X)). %crea una lista de todos los libros almacenados libros(X) :- odbc_query('swiprolog', 'select nombre,autor from libros', X, [ types([string,default]) ]). %crea una lista de todos los libros almacenados y su categoria libros_y_categorias(X) :- odbc_query('swiprolog', 'SELECT nombre, autor, categoria FROM libros, categorias, lib_cat WHERE libros.id = id_lib AND categorias.id = id_cat ORDER BY categoria ASC', X,[ types([string,string,string]) ]). libros_accion(X) :- odbc_query('swiprolog','SELECT nombre, autor FROM libros, categorias, lib_cat WHERE libros.id = id_lib AND categorias.id = id_cat AND categorias.id=1 ORDER BY nombre ASC', X,[ types([string,default]) ]). libros_ficcion(X) :- odbc_query('swiprolog', 'SELECT nombre, autor FROM libros, categorias, lib_cat WHERE libros.id = id_lib AND categorias.id = id_cat AND categorias.id=2 ORDER BY nombre ASC', X,[ types([string,default])]). libros_fantasia(X) :- odbc_query('swiprolog','SELECT nombre, autor FROM libros, categorias, lib_cat WHERE libros.id = id_lib AND categorias.id = id_cat AND categorias.id=3 ORDER BY nombre ASC', X,[ types([string,default]) ]). libros_historia(X) :- odbc_query('swiprolog', 'SELECT nombre, autor FROM libros, categorias, lib_cat WHERE libros.id = id_lib AND categorias.id = id_cat AND categorias.id=4 ORDER BY nombre ASC', X, [ types([string,default])]). libros_romance(X) :- odbc_query('swiprolog', 'SELECT nombre, autor FROM libros, categorias, lib_cat WHERE libros.id = id_lib AND categorias.id = id_cat AND categorias.id=5 ORDER BY nombre ASC', X,[ types([string,default])]). libros_suspenso(X) :- odbc_query('swiprolog','SELECT nombre, autor FROM libros, categorias, lib_cat WHERE libros.id = id_lib AND categorias.id = id_cat AND categorias.id=6 ORDER BY nombre ASC', X,[ types([string,default]) ]). libros_policial(X) :- odbc_query('swiprolog', 'SELECT nombre, autor FROM libros, categorias, lib_cat WHERE libros.id = id_lib AND categorias.id = id_cat AND categorias.id=7 ORDER BY nombre ASC', X,[ types([string,default])]). libros_misterio(X) :- odbc_query('swiprolog','SELECT nombre, autor FROM libros, categorias, lib_cat WHERE libros.id = id_lib AND categorias.id = id_cat AND categorias.id=8 ORDER BY nombre ASC', X,[ types([string,default])]). recomendacion(A,B,C,D,E,F,G,H,X) :- (A is 1,libros_accion(X));(B is 1,libros_ficcion(X)); (C is 1,libros_fantasia(X));(D is 1,libros_historia(X)); (E is 1,libros_romance(X));(F is 1,libros_suspenso(X)); (G is 1,libros_policial(X));(H is 1,libros_misterio(X)).