Conceptos: La implementación de la IA y Lisp
Escrito en la categoría Conceptos de la IA
1 de Agosto del 2009
Abrimos esta cadena de posts con la siguiente pregunta: ¿cómo aplico a algo inteligencia?.
Bueno, por pasos: primero tendremos que disponer de algo a lo que se pueda aplicar inteligencia. Por hacerlo sencillo, vamos a suponer una simple aplicación de escritorio. Después tendremos que tener claros los objetivos que queremos que esa aplicación cumpla, y esto es un paso muy laborioso, porque además debemos conocer bien la tecnología para no pensar cosas utópicas, y elegir los caminos más acertados. Una vez tenemos claros los objetivos, si conocemos bien la tecnología, deberemos diseñar una solución, es decir, deberemos pensar de qué forma esta aplicación va a tomar decisiones “inteligentes”. Puede que nos suponga incluir algoritmos de búsqueda, puede que tengamos que aplicar conceptos de lógica, y probablemente tendremos que tratar con datos, con lo cual también sería interesante presentar tales datos del modo más cómodo que nos convenga.
Y una vez nos encontramos con un diseño hecho, pues sólo nos quedará implementarlo. ¿Qué lenguaje es el más adecuado?.
Con la pregunta ya planteada, vamos a pasar a responderla, puesto que es bien sencillo: en general, no hay un lenguaje óptimo para cualquier tarea que conlleve utilización de técnicas de IA. Si vamos a desplegar la aplicación en un robot, pues probablemente C o Ada sean los lenguajes que más beneficios puedan aportarnos, pero por las peculiaridades de los lenguajes en sí y no porque nos provean de soluciones de IA de forma directa; por eso esta decisión engloba muchos factores que deben ser discutidos por expertos en tal área.
Si hablamos de aplicaciones de escritorio, como en el ejemplo de arriba, con un lenguaje de alto nivel (como pueda ser C++, Java, o C#/.NET) puede ser suficiente, puesto que supondrá aplicar algoritmos con una fuerte fuente matemática.
La gracia viene cuando necesitamos manejar datos a la vez que construcciones programáticas que operen dichos datos, y cuando debemos realizar esto de una forma continuada y masiva. Esto de manejar datos, operándolos, modificando ciertos atributos, mezclándolos, etc, pues suena a sistema experto, ¿no? Si recordamos, un sistema experto se centraba en un dominio de conocimiento para resolver problemas asociados a tal dominio. Para este fin, este sistema debe manejar datos del entorno, datos que le introduzcamos, y los irá operando para hallar una respuesta o un conjunto de éstas.
Además, podemos entender que casi cualquier aplicación a la que queramos dotar con técnicas de IA va a tener ciertos módulos que manejen datos como si de un sistema experto se tratase (probablemente sea así), y es precisamente aquí donde introducimos Lisp.
; ---FACTORIAL----
;Definición matemática
; Factorial(x) = 1 si x=0 caso base
; x*factorial(x-1) si x>0 caso recursivo
;Función factorial hecha con recursividad no final
(defun factorial (n)
(if (= 0 n)
1 ; caso base
(* n (factorial (- n 1))))) ; caso recursivo
(factorial 4) ;esto nos devolvería 24=4*3*2*1
Lisp es un lenguaje de programacion de alto nivel y declarativo, que data del 58, diseñado por John McCarthy en el MIT, y desarrollado precisamente para facilitar las tareas en las que es abrumadora la necesidad de cruzar datos con operaciones, y modificar éstos segun muchísimos criterios para obtener una salida, que a su vez pasará por otra operacion que hará que estos datos… etc, etc. Es un lenguaje cuya estructura fundamental es la lista, y es precisamente este hecho el que facilita ciertas tareas, y por lo que ha sido usado ampliamente desde sus inicios para la IA. Detallar más explícitamente por qué es apto para ese tipo de aplicaciones es una tarea difícil de realizar; el fin del post era arrojar algo de luz sobre aspectos de más bajo nivel de la IA (como es su implementación), comentar qué herramientas se utilizan en algunos casos, puesto que como es de esperar, herramientas para la IA hay infinitas, así como lenguajes, técnicas, etc.
….Esperando comentarios de cualquier tipo…
