"INVESTIGACION SOBRE LA FILOSOFIA Y ASPECTOS TECNICOS DE LENGUAJES DE PROGRAMACION REFERENTES A SISTEMAS EXPERTOS Y DISEÑO DE UN PROTOTIPO ORIENTADO AL AREA DE ORTOPEDIA" TRABAJO DE GRADUACION PREPARADO PARA LA FACULTAD DE INGENIERIA PARA OPTAR AL GRADO DE: INGENIERO EN CIENCIAS DE LA COMPUTACION POR BLANCA LIDIA ALAS CASTRO JOSE EDUARDO PLEITEZ TECUN MARZO-1999 # 9204100 # 9504024 SOY APANGO-EL SAL V ADOR-CENTROAMERICA UNIVERSIDAD DON BOSCO RECTOR ING. FEDERICO HUGUET RIVERA SECRETARIO GENERAL PBRO. PEDRO JOSE GARCIA CASTRO DECANO DE LA FACULTAD DE INGENIERIA ING. CARLOS GUILLERMO BRAN ASESOR DE TRABAJO DE GRADUACION LIC. REINA DE ALV ARADO JURADO EXAMINADOR ING. ANA MERCEDES CACERES LIC. FRANCISCO ANTONIO DIAZ UNIVERSIDAD DON BOSCO FACULTAD DE INGENIERIA DEPARTAMENTO DE INGENIERIA EN COMPUTACION JURADO EVALUADOR DEL TRABAJO DE GRADUACION "INVESTIGACION SOBRE LA FILOSOFIA Y ASPECTOS TECNICOS DE LENGUAJES DE PROGRAMACION REFERENTES A SISTEMAS EXPERTOS Y DISEÑO DE UN PROTOTIPO ORIENTADO AL AREA DE ORTOPEDIA" LIC. REINA DE ALVARADO RECONOCIMIENTOS Las personas que a continuación se mencionan proporcionaron su aporte técnico para la adquisición del conocimiento en el área de ortopedia: • Dra. Canizalez, encargada de atender a los pacientes del ISRI designada por la GTZ. • Ing. Carlos Matios, profesor de la Universidad Don Bosco en el área de ortopedia y técnico protesista del proyecto GTZ. • Ing. Henner encargado del proyecto GTZ. Con la ayuda o el aporte información que estas personas brindaron fue posible la realización del prototipo, que analiza y diagnóstica prótesis para el miembro inferior. AGRADECIMENTOS En primer lugar, doy gracias a Dios, por haberme dado la oportunidad de vivir, guiarme en mi camino, por permitirme lograr una de mis metas ser INGENIERO, la cual ha sido posible con la iluminación y sabiduría que tu me haz brindado. A la virgen por haber sido guía y luz en mi camino. A mis padres: Margarito y Eva por haberme dado la vida, por educarme y guiarme por el buen camino; También les doy las gracias por todos los sacrificios realizados, que Dios los bendiga por siempre. A mis hermanas: Marta y Marianita por haber confiado en mí y darme su apoyo. A mi hermana: Ana María que esta en el cielo por ser mi Angelito. A una familia especial en mi vida: Tía Hilda, José Alberto, Sandra, Manuel, Marielos por darme un espacio en su hogar, porque con el apoyo de ellos se hizo posible terminar una de mis metas, les agradezco mucho por todo lo que han hecho por mí, los quiero mucho que Dios los bendiga. A mis Abuelos: Virginia, Manuel, Laura, Pedro por el apoyo que me han brindado, los quiero mucho que Dios los proteja. 11 A mis Tías: Blanca Rubia y familia, Dominga y familia, Clelian y familia, Ofe y familia, por haberme apoyado, desde la distancia que se encuentran, que Dios las bendiga siempre. A mis seres queridos: Mariana, Manuel, Osear que ya no se encuentran en la tierra, pero que formaron parte de mi educación. A Don Ricardo, Karlita, Lidia, Rector, Candy, Ricardo, Rafael, Valeria, por haberme brindado su apoyo moral, y brindado su confianza que Dios los bendiga. A mis amigas: especialmente Karlita por que siempre me ha brindado su apoyo, comprensión en todo momento, a Sandra, Claudia, Leyla, Karina, Xiomara, Pauly, Yessenia por su constante apoyo e interés que Dios las bendiga. A mi amigo Carlos Quintanilla, aunque ya no se encuentre en este mundo terrenal, se que me ha brindado su apoyo. A José, quien fue mi compañero de tesis, le doy gracias por haberme permitido trabajar juntos, y por haber sido un verdadero compañero. A Lic. Reina de Alvarado: por haber sido una excelente asesora, por su constante empeño brindado. A mis jurados: lng. Cáceres, Lic. Diaz por habemos apoyado. A los que fueron mis profesores: por compartir sus conocimientos. 111 A todas las personas, compañeros, que brindaron su apoyo e información de manera desinteresada. Blanca Lidia Alas. Doy gracias a Dios por haberme permitido lograr una más de mis metas, por haberme iluminado el camino para llegar a este momento tan importante . Le doy gracias a mis padres por haberme traído al mundo, haber confiado en mi, haberme brindado todo su amor y apoyo y haberme dado la oportunidad de realizar mis estudio. De igual forma le agradezco a mi hermana por su cariño y apoyo, y por todo esto y mucho más dedico les dedico este gran triunfo. Agradezco de todo corazón a Mima por la paciencia que tuvo al esperarme todo este tiempo, por haber estado conmigo en las buenas y las malas, por amarme tanto todos estos años y haberse sacrificado conmigo en algunas ocasiones, por todo esto y muchas cosas más le dedico especialmente este triunfo. Agradezco infinitamente a Francisco por su amistad, confianza y por haberme brindado todos sus conocimientos sobre el tema que sin ningún recelo compartió conmigo para enriquecer los míos y así haber podido llegar al final de este camino. Al mono (Nilson) y al pato (Sergio) por su amistad, el apoyo y la confianza que tienen en mí. IV Les doy las gracias a todos mis compañeros de la Super: Einar, Elisa, Karina, Quique, Gaby, Ornar, Fran, Claudia, Ligia, Juan Francisco, Cecy, Angel, Jenny, Milton, Ethel y Cristhy por haber confiado en mi y haberme brindado todo su apoyo. A José Mario, Paty, Ana Daysi, Erika por su amistad y confianza en mi. A Juan Francisco Cardona Conde y Ricardo Herrera por toda la ayuda que me brindaron durante el tiempo que estudiamos juntos en la universidad, por su apoyo y sobre todo por su gran amistad. Gracias amigos. A mis suegros don Luis y Vicky y mis cuñados Adrian y Rebeca por su confianza y preocupación. Finalmente agradezco a todos mis profesores, amigos y compañeros que brindaron su apoyo de manera desinteresada. José Eduardo Pleitez Tecún. V PROLOGO El presente documento constituye el trabajo de graduación denominado "Investigación sobre la Filosofía y aspectos Técnicos de lenguajes de Programación referentes a Sistemas Expertos y Diseño de un Prototipo Orientado al área de Ortopedia". En un inicio se presenta una introducción sobre el trabajo a realizar, luego se presentan aspectos teóricos sobre Inteligencia Artificial, Sistemas Expertos sobre los cuales se dan a conocer su definición, el área donde son aplicados, y la forma de adquisición del conocimiento. A continuación se presentan aspectos generales que deben poseer los lenguajes de programación para Inteligencia Artificial, luego se dan a conocer las metodologías de la investigación que fueron utilizadas. Enseguida se presenta las diferentes técnicas utilizadas, después se presenta la metodología más adecuada para la realización de un Sistema Experto, así mismo se muestra la guía para interactuar con el experto y finalmente se presenta el análisis y diseño del prototipo. VI INDICE CONTENIDO PAGINAS INTRODUCCION ............................................................................................................................... 1 OBJETIVOS ......................................................................................................................................... 3 ALCANCES Y LIMITACIONES ....................................................................................................... 4 CAPITULO I ........................................................................................................................................ 5 ANTECEDENTES ........................................................................................................................... 5 1.1 Situación actual. ....................................................................................................................... 5 CAPITULO II ...................................................................................................................................... 7 JUSTIFICACION ............................................................................................................................. 7 CAPITULO III ..................................................................................................................................... 8 MARCO TEORICO .......................................................................................................................... 8 3 .1 Historia .................................................................................................................................... 9 3 .2 Definición .............................................................................................................................. 1 O 3.3 El área de investigación de la Inteligencia Artificial.. ........................................................... 11 3.4 Subcampos de la Inteligencia Artificial.. ............................................................................... 11 CAPITULO IV ................................................................................................................................... 13 ESTUDIOS SOBRE SISTEMAS EXPERTOS .............................................................................. 13 4.1 Historia sobre sistemas expertos ............................................................................................ 14 4.2 Definición .............................................................................................................................. 17 4.3 Campos de aplicación ............................................................................................................ 17 4.4 Componentes de los sistemas expertos ................................................................................. 18 4.5 Equipo de desarrollo de un sistema ....................................................................................... 18 Vil 4.6 Adquisición y representación del conocimiento .................................................................... 20 4.6.1 Tipos de conocimientos ............................................................................................... 20 4.6.1.1 Nivel Estructural ................................................................................................ 20 4.6.1.2 Nivel heurístico .................................................................................................. 21 4.6.1.3 Nivel Epistemológico ......................................................................................... 22 4.6.1.4 Nivel conceptual. ................................................................................................ 23 4.6.2 Adquisición del conocimiento ..................................................................................... 23 4.6.2.1 Técnicas y métodos de adquisición del conocimiento ....................................... 24 4.6.3 Representación del conocimiento ................................................................................ 25 4.6.3.1 Formalismos de representación del conocimiento ............................................. 26 CAPITULO V .................................................................................................................................... 28 INVESTIGACION DE LOS LENGUAJES DE PROGRAMACION ........................................... 28 5.1 Lenguajes de Inteligencia Artificial. .................................................................................... 29 5.2 Investigación de los lenguajes de programación para sistemas expertos .............................. 38 CAPITULO VI ................................................................................................................................... 55 METODOLOGIAS DE LA INVESTIGACION ............................................................................ 55 6.1 Metodología de la investigación ............................................................................................ 56 CAPITULO VII .................................................................................................................................. 60 PASOS A SEGUIR PARA CONSTRUIR UN PROGRAMA DE INTELIGENCIA ARTIFICIAL EN CUALQUIER AREA DE APLICACION ................................................................................ 60 7.1 Desarrollo de un sistema experto ........................................................................................... 61 CAPITULO VIII ................................................................................................................................ 67 GUIA PARA INTERACTUAR CON EL EXPERTO ................................................................... 67 8.1 Interacción con el experto ...................................................................................................... 68 viii CAPITULO IX ................................................................................................................................... 72 ANALISIS Y DISEÑO ................................................................................................................... 72 9 .1 Análisis del sistema ............................................................................................................... 73 9 .2 Diseño del sistema ................................................................................................................. 7 5 CONCLUSIONES ............................................................................................................................. 80 RECOMENDACIONES .................................................................................................................... 82 APENDICE A .................................................................................................................................... 84 ENTREVISTAS A EXPERTOS ..................................................................................................... 84 APENDICE B .................................................................................................................................... 93 CODIGO FUENTE DEL PROGRAMA ........................................................................................ 93 APENCIDE C .................................................................................................................................. 106 MANUAL DEL USUARIO DEL PROTOTIPO DE SISTEMA EXPERTO .............................. 106 APENDICE D .................................................................................................................................. 122 MANUAL TECNICO DEL PROTOTIPO DE SISTEMA EXPERTO ....................................... 122 GLOSARIO ...................................................................................................................................... 140 BIBLIOGRAFIA .............................................................................................................................. 144 ix INTRODUCCION La Inteligencia Artificial estudia cómo lograr que las máquinas realicen tareas que, por el momento, son realizadas meJor por los seres humanos, y es una rama de la ciencia de la computación que se puede definir como el estudio sistemático del comportamiento inteligente, con el fin de imitar o simular las habilidades humanas mediante la utilización de máquinas y computadoras. Los Sistemas Expertos son uno de los puntos que componen las investigaciones en el campo de la Inteligencia Artificial. Un sistema de computadoras que trabaje con técnicas de Inteligencia Artificial deberá estar en situación de combinar información de forma "inteligente", alcanzar conclusiones y justificarlas. Los Sistemas Expertos son una expresión de los sistemas basados en el conocimiento. Un Sistema Experto es un programa computacional capaz de resolver problemas específicos con una habilidad equiparable a la de los expertos humanos, representan una nueva oportunidad a la computación, abren sendas que hasta la fecha estaban cerradas a aplicaciones específicas y permiten abordar nuevos problemas; además trabajan con una base de conocimiento1, en la cual se almacenan premisas relativas a una cierta área del conocimiento y con un motor inferencial2, que es el cerebro del Sistema Experto, encargado de razonar con la información almacenada en la base del conocimiento. Para el desarrollo de Sistemas Expertos existen lenguajes de programación especializados tales como: LISP, PROLOG, OPS5, VISUAL BASIC, VISUAL FOX, VISUAL C++ y muchos otros que facilitan la representación y manipulación del conocimiento humano. 1 (be) Base de Conocimiento. El propósito de este documento es proporcionar a la persona sin conocimientos previos en el área de Inteligencia Artificial, los conceptos básicos para comprender lo que son los Sistemas Expertos, presentar algunos lenguajes de programación que existen en el medio cuya aplicación es el área de Sistemas Expertos, y presentar el diseño de un prototipo orientado a una aplicación específica del área de ortopedia. 2 (mi) Motor inferencia!. 2 OBJETIVOS 1.1 Objetivo general • Realizar una investigación acerca de los diferentes lenguajes para la creación de Sistemas Expertos y la metodología que se debe seguir para la creación de un prototipo el cual será aplicado al área de ortopedia. 1.2 Objetivos específicos • Investigar cual ha sido la evolución histórica de los Sistemas Expertos desde sus orígenes. • Investigar acerca de los lenguajes de Inteligencia Artificial PROLOG, LISP, Ops5, Visual Basic, Visual fox, Visual C++. • Investigar la filosofía y los aspectos técnicos de los lenguajes antes mencionados. • Presentar el diseño de un prototipo aplicando las técnicas y sintaxis de uno de los lenguajes investigado. • Explicar la forma en que se debe interactuar con un experto para obtener el conocimiento en el área específica de aplicación para que ayude al programador a crear la base del conocimiento. • Explicar cuales son los pasos a seguir para crear un programa experto. • Diseñar un prototipo experto orientado al área de ortopedia. 3 ALCANCES Y LIMITACIONES 2.1 ALCANCES • Investigación de la filosofía y los aspectos técnicos de los lenguajes Prolog, Lisp, Ops5, Visual Basic, Visual Fox, Visual C++. • Aplicar los conocimientos de programación adquiridos a lo largo de la carrera. • Explicar los pasos a seguir para la creación de un prototipo experto. • El prototipo contendrá la información requerida o necesaria para la solución de un problema específico. • Investigación de una técnica de la Inteligencia Artificial, que será la de los Sistemas Expertos. • Presentar las condiciones que deben existir para aplicarse un Sistema Experto. • El trabajo presenta cuales son los distintos lenguajes utilizados en sistemas Expertos, sus características y ventajas. 2.2 LIMITACIONES Una de las características de los Sistemas Expertos es que se basan esencialmente en el conocimiento del experto, por lo que el trabajo se limita: • A la información que el experto considere apropiada para resolver un problema en el campo de actividad específica. • La portabilidad del prototipo dependerá de la versión del software (Shell) que se utilizará para programar. • El diseño del prototipo será únicamente de un área específica de Ortopedia. 4 CAPITULO! ANTECEDENTES 1.1 Situación actual Actualmente los sistemas expertos representan una nueva oportunidad en aplicaciones específicas para resolver problemas complejos, ya que es en estas áreas donde tiene que funcionar un sistema experto. La Inteligencia Artificial es una presencia aparente de experiencias y conocimientos. Se trata de técnicas de solución que son el resultado de la investigación del comportamiento humano. En la actualidad los Sistemas Expertos son una técnica eficaz de solución de problemas, su comunicación con el usuario posee una interfaz amigable, lo que permite que el usuario lo opere con facilidad sin tener mayores conocimientos en el área de computación. En El Salvador los Sistemas Expertos son una de las tecnologías menos utilizadas, ya que el desconocimiento por parte de los posibles usuarios es evidente, como pudo constatarse en las encuestas realizadas a profesionales y estudiantes de diferentes carreras. Estas encuestas arrojaron como resultado que un 20 por ciento de las personas encuestadas han escuchado o tienen conocimientos de alguna aplicación de los Sistemas Expertos en un área específica, por ejemplo se mencionaron áreas como: • área médica: diagnóstico y prescripción de medicamentos • controlar el tráfico inteligente • simulación de diseño de mapas • medidor de caudales de ríos para abrir compuertas de presas 5 • fallas de equipo • robótica en industria automotriz De este 20 por ciento que tienen conocimientos sobre los Sistemas Expertos, todos son graduados en alguna carrera, principalmente en computación, pero con maestrías en el extranjero que es de donde han adquirido ese conocimiento. El resto de los encuestados son estudiantes, los cuales no tienen ningún conocimiento de aplicaciones de los Sistemas Expertos aunque algunos conozcan de la existencia de ellos. Los resultados de la encuesta reflejaron también que la mayoría de las personas desconocen que los Sistemas Expertos son una de las técnicas de la Inteligencia Artificial, la cual presenta grandes oportunidades en cualquiera de las aplicaciones donde supone una descarga del conocimiento del experto en un trabajo rutinario. En la actualidad los pocos Sistemas Expertos que existen en El Salvador están hechos a un nivel de tésis, por ejemplo se puede mencionar el Sistema Experto para la orientación vocacional creado para el sistema de admisiones de la Universidad José Simeón Cañas (UCA). Los ejemplos mencionados anteriormente son ejemplos claros de que la Inteligencia Artificial ha sido poco explorada en el país, esto se debe a que la información que pueda obtenerse es reducida. Unicamente se conocen un par de tesis de la facultad de ingeniería de la Universidad José Simeón Cañas, un par de libros de la biblioteca de la Universidad Don Bosco y algunos cursos que se han organizado sobre el tema, que sirven de apoyo a la institución educativa en sus labores y como apoyo bibliográfico al público en general. 6 CAPITULO 11 JUSTIFICACION Uno de los beneficios que se obtendrán de la investigación, será mostrar que la técnica de los Sistemas Expertos es útil para la solución de problemas de la vida real; no sólo de los países desarrollados sino también en El Salvador. Para esto la población debe tener conocimiento de qué es un Sistema Experto, cuáles son los requerimientos de desarrollo, qué Software se puede utilizar para crear una aplicación orientada a cualquier área donde exista un problema complejo con comportamiento dinámico o explosión combinatoria, donde no resulte posible o rentable una solución convencional de procesamiento de datos. Otro factor de peso es conocer los aspectos de mayor importancia que debe cumplir un lenguaje de programación para Inteligencia Artificial; ya que la función primaria de estos lenguajes es la representación del conocimiento del experto a través de métodos formales de representación, entre estos métodos se encuentran la lógica de predicados. La metodología a presentar tiene como objetivo desarrollar los pasos a seguir para construir un programa de Inteligencia Artificial, en cualquier área de aplicación, debido a que en todo programa se tiene que desarrollar una secuencia lógica a seguir. Estos son los principales beneficios que se desean adquirir u obtener a largo del proyecto de investigación. 7 Inteligencia Artificial CAPITULO 111 MARCO TEORICO Como una introducción a lo que es el desarrollo de Sistemas Expertos es necesario conocer los orígenes de la Inteligencia Artificial y algunos conceptos fundamentales. En los apartados de este capítulo se presenta historia de cómo se inició la Inteligencia Artificial, definiciones, así como sus áreas de investigación, subcampos en que ésta es dividida, también se mencionan sistemas basados en la inteligencia, e inteligencia computacional. 8 3.1 Historia. En el siglo XVIII Wolfgang Von Kemmpelen construyó un autómata jugador de ajedrez que había confundido y asombrado por muchos años a Europa, pero con el tiempo se demostró que se trataba de un fraude porque ocultaba en su interior ingeniosamente a un jugador humano, en esta época no existía la tecnología necesaria para crear una máquina inteligente. No fue hasta el año de 1950 cuando Alan Turing público el artículo llamado "Can a machine think?" (¿Puede una máquina pensar?), pero mientras que su interés en éste era el de un lógico matemático, el de los científicos en computación era mucho más práctico. Al verse que tan fácil podrían utilizarse las computadoras para resolver los problemas que le resultaban demasiado tediosos a los seres humanos, comenzó a especularse si también pudiesen usarse para resolver aquellos que las personas encontraban en extremo difíciles. John McCarthy fue la persona que en 1955 uso el término Inteligencia Artificial para englobar todas las actividades encaminadas a la construcción de sistema inteligentes, aunque él mismo ha opinado que sería mejor utilizar el término Inteligencia Mecánica debido a la mala interpretación que puede hacerse de su significado. McCarthy opina que la finalidad de ésta, es resolver problemas que requieren inteligencia, pero sin obligación de utilizar los mismos mecanismos. A partir de la reunión denominada "Darmouth Summer Resecart Project with Artificial Intelligence" que McCarthy convocó en 1956 en el Darmout College, se configura la Inteligencia Artificial como una de las ramas de la computación con su vida propia, aglutinando un gran número de actividades (robótica, comprensión del lenguaje natural, visión artificial, aprendizaje, programación automática, razonamiento, planificación, resolución de problemas) y con dos filosofías distintas. Una de las corrientes filosóficas es la de McCathy y Minsky en el MIT (Massachussets Institute of Tecnology, Instituto de Tecnología de Massachussets) en la cual pretenden la construcción de 9 máquinas inteligentes, esto significa, sistemas cuyo comportamiento sea como si lo llevase a cabo una persona experta. Y la de Newell y Simon en la Camigie Melon University, dedicados a estudiar modelos de comportamiento humano para construir sistemas inteligentes por emulación del cerebro humano, incluso en su estructura. En 1956 surgieron los primeros programas de Inteligencia Artificial creando programas que jugaban ajedrez y damas, los cuales demostraban teoremas de lógica y geometría, resolviendo integrales y aprendiendo conceptos. El primer logro significativo llego en 1957 cuando Newell, Shaw y Simon crearon un programa llamado GPS (siglas de General Problem Solver, que significa resolvedor general de problemas), con el cual trataron de resolver problemas, aunque no los abarcaron todos. Fue entonces cuando los investigadores de la Inteligencia Artificial añadieron un segundo objetivo a su investigación: descubrir como funciona la mente humana. 3.2 Definición. Existen diferentes definiciones de Inteligencia Artificial entre las cuales se mencionan las siguientes: "La Inteligencia Artificial define las técnicas de la lógica formal, de los nuevos procedimientos y métodos de búsqueda de la base de la representación del conocimiento en programas de ordenador, por otro lado, se define como la presencia aparente de experiencia y conocimiento de causa en programas de ordenador"3. "Es el estudio de cómo hacer que los ordenadores hagan cosas que, en estos momentos hace mejor el hombre"3• 3 Dieter Nebendahl, Sistemas Expertos, Barcelona, Maracombo Boixareu Editores, 1987, cap. 1 10 "Es la capacidad de un ser vivo o de una máquina de ordenar informaciones externas, observaciones, experiencias, descubrir interrelaciones, valorarlas con las informaciones para abstraer de esta forma d 1 l. ,,,3 cosas y po er as 1gar entre s1 . "Estudia como lograr que las máquinas realicen tareas que, por el momento, son realizadas mejor por los seres humanos"4• 3.3 El área de investigación de la Inteligencia Artificial. Aún cuando la Inteligencia Artificial puede ser usada en diversidad de campos, en la actualidad las áreas donde más se ha utilizado es en la psicología, filosofía, informática, y la lingüística. 3.4 Subcampos de la Inteligencia Artificial. La Inteligencia Artificial se divide en varios subcampos entre los cuales se menc10nan los siguientes: Sistemas de lenguaje natural. El sistema de procesamiento de lenguaje natural, es aquel en que parte de la información a procesar está codificada en lenguaje natural y se aplican algoritmos para el análisis sintáctico, y pragmático de la información. Entre las tareas de lenguaje natural de la vida diaria se encuentran: comprensión, generación y traducción. Sistemas reconocedores de imágenes. 4 Elaine Rich. Kevin Knight, Inteligencia Artificial, Segunda Edición, España, Me Graw-Hill, 1994, pág 3 11 En los reconocedores de imágenes debe identificarse el significado de imágenes con ayuda de procesos exactamente definidos. El tratamiento de imágenes abarca todos los procesos de cálculo para la manipulación de datos aportados por los mismos, en especial, solo de aquellos que tratan una imagen para obtener otra, por ejemplo: filtrado, asilado, aumento del contraste, correcciones geométricas y eliminación de errores. Robótica. Los robots han ocupado siempre la fantasía de muchas personas. Sin embargo, los robots de las modernas plantas industriales de producción desempeñan actividades monótonas y repetitivas según un plan de acción previamente fijado con exactitud. Con las técnicas de Inteligencia Artificial se intenta que el comportamiento de los robots sea más inteligente. Sistemas Expertos. Los Sistemas Expertos buscan almacenar el conocimiento de expertos para un campo de especialidad determinada y estrechamente delimitada, y así solucionar un problema mediante la deducción lógica. Representan la transición del procesamiento de datos al procesamiento de conocimientos y sustituyen al mismo tiempo los algoritmos por mecanismos de inferencia. Los Sistemas Expertos encuentran aplicaciones donde haya conocimientos especializados y experiencias, y no resulte posible o rentable una solución convencional de procesamiento de datos. Estos sistemas utilizan métodos de representación y modelación del conocimiento en problemas de búsqueda en espacios de estados, métodos de inferencia y automatización del razonamiento, demostración automática de teoremas en lógicas de orden supenor y métodos formales para verificación, síntesis y transformación. Se trabaja sobre el impacto de estos métodos de representación y razonamiento en el diseño de agentes inteligentes. 12 CAPITULO IV ESTUDIOS SOBRE SISTEMAS EXPERTOS Sistemas expertos La evolución histórica de Sistemas Expertos, conceptos básicos, campos de aplicación, sus componentes esenciales son tratados en este apartado. Se presenta además una ampliación sobre la base de conocimientos, el mecanismo de inferencia, el componente explicativo, la interfase de usuario, el componente de adquisición, y del equipo o las personas que participan en el desarrollo del Sistema Experto. 13 4.1 Historia sobre sistemas expertos. Los Sistemas Expertos son una rama de la Inteligencia Artificial, nacieron en los laboratorios de Universidad de Stanford en la década de 1960 para ayudar a diagnosticar infecciones en la sangre; desde entonces los Sistemas Expertos se han movido virtualmente dentro de cada profesión que requiere de juicio humano. En 1964 Joshua Lederberg, profesor de genética en la Universidad de Stanford, diseñó un programa para enumerar las configuraciones posibles, pero válidas de un determinado conjunto de átomos. Denominó a su programa DENDRAL, que es una abreviatura de DENDRitic Algoritmo ( algoritmo dendrítico). El proyecto DENDRAL tuvo por objetivo formular hipótesis acerca de la estructura molecular de un compuesto. Hoy en día DENDRAL no es solo un programa sino una familia de programas donde el algoritmo original esta en el centro de la familia y los demás programas ampliaron significativamente su poder. La importancia del DENDRAL creció con gran rapidez, de tal manera que en 1983 se construyó una compañía independiente para su construcción y mejoramiento. DENDRAL buscó soluciones en la dirección contraria a la que siguieron todos los demás sistemas, es decir que este proyecto buscaba métodos específicos dependientes del campo de actividad. Este cambio de dirección fue bautizado por el profesor Feigenbaum como "cambio de paradigma de Inteligencia Artificial" donde se sustituyeron las técnicas basadas en el poder por otras basadas en el conocimiento, estableciendo las bases de los sistemas expertos. En la década de 1970 se desarrolló el sistema experto llamado MICIN, cuyo propósito era ayudar al médico, quien tenia 4 decisiones por tomar: si el paciente sufre de alguna infección bacteriana, qué organismo es el causante, qué fármacos podrían ser adecuados, cuáles de ellos administrar. 14 La forma de trabajo es la siguiente: con base a los datos del paciente y a los resultados del análisis, llega a una conclusión para cada una de las cuatro preguntas. Posteriormente nació PROSPECTOR, el cual fue diseñado para ayudar a los geólogos en la búsqueda de depósitos de minerales y en la evaluación del potencial mineralógico de grandes zonas geográficas. Estos sistemas fueron considerados como los modelos intelectuales de los sistemas expertos. En el área de ortopedia se han diseñado algunos sistemas expertos, entre los que podemos menc10nar: • Sistema de computadora interactivo para almacenaje, búsqueda de datos clínicos estandarizados, y material asociado con los implantes ortopédicos, desarrollado en Septiembre de 1981 en la ciudad de COOK SD, este sistema fue diseñado por IRAP y se construyó para ser ocupado por personal sin entrenamiento en computación. • Sistema para producir una intraoperatibilidad personalizada de prótesis del fémur desde medidas tomadas durante un procedimiento quirúrgico, desarrollado en diciembre de 1989, el cual fue elaborado por personas pertenecientes al departamento de cirugía ortopédica de la Universidad Katholieke, en Leuven, Bélgica. Sistema que fue desarrollado para permitir al cirujano crear una prótesis en cualquier cavidad femoral lo que permite un implante mientras la operación esta en progreso utilizando una computadora técnica mecánica. • CAPP (Computer Assisted Preoperative Planning), es un sistema experto utilizado en la cirugía ortopédica para el planeamiento del tratamiento quirúrgico, creado en junio de 1990 en el hospital ortopédico del colegio médico de la Universidad de Zegreb en Yugoslavia. • CAD-CAM, desarrollado en 1992 para el reemplazo total de la cadera. Este sistema fue alimentado con un conocimiento básico que se refería al factor de el proceso de diseño. Era un programa de computadora que había sido provisto con reglas de diseño pre-programadas. Este 15 Sistema Experto contribuyó a personalizar las implantaciones ortopédicas de cadera hechas en el departamento de lng. Biomédica del Instituto Ortopédico, en Stanmore en Middlesex. • El 1994 fueron desarrollados dos planes de cirugía para la compleja reconstrucción en un caso de cirugía ortopédica. El objetivo era comparar la ventaja y limitaciones del método común utilizando radiografías bidimencionales, comparadas con el uso del software llamado MCAE (Mechanical Computer Assisted Engineering) utilizando rayos "X", y datos de una topografía computarizada. • CAD-CAM, desarrollado en 1997 y es utilizado en Alemania para los implantes de Titanium para la reconstrucción del defecto craneal y craneofacial. Se han publicado varios artículos sobre uso de los sistemas expertos en el área ortopédica, a continuación se presentan los siguientes: • En Octubre de 1986 es publicado un artículo sobre simulación ortopédica mediante microcomputadoras el cual fue hecho por Samuels H. Este artículo trata sobre el significado de adaptar material gráfico para mejorar los esfuerzos de la educación ortopédica utilizando el microcomputador. • En 1995 Diener P., Burgun A., Cleret M., Le Beaux P., pertenecientes al departamento de informática médica de la Universidad Hospital Pountchaaillou, en Francia publicaron un artículo titulado "La Representación del Conocimiento en Ortopedia", desde el modelo conceptual hasta el nomenfactural utilizando Orthanay. Este sistema es una construcción basada en conocimiento para la codificación de los registros en los pacientes. 16 4.2 Definición. Un Sistema Experto se entiende como un nuevo tipo de software que imita el comportamiento de un experto humano en la solución de un problema. Pueden almacenar conocimientos de expertos para un campo determinado y solucionar un problema mediante deducción lógica de conclusiones. 4.3 Campos de aplicación. La aplicación de Sistemas Expertos es adecuada donde los expertos disponen de conocimientos complejos en un área estrechamente delimitada, donde no existan algoritmos elaborados o donde los existentes no puedan solucionar algunos problemas y no existan teorías completas. La siguiente tabla nos da una visión de los campos de aplicación en diferentes sectores: Aplicación de los Sistemas Expertos según los sectores5: ~ Banca Industria Comercio Cargos Estatales Seguros Servicios p -Observación de -Control de procesos. - Observación de - Control de Control de tendencias -Gobierno de tendencias. centrales nucleares procesos de procesos. o de grandes redes supervisón - A viso de estados de (agua, gas) excepción. -Configuración. - Requisitos de - Redes de Diseño -Instalaciones fabriles. productos. distribución -Diseño de productos. (correos, energía) -Concesión de -Motivo de fallo. -concesión de -Diagnóstico créditos. -Mantenimiento. créditos. médico Diagnóstico -Comprobación de -Cálculo de riesgos. (hospitales). hipotecas. -Diagnóstico -Análisis de técnico. siniestros. -Economía energ energética. -Análisis de -Funciones lógicas de -Análisis de riesgos. -Planificación de riesgos. proyectos. -Análisis del inversiones. Planificación -Gestión de valores. - Proyectos. mercado. -Planificación de - Planificación de emergencias. inversiones. Planificación de la distribución. 5 Dieter Nebendahl, Sistemas Expertos, Barcelona, Maracombo Boixareu Editores, 1987, pág. 30 17 ~ Banca Industria Comercio Cargos Estatales Seguros Servicios n -Asesoramiento de -Asesoramiento de -Asesoramiento de -Asesoramiento de Asesoramiento clientes. clientes. clientes. clientes. -Servicios especiales. -Formación de -Formación de -Formación de -Formación interna Formación colaboradores. colaboradores. colaboradores. en cuestiones -Formación de -Formación del jurídicas. servicio exterior. servicio exterior. 4.4 Componentes de los sistemas expertos. Se presentan a continuación los componentes esenciales del Sistema Experto: La Base de Conocimientos: Esta contiene el conocimiento de los hechos y de las experiencias de los expertos en un dominio determinado. Mecanismo de Inferencia: Permite simular la estrategia de solución de un experto. Componente Explicativo: Explica al usuario la estrategia de solución encontrada y el porqué de las decisiones tomadas. La Interfase de Usuario: Sirve para que éste pueda realizar una consulta en un lenguaje lo más natural posible. Componente de Adquisición: Ofrece ayuda a la estructuración e implementación del conocimiento en la base de conocimientos. 4.5 Equipo de desarrollo de un sistema. Las personas que participan en el desarrollo de un Sistema Experto desempeñan tres papeles distintos los cuales se mencionan a continuación: 18 El experto: Esta es la persona que pone sus conocimientos especializados a disposición del Sistema Experto. El ingeniero del conocimiento: Es la persona que plantea preguntas al experto, estructura sus conocimientos y los implementa en la base de conocimientos. El usuario: Es la persona que aporta sus deseos y sus ideas, determinando especialmente el escenario en el que debe aplicarse el Sistema Experto. El usuario debe disponer de un conocimiento especializado lo suficientemente amplio sobre el entorno en el cual trabaja para poder manejar el Sistema Expertos. RELACION ENTRE EL EQUIPO DE DESARROLLO DE UN SISTEMA EXPERTO6 Ayudan a crear la base de conocimientos del Sistema Experto, uno extrayendo la información y el otro proporcionándola Realiza consulta al sistema a través de la interfase Aporta sus deseos e ideas para la construcción del sistema 6 Dieter Nebendahl, Sistemas Expertos, Barcelona, Maracombo Boixareu Editores, 1987, pág. 40 19 4.6 Adquisición y representación del conocimiento Considerando los sistemas expertos desde la perspectiva del mgemero de sistemas, se pueden enfocar dos problemas específicos que presentan, los cuales surgen del hecho de que estos sistemas incorporan conocimientos. Uno de ellos es el problema de cómo obtener este conocimiento, o sea el problema de la adquisición del conocimiento; el otro es como codificar y almacenar este conocimiento, o sea el problema de la representación del mismo. La adquisición y representación del conocimiento es un proceso global que depende del tipo o nivel de conocimiento que se tenga y sobre la base de esto se determinan las técnicas y métodos a utilizar para la adquisición y representación de este conocimiento. Para el desarrollo del sistema es necesario identificar los tipos o niveles de conocimientos que existen para determinar que técnica o método utilizar. 4.6.1 Tipos de conocimientos. Existen cuatro tipos o niveles de conocimientos: estructurante, heurístico, epistemológico y el conceptual. 4.6.1.1 Nivel Estructural En este nivel se representa el "esquema" mental del experto y contiene básicamente la clasificación de las principales entidades que intervienen en el dominio del problema, dichas entidades pueden ser objetos, acciones, situaciones, y otros. De igual forma este tipo de conocimiento posee básicamente las relaciones entre estas entidades. Aquí se conforma la base del conocimiento de cualquier experto y define el mecanismo que genera la certeza y varia de acuerdo con el campo de experiencia. Así, por ejemplo, en mecánica o geología, las evidencias no son del mismo orden, los procedimientos de valoración son distintos y las vías de acceso a la certeza varían. 20 Con este tipo de conocimiento un experto toma una cierta actitud ante un problema cuyos pasos lógicos se podrían describir de la siguiente forma: en primer lugar el experto se percata de que le llega mucha información de la cual realiza un análisis y concluye dos cosas, una es que no toda esa información es útil y la otra es que puede faltar información relevante y en último lugar se da cuenta que no necesita prestar mucha atención a cierta clase de información. Esta actitud lo lleva a resolver el problema de una forma rápida y generando buenos resultados. 4.6.1.2 Nivel heurístico La solución completa de un problema requiere en muchos casos del análisis exhaustivo de todas las posibilidades hasta encontrar la solución. Este proceso es llamado "explosión combinatoria" y lleva mucho tiempo, es por eso que el experto utiliza heurísticas adquiridas a partir de la propia experiencia del experto dando la solución de los problemas que le conciernen. Asépticamente una heurística sería cualquier cosa que sirva para reducir el espacio de búsqueda, es muy intuitiva y su calidad depende de la habilidad de los expertos para identificar factores relevantes ponderándolos con su importancia relativa e interrelacionandolos adecuadamente y es por eso que se constituyen como la característica principal del conocimiento del experto. Es sano aclarar que no necesariamente una heurística conduce a una solución óptima. Una heurística debe ser sencilla y fácil de explicar, además debe poseer una probabilidad alta de solución próxima al optimo y una posibilidad baja de llegar a una solución pobre. El conocimiento en este nivel se corresponde a procedimientos rutinarios ligados a técnicas estándar o de trabajo, muchos de los cuales no están en manuales y constituyen una parte importantísima de la experiencia, así como a reglas practicas utilizadas por el experto en la realización de su tarea. 21 4.6.1.3 Nivel Epistemológico Este nivel viene condicionado ( o se deriva) por las cuatro I (Incertidumbre, Incompletitud, Inconsistencia e Impresisión), que aparecen en todo el conocimiento que, naturalmente, se utiliza en entornos del mundo real. La Incertidumbre se produce porque los datos, en los que se basan los razonamientos son inciertos es decir, son verdaderos o falsos, pero no hay forma de saberlo, o porque las reglas de inferencia se obtienen directamente de la experiencia o son heurísticas y, por lo tanto, no completamente fiables. La forma de tratar la Incertidumbre es a través de factores o coeficiente de certidumbre. La Incompletitud se presenta debido a que no todo lo pertinente al caso en curso puede observarse o recopilarse, o porque no existen suficientes recursos para efectuar todas las deducciones potencialmente interesantes, o porque aun las teorías del mundo solo son aproximaciones. Esto implica la exigencia de razonar en base a suposiciones. La forma de tratar la Incompletitud es asociando respuestas por omisión a ciertas cuestiones. La Inconsistencia surge, en parte, por el manejo de la Incompletitud, por ejemplo, al pasar por alto una omisión, lo que provoca una contradicción, y, en parte, porque la información puede proceder de fuentes contradictorias; y, también, porque a veces el razonamiento es no-monótono. La forma de tratar la Inconsistencia es a través del mantenimiento de una red de dependencias entre los hechos que luego pueden emplearse para restablecer la consistencia y a través del razonamiento desde distintos puntos de vista. Las expresiones son imprecisas, borrosas, vagas o, aun, difusas, si en ellas no se define exactamente al menos alguna de las variables que engloban. Algunas de las expresiones que presentan estas característica son aquellas cuantificadoras tales como: algo, mucho, la mayoría, y otros. La forma de tratar la imprecisión es a través de la lógica difusa. 22 4.6.1.4 Nivel conceptual. Estos modelos conceptuales pueden verse como una descripción abstracta de cómo un experto resuelve un problema y los tipos de conocimientos necesarios para resolver estos. En efecto, el conocimiento acerca del mundo real implica relaciones causales, temporales y espaciales; y si es acerca de las personas, que se mueven y actúan en este mundo, implica creencias, motivaciones, planes, etc. La conceptualización no es fácil porque los modelos científicos tienen una cantidad ilimitada de conocimientos demasiados finos. Lo que implica desarrollar teorías, de sentido común o cualitativas, tanto para el entorno como para las personas. Además debería ser adecuada para que sirva de base a los procesos de razonamiento y su conocimiento asociado, puestos en practica por el experto, esto implica explosión combinatoria. También representa el modelo del mundo real, del dominio global de aplicación que tiene el experto. En este tipo de conocimiento intervienen cuestiones espaciales y temporales aparentemente fuera del problema. 4.6.2 Adquisición del conocimiento La adquisición de conocimientos es el proceso de conformar el contenido de conocimientos de los sistemas expertos, la denominada base de conocimientos. Se trata de un proceso que se lleva a cabo a través de toda la duración del sistema. Abarca varias tareas de: obtener conocimientos, organizarlos, codificarlos, validarlos y ponerlos a punto. Durante la obtención del conocimiento se deben efectuar varias operaciones de las cuales las más importantes son : 23 • Extraer el conocimiento exteriorizándolo, de tal manera que permanezca disponible para su inspección y manipulación. • Volverlo explícito acumulando suficientes detalles para hacerlo claro y darle plena expresión. • Registrarlo de manera simbólica. • Verificarlo comparando la forma simbólica con el enunciado y la intención originales. La obtención proporciona elementos aislados de conocimiento que deben organizarse en un todo unificado. La cantidad de organización necesaria depende muchísimo de la forma en que se obtenga y utilice la base de conocimientos. 4.6.2.1 Técnicas y métodos de adquisición del conocimiento. Diferentes niveles de conocimientos implican diferentes técnicas y métodos de adquisición del conocimiento. En este sentido se listan a continuación estas técnicas y métodos por tipo o nivel de conocimiento: Técnicas en el nivel estructurante: En este nivel de conocimiento son utilizadas las entrevistas, las cuales no deben ser estructuradas, con el propósito de identificar a los expertos, ver la idoneidad de la tecnología, establecer necesidades de los usuarios, familiarizar al ingeniero del conocimiento con el dominio, producir información para la base de conocimiento y ayudar al diseño del sistema. Estas entrevistas deben de tratar sobre tareas que son conocidas, para familiarizar al ingeniero del conocimiento con el dominio del problema y producir información para la primera base de conocimiento. Además deben de tratar de obtener información limitada y acerca de restricciones de procesos con el propósito de determinar las estrategias de razonamiento y heurísticas. También se utilizan técnicas automáticas tales como: la técnica de la inducción y la del cluster. 24 Técnicas para el nivel heurístico: Al igual que en el nivel estructurante, en este se utilizan entrevistas no estructuradas que buscan extraer información limitada y sobre restricciones de proceso; la diferencia es que estas tratan sobre tareas especiales y además buscan extraer información de "casos correosos", es decir flexibles y elásticos. Técnicas para el nivel epistemológico: En este nivel son utilizadas únicamente las entrevistas estructuradas para la obtención de conocimientos. Técnicas para el nivel conceptual: Este tipo de conocimiento es obtenible como consecuencia de la integración de los distintos tipos de conocimiento. Se intenta en la ultima fase del desarrollo de un sistema experto y el método básico es el de entrevistas estructuradas, claramente asociado al proceso de validación y refinamiento. La estructura conceptual se hace común y esto debe conseguirse en base a la equivalencia de los formalismos de representación del conocimiento que veremos en la siguiente sección. 4.6.3 Representación del conocimiento Para el procesamiento y la manipulación del conocimiento, en Sistemas Expertos es necesano formalizar y estructurar dicho conocimiento. En su mayor parte, se dispone del conocimiento a través de entrevistas con los expertos en forma de descripciones de casos o en partes de su actividad. Los métodos formales de representación del conocimiento son distintos aspectos de la lógica; por ejemplo, lógica de predicados, lógica modal, lógica multivaluada y lógica difusa. Estos métodos formales y matemáticos no son, sin embargo, imprescindiblemente métodos auxiliares apropiados para comunicarse con expertos de los más diversos sectores especializados. 25 Por ello se han desarrollado procedimientos de representación del conocimiento que pueden ofrecer un apoyo eficiente a la estructuración y al procesamiento del saber. Se trata aquí de: • Reglas de producción: que se basan en la lógica de predicados, una descripción del saber en forma de reglas "sí ..... , entonces ... ". • Redes semánticas: que son una representación gráfica del saber sobre objetos y sus relaciones. • Frames (marcos): son estructuras de datos para la representación de objetos. • Factores de certeza: los cuales son factores arbitrarios de valoración que suelen encontrarse casi siempre dentro de los limites de -1 a + l. Por ejemplo podría determinarse que el - 1 podría ser "seguro que no", el - 0.5 "probablemente no", el O "desconocido", el+ 0.5 "probablemente si" y el+ 1 "seguro que sí". El ámbito de valores dentro de solución elegido es continuo. La base de estos procedimientos, sea en la representación o en el procesamiento del conocimiento, es en cierta manera el cálculo de predicados, que es la deducción lógica de resultados que mediante el cumplimiento de determinadas condiciones puede extraerse una deducción lógica. La solución puede tener el valor de "verdadero" o "falso". 4.6.3.1 Formalismos de representación del conocimiento Según el nivel de conocimiento se adecuan unos formalismos mas que otros, así: En el nivel estructurante se utilizan las reglas de producción y los frames o marcos. Las reglas de producción se utilizan en el nivel heurístico. En el nivel epistemológico son utilizadas las redes semánticas, los factores de certeza y otros. Al igual que en el nivel heurístico, en el nivel conceptual son utilizadas las reglas de producción. 26 METODOS Y TECNICAS DE ADQUISICION DEL CONOCIMIENTO l ESTRUCTURAN1E HEURISTICO EPISIBMOLOGICO MARCOS 27 CAPITULO V INVESTIGACION DE LOS LENGUAJES DE PROGRAMACION Investigación de los lenguajes de programación referentes a sistemas expertos. En este capítulo se presentan los aspectos más importantes que debe cumplir un lenguaje de programación de Inteligencia Artificial. Inicialmente se realiza una breve explicación acerca del entendimiento de un lenguaje y los diferentes niveles de abstracción que posee, luego se mencionan los requerimientos específicos que debe tener un lenguaje para que pueda ser utilizado en la programación de Inteligencia Artificial. Finalmente se presentan las generalidades de algunos lenguajes de programación para la Inteligencia Artificial tales como: Visual C++, Visual Basic, Visual Fox, PROLOG, LISP, OPS5, y otros. 28 5.1 Lenguajes de Inteligencia Artificial. La función primaria de un lenguaje de Inteligencia Artificial es la de implementar la representación y las estructuras de control necesarias para la computación simbólica. Un lenguaje de Inteligencia Artificial es el encargado de la representación del conocimiento, y no solamente debe expresar el conocimiento requerido para una aplicación, sino que también debe ser conciso, modificable y computacionalmente eficiente y debe asistir al programador en la adquisición y organización de la base del conocimiento. Teóricamente, cualquier programa de computadora puede ser escrito en cualquier lenguaje de programación. La programación de Inteligencia Artificial típicamente requiere capacidades para el procesamiento simbólico, procesos de inferencia asociadas con los lenguajes, tipo de datos interactivos y sobretodo, flexibilidad. Los lenguajes para la construcción de programas de Inteligencia Artificial tienen la capacidad para que tome precaución del procesamiento computacional de bajo nivel, de esta manera permite al desarrollador enfocarse en el requisito de complejidad. Los programas de Inteligencia Artificial trabajan con conceptos expresados en palabras, frases o sentencias. Por lo tanto la habilidad del manejo de datos simbólicos ( es decir, no numérico) es una característica importante para desarrollar un sistema de Inteligencia Artificial. Un programador intenta de numerosas maneras implementar cada función componente. En vez de ir a través de un ciclo largo de edición-compilación-depurador para examinar cada versión de una función, un lenguaje de Inteligencia Artificial debería permitir al programador ver rápidamente los resultados de una nueva idea, esta característica de programación de direccionamiento interactivo son necesitados en un lenguaje. El programador no puede anticipar el tipo exacto o la cantidad de datos que fluye a través de un programa, entonces la mayoría se adapta en el camino, por lo tanto un lenguaje debe 29 incorporar estructuras flexibles de datos que permite que esto pase de manera fácil y natural. Muchos tipos de procesos de inferencia, recurren todo el tiempo a aplicaciones de Inteligencia Artificial, es así como un lenguaje que tiene uno o más de estos procesos construidos internamente pueden ahorrar tiempo y esfuerzos. Muchos de los algoritmos y estructuras de datos utilizados para implementar lenguajes de Inteligencia Artificial son comúnmente técnicas de la computación tal como arboles binarios y tablas. Todo lenguaje de programación posee ciertos niveles que son llamados niveles de abstracción, los cuales son herramientas esenciales para entender el comportamiento y la organización de sistemas complejos. Estos niveles pueden ser representados en forma jerárquica tal y como se muestran en la figura 1, donde se observa que el nivel de conocimiento ( el cual es el que le compete primordialmente a los lenguajes de Inteligencia Artificial) están en el nivel superior y por lo tanto engloban al resto de niveles. De este esquema podemos señalar otra característica importante, que es la consulta a la base del conocimiento. Los usuarios generalmente ignoran la representación utilizada en el nivel de símbolos y están interesados solamente en el conocimiento del sistema y en la habilidad para resolver sus problemas, es decir que la forma en que el lenguaje opera internamente es totalmente transparente al usuario. De forma similar, en la construcción de la base del conocimiento, el programador es sabedor de las representaciones utilizadas en el nivel de símbolos, pero usualmente ignoran los niveles bajos del sistema. La importancia de estas distinciones es que permiten al usuario o al programador ignorar la complejidad escondida en los niveles bajos. 30 Nivel de Conocimiento Nivel de Símbolo Nivel de Algoritmo y Estructura de Datos Nivel de Lenguaje de Programación Niveles de Lenguaje Ensamblador, Microcódigo, Instrucciones de Máquina, y Hardware FIGURA 1: niveles de abstracción Para seleccionar un lenguaje de programación con las características expuestas anteriormente básicamente debe poseer los siguientes requerimientos: • Soporte de computación simbólica. • Flexibilidad de control. • Soporte de metodología de programación exploratoria. • Asignación tardía y propagación de limitaciones. • Una clara y bien definida semántica. • Soporte de computación simbólica. Los tipos y operaciones de datos numéricos enfatizados por los lenguajes de programación tradicionales, no se adaptan bien para la implementación de algoritmos de búsqueda o para la 31 implementación de lenguajes que representen la Inteligencia Artificial. En lugar de esto, un lenguaje de programación de Inteligencia Artificial debe simplificar la creación de estructuras de símbolos de cualquier tipo y las operaciones en estas estructuras. Este es el requerimiento fundamental para un lenguaje de programación de Inteligencia Artificial. Un lenguaje de Inteligencia Artificial hace uso de dos poderosas herramientas para la creación de estructuras de símbolos. Una de ellas es el cálculo del predicado, el cual se basa en el álgebra booleana; la lógica booleana es una herramienta poderosa para la construcción de descripciones cualitativas de dominios. La otra herramienta son las listas, las cuales son una secuencia de elementos en la cual cada elemento puede ser incluso otra lista o un símbolo atómico (único). El poder de las listas es en gran parte el resultado de su habilidad para representar cualquier estructura simbólica, sin hacer uso de su complejidad, dimensionalidad o de las operaciones que soporta. • Flexibilidad de control. Otra distinción del comportamiento inteligente es su flexibilidad. Realmente, críticos de la Inteligencia Artificial han argumentado que la inteligencia no puede ser llevada a cabo por la ejecución paso a paso de secuencias de instrucciones fijas exhibidas por los programas tradicionales de computadoras. Afortunadamente esta no es la única forma para la computadora. Uno de los más viejos y más importantes paradigmas para la construcción de programas de Inteligencia Artificial es el sistema de producción. En un sistema de producción, el programa es un conjunto de reglas que son ejecutadas en un orden determinado por el modelo de datos en una instancia de un problema dado. Las reglas de producción pueden respaldar virtualmente en cualquier orden a una situación dada. De esta manera, un sistema de producción puede proveer la flexibilidad y la coherencia requerida para un comportamiento inteligente. 32 Mientras la Inteligencia Artificial utiliza un número diferente de estructuras de control, muchas de ellas están relacionadas con sistemas de producción, y virtualmente todas ellas involucran modelos de pareamientos. Los modelos de dirección de control, permiten que el conocimiento sea aplicado oportunamente en respuesta a las características de una instancia particular de un problema. Los modelos de pareamiento determinan cuando las características de la instancia de un problema, son similares a un trozo de programa de conocimiento, seleccionando ese conocimiento para aplicarlo al problema. Es importante que un lenguaje de Inteligencia Artificial provea esto directamente o simplifique el desarrollo de los modelos de dirección de control. • Soporte de metodología de programación exploratoria. Los problemas a los que se direcciona la Inteligencia Artificial no siempre responden a algunos planteamientos estándar del software de ingeniería, tal como el diseño top-down, el refinamiento sucesivo y el desarrollo de programas desde especificaciones detalladas formales. Debido a la naturaleza variada de los problemas de Inteligencia Artificial, rara vez es posible dar una correcta y completa especificación de la forma final de un programa de Inteligencia Artificial antes de construir al menos un prototipo. Frecuentemente nuestro entendimiento del problema, el cual el programa trata de solucionar, cambia a través del curso del desarrollo del programa. Las razones para que esto ocurra se mencionan a continuación: • La mayoría de los problemas de Inteligencia Artificial son en un m1c10 pobremente especificados. • Las aproximaciones tomadas para solucionar problemas tienden a ser de un dominio especifico. • Los métodos heurísticos son inherentemente empíricos. • La programación basada en el conocimiento parece ser fundamentalmente incremental por naturaleza. 33 Por estas razones, la programación de Inteligencia Artificial es inherentemente exploratoria. El programa es frecuentemente el vehículo a través del cual nosotros exploramos el problema y descubrimos las estrategias de solución. El reto de la programación de Inteligencia Artificial es el de encontrar formas de realizar programación exploratoria que sea eficiente, sistemática y bien estructurada. Entre las características que un lenguaje de programación exploratoria debe tener, se encuentran las siguientes: • Modularidad y modificalidad de código. Es importante que un lenguaje para la programación exploratoria soporte modificaciones frecuentes de su código. Esto implica que el problema debe consistir de pequeños y bien limitados trozos de código más que de grandes cuerpos de código complejo. Esta interacción entre los componentes de un programa deben estar limitados y claramente definidos. Esto incluye revisar efectos laterales y variables globales y asegurarse que el rol de cualquier trozo en la ejecución del programa es fácilmente determinado. • Extensibilidad y soporte de lenguajes. La programación exploratoria procede del bottom-up, con estructuras de alto nivel emergiendo al mismo tiempo del desarrollo del código de un programa. Frecuentemente, mientras no es posible especificar la forma final de un programa de Inteligencia Artificial, es posible determinar las estructuras de alto-nivel útiles para la exploración del ámbito del problema. Estas estructuras pueden incluir modelos de pareamiento, controles de búsqueda y funciones para definir un lenguaje de representación. Esencialmente este enfoque dice "si no se puede determinar la estructura final que un programa va a tener, intente definir las construcciones de lenguaje que ayudan a desarrollar esa estructura". 34 Para soportar esa metodología, un lenguaje de programación debe ser fácilmente extensible y debe simplificar el desarrollo de interpretes. Por extensibilidad, nos referimos a la habilidad de definir nuevas construcciones de lenguaje con la máxima libertad y flexibilidad. Una vez definido, estas construcciones creadas por el usuario se comportan exactamente igual que los componentes construidos internamente del lenguaje. El ingeniero del conocimiento programa estos lenguajes extendiendo sus capacidades básicas desde abajo hacia arriba, hasta que la solución sea alcanzada. En este sentido los programas tradicionales son "construidos", pero los programas de Inteligencia Artificial van "creciendo". • Existencia de construcciones útiles de alto nivel. La programación es asistida por la existencia de poderosas construcciones de alto nivel en el lenguaje. Estas construcciones poderosas pero en general abstractas permiten al programador desarrollar rápidamente estructuras específicas y especializadas para la representación del conocimiento y control de programa. • Soporte de prototipo de funciones y objetos. Otra metodología importante de la programación exploratoria es el prototipo de funciones y objetos. Aquí, el programador construye una solución al problema y la utiliza para explorar el espacio del problema. Una vez se ha explorado el problema y delimitado una estrategia de solución viable, se desecha el prototipo y se construye un programa final que enfatiza la eficiencia y certeza de la implementación. Las estructuras y los métodos que proveen los lenguajes de Inteligencia Artificial aumentan la velocidad de desarrollo de prototipos. • Legibilidad y documentación de programas. Debido a que la mayoría de los programas de Inteligencia Artificial son modificados extensiblemente a través de su tiempo de vida, es importante que el código sea legible y bien 35 documentado. Mientras que no haya un substituto para los comentarios claros en lenguaje natural, los lenguajes de Inteligencia Artificial por tener código altamente modular compuestos por estructuras de alto nivel, simplifican grandemente esta meta. • Interpretación versus compilación. En un principio la mayoría de los lenguajes de Inteligencia Artificial eran interpretes en lugar de compiladores durante el desarrollo del programa. Esto significa que el programador no tenía que esperar largas recompilaciones cada vez que el código era cambiado. Pero desde que la interpretación de código se ejecutan lentamente, los lenguajes de Inteligencia Artificial modernos incluyen facilidades de depuración y rastreo; además siguen haciendo uso de la interpretación de código y permiten la compilación de versiones finales de programas. • Software soportado por la programación exploratoria. Los lenguajes de Inteligencia Artificial modernos incluyen diversos ambientes de programación, proveyendo herramientas para rastrear la ejecución ya sea de todos los programas o secciones de programas. Los depuradores permiten al programador avanzar a través de la ejecución del programa incrementalmente, para cambiar temporalmente el valor de las variables de programa o incluso el código del mismo, para insertar puntos críticos que obligan a detener la ejecución de programas en puntos pre-específicos y congelar el ambiente de ejecución en el punto donde un error es detectado y así examinar el estado del mismo. En adición, muchas implementaciones de lenguajes incluyen editores inteligentes que muestran los errores de sintaxis como si el código estuviese siendo escrito. Debido a la complejidad de los programas de Inteligencia Artificial y la dificultad de predecir el comportamiento de la mayoría de los regímenes flexibles de control como los sistemas de producción, lo importante de estas características no se debe pasar por alto. 36 • Asignación tardía y propagación de limitaciones. La propagación de limitaciones es una metodología importante de programación de Inteligencia Artificial que debe ser soportado por un lenguaje de implementación. Frecuentemente los problemas direccionados por programas de Inteligencia Artificial requieren que los valores de ciertas entidades permanezcan desconocidos hasta que la suficiente información ha sido reunida para determinar asignamiento. Esta información tiene que ser vista como una serie de limitaciones en los valores que una variable pueda asumir. Así como las limitaciones se van acumulando, el conjunto de posibles valores se va reduciendo, hasta que se convierta en soluciones que satisfagan todas las limitaciones. Un simple ejemplo de este enfoque, puede ser visto en un Sistema de Diagnóstico Médico que reúne información acerca de los síntomas del paciente hasta que las posibles explicaciones van siendo reducidas a un solo diagnóstico. La analogía de esta metodología a los lenguajes de programación es la variable explícitamente ilimitada mientras es manipulada en el código del programa. Esto permite la fácil y natural implemetación de propagación de limitantes. • Una clara y bien definida semántica. Los lenguajes de Inteligencia Artificial comparten con los lenguajes de programación orientados al desarrollo de largos compiladores y un sistema realizable, la necesidad de una clara y bien definida semántica. Desafortunadamente, lenguajes de programación como Fortran y Pascal tienden a tener definiciones de semántica complejas y difíciles. Este defecto puede ser relacionado con el hecho de que estos lenguajes son esencialmente caracterizaciones de alto nivel de la arquitectura fundamental de la computadora de Van Newman y heredan muchas complejidades de ese sistema físico. Desde que los lenguajes de Inteligencia Artificial han sido basados en formalismos matemáticos como la lógica o en la teoría de funciones recursivas, estos tienden a tener semántica simples, heredando bastante el poder rotacional de elegancia de la matemática formal. Esto hace que estos lenguajes 37 sean particularmente útiles para búsqueda en áreas como implementación de lenguajes de representación del conocimiento, formalizando el proceso de desarrollo de código, proveyendo programas correctos y automatizando la generación de código eficiente desde especificaciones formales. Estas áreas de búsqueda requieren que la semántica de los lenguajes de programación sean claramente y formalmente especificadas. También debe ser notado que aunque la función de la mayoría de los programas de Inteligencia Artificial es altamente compleja, el código que implemente esa función debe esforzarse por la simplicidad y claridad. 5.2 Investigación de los lenguajes de programación para sistemas expertos Antes de que existieran sistemas expertos, sistemas inteligentes adaptables o cualquier otro tipo de programa capaz de funcionar con inteligencia artificial, se necesitó otro tipo de programa capaz de funcionar con inteligencia artificial, se necesitó crear los lenguajes para desarrollarlos. Para ello, se consideraron algunos requerimientos básicos como la posibilidad de procesar símbolos de todo tipo y la capacidad de hacer inferencias asociadas con el lenguaje, todo dentro de un ambiente flexible que permitiera escribir el programa de forma interactiva. Para crear programas inteligentes, existen lenguajes "viejos" como el EIFFEL, LISP, LOGO, OPS, PROLOG; los no tan "viejos" como DYLAN, FORTH, VISUAL BASIC,VIASUAL C, VISUAL FOX, entre muchos otros más. Cada uno trabaja de forma distinta: algunos utilizan vectores, objetos (aglomeraciones de software) o lógica, lo que los hace mejor capacitados para diversas tareas. 38 PROLOG • Soporte de computación simbólica: Los programas en PROLOG son colecciones de hechos descriptivos acerca de un dominio y reglas para la derivación de conclusiones desde aquellos hechos. Ya que PROLOG esta basado en una concisa notación matemática, los programas tienden a ser compactos, capturando el conocimiento para la solución de problemas en unas pocas oraciones. Por ser una implementación de la lógica formal, PROLOG es algunas veces utilizado directamente como un lenguaje de representación en el nivel de simbolos. De cualquier forma, su verdadero poder es como un lenguaje para la implementación de representaciones más complejas y especializadas tales como estructuras (frames) y redes en una forma concisa y sistemática. Muchas estructuras del nivel de simbolos son facilmente construidos utilizando construcciones de alto nivel de PROLOG. • Flexibilidad de control: En PROLOG la unificación y los algoritmos de busqueda están construidos dentro del lenguaje mismo, es simple el construir cualquier régimen de control de modelos de direccionamiento: la primera busqueda profunda (depth-first) dada por omisión y otros regímenes tales como la primera busqueda a lo ancho (breadth-first search) o la primera-mejor busqueda (best-first search) deben ser construidas con pocas lineas de codigo. • Soporte de metodologías de programación exploratorio: • Modularidad y modificalidad del código: En PROLOG la unidad básica de un programa es la regla; estas reglas, al igual que las funciones de LISP, tienden a ser pequeñas y especializadas. Desde que el alcanze de las variables en PROLOG es siempre restringido por una simple regla y el lenguaje no permite variables 39 globales, la modificalidad es simplificada. PROLOG ofrece facilidades de rastreo, los cuales, cuando se combinan con una clara estructura de programa, simplifica el asignamiento de las culpas y los créditos en la depuración. • Extensibilidad y soporte de lenguajes: PROLOG simplifica la escritura de interpretes. Provee esta capacidad a través de los llamados "meta-predicados" (meta-predicates), los cuales son predicados para la manipulación de otros predicados de PROLOG, nuevamente simplificando la escritura de interpretes arbitrarios. Al igual que con LISP, un gran numero de lenguajes para Inteligencia Artificial de alto nivel han sido construidos sobre PROLOG utilizando esta metodología. • Existencia de construcciones útiles de alto nivel: PROLOG ha seguido siendo un pequeño lenguaje comparativamente, en parte por ser novedoso y por su compromiso de ser compacto y simple. De cualquier modo, PROLOG permite a sus usuarios crear sus propias librerías de predicados especializados, y las más útiles de estas librerías han encontrado su camino dentro de las implementaciones estandar. • Asignación tardía y propagación de limitaciones: PROLOG permite que variables sean definidas y manipuladas con ilimitaciones explicitas, mientras se están definiendo las relaciones y las dependencias entre esas variables y otras unidades de programa. Esto permite la fácil y natural implementación de la propación de limitaciones. • Generalidades: PROLOG es considerado como la puerta de los lenguajes de programación ya que soporta razonamiento simbólico formal, haciendo teóricamente posible "computadoras inteligentes" que pueden entender el lenguaje humano y diagnosticar enfermedades médicas. 40 El primer programa fue escrito en Marsella Francia, a prmc1p10s de 1970 corno parte del entendimiento natural. El fondo teórico del lenguaje PROLOG tiene raíces antiguas, especialmente en el trabajo de Kowalsky, Hayes y otros. La primera versión de PROLOG fue desarrollada por los años 1975-1979 en el departamento de Inteligencia Artificial de la Universidad de Edinburgh por David H. D. Warren y Fernando Pereira. Ellos introdujeron el primer interprete robusto de PROLOG. PROLOG puede se ejecutado en los siguiente entornos: Sistema Operativo DOS, Windows 3.1, Windows 95, Windows NT. Además actualmente se estan desarrollando versiones para la plataforma Machintoch. LISP • Soporte de computación simbólica: Una herramienta importante para la construcción de estructuras simbólicas es la lista. Una lista es una secuencia de elementos en la cual cada elemento puede ser, ya sea otra lista o un símbolo atómico. El poder de las listas es el resultado de su habilidad para representar cualquier estructura de símbolos, a pesar de su complejidad, dirnensionalidad o las operaciones que soporte. • Flexibilidad de control: LISP no provee directamente un algoritmo de modelo de parearniento (rnatching), pero lo sofisticado de sus facilidades de computación simbólica y la fácil extensibilidad, del lenguaje lo hacen simple para escribir modelos de parearniento e interpretes de arbitraria complejidad y organización. Una ventaja de esta aproximación es que el modelo de pareamiento y las 41 estructuras de control asociadas pueden ser fácilmente hechas a la medida para responder a las demandas de un problema en particular o una representación. • Soporte de metodologías de programación exploratoria: • Modularidad y modificalidad de código Los programas de LISP son escritos como colecciones de funciones individuales; en un programa de LISP bien escrito, cada función es pequeña y ejecuta una sola y bien definida tarea. Así, es usualmente simple el localizar y corregir la causa de cualquier deficiencia. El parametro que es pasado y las reglas de alcance de las variables de LISP, incluso sirven para reducir los efectos laterales de las funciones. Las variables globales, mientras son soportadas por el lenguaje, son evitadas en un buen código de LISP. • Extensibilidad y soporte de lenguajes: LISP simplifica la escritura de interpretes, en él, tanto los programas como los datos son sintácticamente representados como listas, esto lo hace muy fácil para escribir programas que manipulen el código de LISP como si fueran datos, simplificando grandemente el desarrollo de interpretes. Muchos lenguajes de Inteligencia Artificial que son importantes, tanto históricamente como comercialmente, tales como Planner, Rosie, Kec y Ops fueron escritos sobre estas capacidades de LISP. • Existencia de construcciones útiles de alto nivel: En LISP, esto incluye el tipo básico de datos, la lista, la cual permite la construcción de estructura de datos arbitrariamente complejas, tan buenas como las funciones poderosas para definir operaciones en estas estructuras. Dado que LISP es extensible y ha sido utilizado por muchas décadas, las más generales y poderosas de estas funciones definidas por el usuario se han convertido en características estandar del lenguaje. La mayoría de LISPs, han evolucionado 42 dentro de esta moda para incluir, literalmente, cientos de funciones para la creación estructuras de datos, construir interfaces de usuario, rastreo de la ejecución de programas y edición de las estructuras de LISP. • Asignación tardía y propagación de limitaciones: LISP se comporta de la misma forma que PROLOG en este requerimiento. • Generalidades: LISP fue inventado por John McCarthy a finales de 1950. El lenguaje fue pasado originalmente como un modelo de computación alternativo, basado en la teoría de funciones recursivas. En un principio, MaCarthy (1960) especificó sus objetivos: crear un lenguaje simbólico computacional más bien que numérico computacional; para implementar un modelo de computación basado en la teoría de funciones recursivas, para proveer una clara definición de la sintaxis y semántica del lenguaje, y para demostrar formalmente la perfección de este modelo computacional. LISP es un acrónimo para "LISt Processing". LISP es uno de los más viejos lenguajes que aun existen, originalmente fue un lenguaje bastante simple y pequeño, consistiendo de funciones para la construcción y acceso a listas, definiendo nuevas funciones. LISP puede ser ejecutado en varios entornos tales como: Sistema Operativo DOS, Windows 3.1, Windows 95. LENGUAJES ORIENTADOS A OBJETOS: • Soporte de computación simbólica: Los programas escritos en lenguajes orientados a objetos, cumplen con este requerimiento fundamental para la programación de Inteligencia Artificial, al hacer uso de listas y arboles binarios para la representación de estructuras simbólicas; así como de técnicas y métodos de la 43 teoría de programación orientada a objetos. No todas las estructuras simbólicas pueden ser representadas a través de estos elementos que proporciona el lenguaje, pero el programador puede hacer uso de las ventajas que los objetos poseen para construir nuevos métodos que sean capaces de realizar las operaciones internas con las que deben ser tratadas las estructuras simbólicas y también puede construir nuevas estructuras independientes y cuyos comportamientos esta regido por los métodos, así como los lenguajes tradicionalmente utilizados para Inteligencia Artificial ofrecen estructuras y procedimientos prefabricados que las manipulan. • Flexibilidad de control: Los lenguajes orientados a objetos, ofrecen flexibilidad de control al momento de manipular las estructuras que permiten modelar la representación de conocimiento, entre ellos, algoritmos de búsqueda, algoritmos de indexación. En ningún momento las herramientas de estos lenguajes ocupan una secuencia fija de pasos a seguir, sino que estos pasos los lleva a cabo mediante la invocación de métodos a través del paso de mensajes entre objetos. • Soporte de metodología de programación exploratoria • Modularidad y modificalidad El código en estos lenguajes frecuentemente puede ser modificado, ya que este es escrito en pequeños trozos y no como un gran cuerpo complejo. La facilidad que presentan estos lenguajes al permitir la modularidad, es que se puede tener un control mas completo de lo que cada trozo de código va a realizar y así, es usualmente más fácil el localizar y corregir deficiencias. • Extensibilidad y soporte de lenguajes 44 Los lenguajes orientados a objetos, por su naturaleza son extensibles ya que poseen la habilidad de definir nuevas construcciones de lenguaje, es decir, que permiten definir fácilmente nuevos objetos. • Existencia de construcciones útiles de alto nivel La programación a través de lenguajes orientados a objetos permite construcciones poderosas de alto nivel al hacer uso de los objetos. El usuario puede desarrollar rápidamente estructuras especificas que se comportarán de la misma forma con las ya existentes. • Una clara y bien definida semántica En los lenguajes orientados a objetos existe una clara y bien definida semántica, es decir, que utilizan de una forma coherente las estructuras proporcionadas por el lenguaje. VISUALC++ • Generalidades: Visual C++ es un programa desarrollado por Microsoft. Ofrece una nueva forma de crear aplicaciones de Windows ya que combina la potencia de la programación orientada a objetos. Visual C++ crea aplicaciones del mundo real para Windows, utilizando una amplia gama de ejemplos de código fuente. Este lenguaje de programación puede ser ejecutado en cualquiera de los entornos que se detallan a continuación: • Windows 3. l. • Windows95. El compilador de Visual C++ puede procesar tanto código fuente en C como también código fuente en C++. El compilador tiene capacidad de determinar cual es el lenguaje en cuestión examinando la extensión de nombre de archivo del código fuente. 45 El enlazador de Visual C++ procesa archivos con extensión OBJ que produce el compilador. El compilador de Visual C++ opera ya sea en modo compilador o en modo ligar. En modo Ligar, el archivo con extensión RES se fusiona con un archivo ejecutable ( es decir, con extensión EXE). Si después es utilizado un archivo RES se puede volver a ligar al archivo EXE sin tener que volverlo a enlazar. VISUAL BASIC • Generalidades: Visual Basic es una de las meJores y sencillas herramientas para crear una aplicación en Windows, independiente de la experiencia que posea el usuario en programación o en el manejo de Windows. El proceso se realiza con una velocidad notable. Visual Basic es una herramienta para el desarrollo de software con aplicaciones de bases de datos, creada por Microsoft, con un soporte en la programación orientada a objetos. En la creación de un programa en Visual Basic, el primer paso fundamental consiste en plantearse la presentación del programa y el diálogo entre hombre y máquina. El trabajo con Visual Basic no se inicia con un editor de programas, sino con el diseño de interfaz del programa. Luego de establecer los elementos fundamentales de entrada y salida se procede a la programación paso por paso de las funciones. Visual Basic esta diseñado para direccionar aquellos requerimientos únicos para la integración de todas las herramientas de soporte necesitados, para el desarrollo, depuración, integración y soporte de sistemas. Visual Basic es ejecutado en cualquiera de los siguientes entornos: • Windows 3 .1 46 • Windows para trabajo de grupo (si se va a usar la versión 16 bits de Visual Basic y se esta limitado al desarrollo de programas de 16 bits). • Windows 95 (para crear aplicaciones de 16 y 32 bits). • Windows NT 3.51 (con al menos 8 megabytes de memoria). Cuando se ejecutan aplicaciones en Visual Basic no se compila su código. En otras palabras no traduce a un lenguaje de máquina, en vez de eso simboliza o lo traduce a un formato interno más compacto y fácil de manipular. VISUALFOX • Generalidades: Visual Foxpro es una herramienta para el desarrollo de software con aplicaciones de bases de datos, creada por Microsoft, con soporte en la programación orientada a objetos, que es la principal característica que lo diferencia de versiones anteriores. Algunas áreas de Visual Foxpro han quedado prácticamente intactas de su predecesor Foxpro 2.6 para Windows. El diseño de pantallas o formularios en Visual Foxpro es radicalmente diferente. Da a los desarrolladores las herramientas necesarias para el manejo de datos, organizar tablas de información y correr consultas creando un sistema de base de datos relacionales (DBMS) o la programación de una aplicación de manejo de datos para usuarios finales. Visual Foxpro es un entorno de desarrollo para escribir aplicaciones de bases de datos. Proviene de la generación Xbase, de lenguajes de programación que incluyen dBase III, Foxbase, Foxpro. Visual Foxpro es un lenguaje de programación con soporte en la programación a objeto, la cual es un mejor sistema para el desarrollo de aplicaciones. Una de las mejoras que se obtienen con el uso de la programación orientada a objetos es el permitir afrontar programas más complejos y de 47 mayor tamaño con menos esfuerzos. Además, meJora considerablemente el rendimiento de desarrollo. También otorga una gran flexibilidad y es más sencillo para realizar mantenimiento en los programas. Existen varios ambientes dentro de los cuales puede ejecutarse Visual Foxpro, entre los cuales se pueden mencionar: • Windows 3 .x. • Windows 95. • Windows NT. Cuando se ejecutan aplicaciones en Visual Foxpro no se compila su código, en otras palabras no traduce a un lenguaje de máquina; en vez de eso simboliza o lo traduce a un formato interno más compacto y fácil de manipular. DYLAN • Generalidades: DYLAN es un nuevo lenguaje dinámico orientado a objetos (OOAL), que fue desarrollado por APPLE. Este lenguaje tiene la meta de desarrollar una herramienta práctica para la escritura de las principales aplicaciones comerciales. Su propósito es la de combinar las mejores cualidades de los lenguajes estáticos (pequeños programas rápidos) con las mejores cualidades de los lenguajes dinámicos (rápido desarrollo, código que es fácil de leer, escribir y mantener). Difiere de Visual C++ en muchas maneras importantes que lo hacen poderoso y flexible. DYLAN incluye numerosas características que lo distinguen de Visual C++ tales como: • Manejo automático de memoria. • Sintaxis clara y consistente. 48 • Modelo total y consistentemente orientado a objetos. • Soporte de compilación incremental. • Funciones y clases de primera clase. Los programas de DYLAN son modulares. Este sistema modular soporta múltiples interfaces con control preciso sobre importaciones y exportaciones, así los clientes están garantizados que verán solamente aquellos objetos que son apropiados. El objetivo actual de DYLAN son las plataformas de Windows 95 y Windows NT, para los cuales provee compilación nativa, soporte de OLE y COM. Implementaciones para otras plataformas serán anunciados dentro de poco tiempo. DYLAN no provee una nueva plataforma o soporta el menor denominador común a través de las plataformas. En lugar de esto, DYLAN provee herramientas para el total acceso a la plataforma en la cual es el anfitrión. DYLAN tiene la meta de crear código bastante portable, a través del uso de abstracciones de alto nivel. DYLAN ayuda también al WEB como un lenguaje poderoso para implementar utilitarios de Server y como un lenguaje de alto nivel para implementar partes de Active X. DYLAN fue diseñado para que fuera de propósito general. Lenguaje totalmente orientado a objetos para utilizar en sistemas, aplicaciones y componentes de programación. El lenguaje fue diseñado para ser simple y poderoso, internamente consistente y de grandes características. Todos los datos en los programas que están corriendo son objetos, incluyendo clases, funciones, métodos y números. Todos los objetos son instancias de clases, todos pueden ser pasados a métodos, almacenados en variables, etc. DYLAN utiliza tipos de inferencia para compilar objetos en mas tipos primitivos, por medio de eso logra la eficiencia sin alterar el modelo objeto. 49 DYLAN es un lenguaje seguro, no hay apuntadores explícitos, las operaciones son chequeadas antes de ser ejecutadas (en tiempo de compilación o en tiempo de corrida). En general DYLAN garantiza que el modelo objeto no es violado por algunas cosas como referencia a arreglos prohibidos. DYLAN utiliza una sintaxis basada en expresiones fáciles de leer que enfatizan el uso de palabras, como el que se necesita para crear código claro. La mayoría de los programadores tienen pocos problemas en entender el código de DYLAN, incluso cuando no están familiarizados con el lenguaje. DYLAN toma ventaja de la garantía de sus directivas para compilar estáticamente código orientado a objetos. Esto da como resultado un código nativo eficiente, sin necesidad de sacrificar el diseño pero orientado a objetos. Este compilador optimiza tanto el espacio como la velocidad. EIFFEL • Generalidades: EIFFEL es un lenguaje avanzado orientado a objetos creado en 1985 por Bertrand Meyer. Nombrado en honor a Gustavo EIFFEL, el ingeniero de diseño que diseño la torre EIFFEL, EIFFEL fue desarrollado por interctive Software Engineering (ISE) de Gotelg, California. Es un avanzado lenguaje de programación orientado a objetos, que enfatiza el diseño y el desarrollo de la calidad y la realización del software. A diferencia de Visual C++, este lenguaje no esta basado en la extensión de cualquier otro lenguaje. EIFFEL restringe prácticos peligros de generaciones previas de lenguaje, incluso establece una interface con otros lenguajes tales como C, C++, 50 Visual C. EIFFEL acoge el concepto del "Diseño por Centrado" para la realización correcta del software. EIFFEL esta basado en varios conceptos: • Herencia múltiple, incluyendo redefinición, indefinición, recomendación, selección. • Asesorías para escribir, depurar y documentación del software automáticamente • Desarrollo parecido al que entra en el ciclo de vida entero, desde el análisis y diseño de alto nivel hasta la implementarción y el mantenimiento. • Clases, sirviendo tanto para la estructura de módulo como para el tipo de sistema • Herencia para la clasificación, tipo, subtipo y rehuso de software • Manejo de excepciones para recobrarse de los estados no planeados EIFFEL es totalmente portable, es adaptable sobre muchas plataformas con completa fuente de compatibilidad. Es decir que la misma semántica puede ser soportada en diferentes plataformas. EIFFEL puede ser utilizado en diferentes áreas, ha sido probado exitosamente en grandes proyectos orientados a objetos, tales como: Finanzas, Telecomunicaciones, CAD-CAM, CASE, educación, etc. Utiliza técnicas de compilación usando C como el lenguaje intermediario y generador de ejecutables cuyas velocidades se equiparen o excedan a C o FORTRAN. FORTH • Generalidades: Fue creado por Charles Moore entre 1960 y 1970 para dar a los computadores control en tiempo real sobre el equipo astronómico. Un numero variado de características de FORTH (incluyendo su estilo interactivo) lo convierte un lenguaje útil para la programación de Inteligencia Artificial, y algunos devotos han desarrollado sistemas expertos y redes neurales basadas en FORTH. 51 Dos grupos gubernamentales (The Form Interest Group y The Institute for Applied FORTH Research) ayudaron a promocionar el lenguaje. Dos libros escritos por Brodie ( 1984, 1987) son quizás las mejores presentaciones de FORTH que se conocen, y un articulo de Sperry (1991), es un vistazo corto y bien informado. Las funciones en FORTH son llamadas "palabras". El programador utiliza las palabras empotradas de FORTH para crear otras nuevas y almacenarlas en el "diccionario" de FORTH. En un programa de FORTH, las palabras pasan información hacia otra colocando datos en (y removiendo datos de) una "pila", una estructura de Software en la cual el ultimo elemento en entrar es el primero en salir. Utilizando una pila de esta forma, permite a FORTH correr aplicaciones rápidas y eficientemente. LOGO • Generalidades: Ideado a finales de 1960 por Popert y sus colegas en el MIT (Massachussets Institute, Instituto de Massachussets) como una ayuda educacional para niños. LOGO es un subconjunto de LISP y puede ser usado como un serio lenguaje de programación. LOGO es compacto, y esto lo hace un excelente vehículo para le exploración de la Inteligencia Artificial en una PC. Una versión de LOGO existe virtualmente para la mayoría de las marcas de las computadoras personales con versiones en la mayoría de los casos etiquetados por el fabricante de la computadora. LOGO es mejor conocido por sus gráficos; el usuario programa un cursor (llamado un "Turtle") para dibujar figuras en la pantalla. Dentro de los gráficos, LOGO tiene un gran numero de funciones de manipulación de listas ( en una sintaxis que es mas amigable que la de LISP) que lo 52 hacen ideal para aplicaciones de la Inteligencia Artificial y también posee funciones de generación de números aleatorios que lo hacen controlable para simulaciones. OPS • Generalidades: A los científicos de la Universidad de Carnegie-Melloon, Herbert Simon y Allen Newell, investigaron los procesos de resolución de problemas humanos por muchas décadas. Una de sus ideas, el sistema de producción, representa al conocimiento como un conjunto de reglas de condición y acción (también llamadas reglas "If-then"). Si las condiciones para una regla eran sofisticadas, ocurría una acción especificada por la regla. A finales de 1970, Charles F orgy desarrolló OPS5, un lenguaje de programación que incorpora esta idea. El sistema de producción vino a ser la metodología dominante de la representación del conocimiento en Sistemas Expertos, y OPS5 vino a ser el más popular entre los desarrolladores de Sistemas Expertos. Las reglas en OPS5 son totalmente independientes una de otra, ellas pueden ser colocadas en la memoria de producción en cualquier orden. Si los datos en la memoria de trabajo encajan con las condiciones de una regla en la memoria de producción, la acción de la regla toma lugar. Posibles acciones incluyen la modificación desplegada en la pantalla, y llamadas a programas externos. En algunas versiones del lenguaje, las acciones de las reglas pueden causar que se creen nuevas reglas, permitiendo el desarrollo de sistemas que aprenden. El mecanismo de inferencia construido internamente de OPS5, el forward chaining (encadenamiento hacia delante) comienza de un conjunto de datos que se incrementan en la memoria de trabajo, causando una secuencia de reglas que están siendo aplicadas hasta que la meta es alcanzada. El otro procedimiento de inferencia de Sistemas Expertos es el backward 53 chaining ( encadenamiento hacia atrás), en el cual una meta es alcanzada causando submetas o se satisface hasta que una solución al problema es encontrada. 54 CAPITULO VI METODOLOGIAS DE LA INVESTIGACION Metodología de la investigación. El capítulo presenta la tipología de investigación que se ha realizado, la cual en un inicio se realizó llevando a cabo una investigación exploratoria, a continuación se llevo a cabo una investigación de tipo descriptiva. Además se describen las diferentes técnicas utilizadas para la adquisición del conocimiento, así como la metodología de desarrollo que comprende el análisis y el diseño del prototipo. Finalmente se describe la herramienta de programación bajo la cual se ha desarrollado el software. 55 6.1 Metodología de la investigación 6.1.1. Tipo de investigación. Para el desarrollo de la investigación se realizaron diferentes metodologías, las cuales se describen a continuación: 6.1.1.1 Estudio Exploratorio. Un estudio exploratorio fue necesario en la etapa inicial del proyecto, mediante la técnica de la encuesta, para llegar a identificar el grado de conocimiento sobre la inteligencia artificial y los sistemas expertos, tanto de las personas que estudian computación como de los que se han preparado en áreas afines, e identificar en que áreas son más utilizados los Sistemas Expertos. El resultado que arrojo este estudio es que un 80 % de las personas encuestadas no tenían conocimiento de la existencia de la inteligencia artificial y por consiguiente no habían escuchado el termino Sistemas Expertos, el 20 % que teni