¿Es Lisp un lenguaje de programación ampliamente utilizado en IA?

En las décadas de 1970 y 1980, Lisp era el lenguaje mejor desarrollado y más utilizado que ofrecía el siguiente conjunto de características:

  1. Creación dinámica fácil de nuevos objetos, con recolección automática de basura,
  2. Una biblioteca de tipos de colección, que incluye listas de tamaño dinámico y tablas hash,
  3. Un ciclo de desarrollo que permite la evaluación interactiva de expresiones y la recompilación de funciones o archivos mientras se ejecuta el programa,
  4. Compiladores bien desarrollados que podrían generar código eficiente,
  5. Un sistema macro que permite a los desarrolladores crear un nivel de abstracción específico de dominio en el que construir el siguiente nivel.

Estas cinco características son valiosas para la programación en general, pero especialmente para problemas exploratorios en los que la solución no está clara al inicio; por lo tanto, Lisp fue una gran opción para la investigación de IA. Con los años, estas características comenzaron a migrar a otros idiomas, y Lisp ya no tenía una posición única; hoy, (5) es la única característica restante en la que Lisp sobresale en comparación con otros idiomas.

Hoy en día, hay muchos grupos que son una programación muy productiva en Lisp; Estaba visitando la Universidad Northwestern; Son un buen ejemplo. Pero la mayoría de los proyectos de IA usan otros lenguajes, como Java, C ++ y Python; o paquetes matemáticos como Matlab o R.

La mayor parte del trabajo de IA en la actualidad involucra modelos probabilísticos como redes neuronales, SVM, modelos gráficos probabilísticos, etc. La mayoría de estos modelos se basan en algoritmos de optimización numéricos. Lisp tiene poca ventaja sobre otros lenguajes para implementar este tipo de algoritmos. La multiplicación de matrices en Lisp no se ve mejor que en C (posiblemente se ve peor).

El factor más importante en la implementación de algoritmos numéricos es generalmente la velocidad, por lo que generalmente se implementan mejor en lenguajes compilados de bajo nivel como C o C ++ que le dan al desarrollador el máximo control sobre el uso del código y la memoria. También se pueden obtener importantes beneficios de rendimiento descargando estos cálculos a procesadores especializados como GPU y estos deben programarse en un lenguaje tipo C (es decir, OpenCL).

LISP vino de un proyecto en Rand de Newell, Simon y Shaw llamado Logic Theorist . Habían desarrollado un lenguaje llamado IPL (lenguaje de procesamiento de información). IPL era básicamente un lenguaje ensamblador para manipular listas de datos, un procesador de listas. Usaron esto para probar teoremas de Principia Mathematica de Whitehead y Russell, que en sí mismo era una forma de expresar teoremas matemáticos como un conjunto de símbolos lógicos que podrían manipularse para probar el teorema. Era la creencia de que podían expresar un conjunto de axiomas y reglas de inferencia que probarían todas las matemáticas, y que serían una forma de resolverlas lógicamente. Esto crearía un sistema axiomático computable. Whitehead y Russell pensaron que revolucionarían las matemáticas con esto, y eso parecía en ese momento (1913-1915) y Russell fue un gran impulsor del sistema, pero Kurt Gödel rompió su burbuja en 1931 con sus teoremas de incompletitud que mostraron que mientras Principia Mathematica (PM) podría resolver algunos problemas, nunca podría resolverlos todos. Sin embargo, el teórico lógico usó la lógica para probar unos 40 teoremas matemáticos de PM y algunos de ellos de manera más eficiente que en el libro.

En términos de computadoras, Newell, Simon y Shaw se dieron cuenta de que las técnicas en PM podrían hacerse computacionales creando árboles de búsqueda en listas y luego manipulando esas listas que cada posible respuesta seleccionaba, manipulaba para crear más listas de posibilidades y las recorría recursivamente. todo hasta que se encontró la respuesta o no hubo más entradas en la lista. Piense en esto como si tuviera un árbol y cada respuesta que encuentre crea otro árbol con todas sus respuestas posibles como hijos que se examinan de la misma manera (por lo tanto, recursividad). Para hacer esto, crearon IPL, que luego usaron para crear un programa que funcionaría para resolver los teoremas en PM. Se llamaba Teórico de la lógica. Y funcionó. Fue capaz de resolver, bastante rápido, 30 teoremas de un capítulo en PM. Antes de este programa, era la mente humana la que hacía esto exclusivamente, por lo que en ese momento pensaron que así era como funcionaba la mente humana y estaban en el camino hacia la verdadera inteligencia artificial. Pensaron en poco tiempo que tendrían una máquina completamente pensante.

Pero el lenguaje IPL era difícil de usar, ya que era un tipo de ensamblaje. Dos años después, McCarthy usó las ideas en IPL para crear LISP que tenía una sintaxis más limpia y una recolección de basura que lo hacía mucho más fácil de usar. Este fue el avance necesario para lograr que toda la IA evasiva. Por supuesto, significa Procesador LISt, y es un lenguaje muy antiguo (COBOL, FORTRAN y LISP fueron el corazón de TI durante algún tiempo). Cuando estudié IA por primera vez (soy viejo) nos mudamos a Prolog, por lo que tengo muy poca experiencia en LISP.

Sin embargo, estos lenguajes útiles para la programación lógica fueron para ciertas tareas (micro-mundos) que no pudieron lograr una verdadera IA, que si bien nos estamos acercando, todavía no se logra hoy. Los sistemas de conexión que imitan la biología del cerebro asumieron el control a fines de los años ochenta, aunque el poder computacional de las computadoras en ese momento lo hizo muy lento. No he encontrado que LISP en IA funcione durante casi 20 años, ya que mi propio trabajo está en sistemas probabilísticos complejos, redes neuronales profundas, SVM y algoritmos evolutivos. Apuesto a que todavía se usa en algún lugar con el propósito de AI, aunque la mayoría trabaja se ha movido a tensores que se prestan muy bien a las estructuras de datos de la red neuronal, especialmente porque este trabajo se puede hacer en GPU masivamente paralelas.

Érase una vez, lo fue. Es difícil recordarlo ahora, porque se ha avanzado muy poco, pero la IA fue una vez la gran cosa en informática y la gente tenía un gran optimismo al respecto. En retrospectiva, eso parece un poco ingenuo, ya que la gente todavía se estaba ejecutando en ideas esencialmente cartesianas sobre lo que era la inteligencia, que ahora sabemos que en su mayoría están equivocadas.

En aquel entonces, la Santísima Trinidad de los lenguajes informáticos consistía en FORTRAN, COBOL y LISP. FORTRAN fue bueno para el cálculo de números, pero la única estructura de datos era una matriz. Ha pasado mucho tiempo desde que usé COBOL, pero hasta donde puedo recordar, lo más parecido a una estructura de datos fue el registro, y esta fue solo una forma de dividir los caracteres en las tarjetas Hollerith, una tecnología del siglo XIX, en campos de longitud fija. Me hizo aprender a escribir VALOR de un solo movimiento en un teclado 049 y LLENAR casi tan rápido.

En contraste, LISP permitió la creación dinámica de árboles binarios arbitrarios. Por lo general, se usaban para representar listas según la siguiente convención: la rama izquierda del árbol era el primer elemento, y la rama derecha era el resto de la lista. Por esta razón, obtuvo su nombre de LISt Processor. Aquellos de nosotros que lo conocemos y amamos sabemos que realmente significa muchos paréntesis individuales irritantes. También era completamente dinámico, por lo que un elemento de una lista podría ser una lista o un átomo, esencialmente un escalar, aunque a veces el término estaba reservado para símbolos.

Era absurdamente simple escribir un intérprete de LISP desde cero. La sintaxis fue mínima. El código fuente de los programas consistía en listas. La estructura dinámica significaba que podía programar de forma interactiva. Era el único idioma en ese momento que apoyaba la recursividad, pero por alguna razón inexplicable, muchas personas prefirieron usar el bloque PROG con GOTO.

Fue, y durante mucho tiempo siguió siendo, el único lenguaje apropiado para hackear. Gran parte de la investigación de IA consistió en piratería. No había una teoría decente para la IA (todavía no la hay, pero al menos ahora sabemos lo suficiente como para saber que no es obvio).

Sin embargo, los programadores de LISP obtuvieron un complejo de inferioridad durante mucho tiempo. Los primeros intérpretes de LISP eran bastante malos, y las máquinas con las que funcionaban eran bastante más desagradables. Corrieron despacio. LISP también requirió la recolección de basura, y la gente no sabía mucho al respecto, por lo que fue lento. Ya a fines de la década de 1970, cuando fui al MIT, los programas de LISP ocasionalmente iban a almorzar, imprimiendo “COLECCIONANDO BASURA …” una y otra vez en el DECWriter. Los sistemas posteriores utilizaron principalmente trucos cursis como el recuento de referencias o simplemente poner el problema en el programador pobre. La recolección adecuada de basura no volvió a crecer hasta la invención de Java, y luego, los viejos, resentidos de lo maravillosa que la gente pensaba que era, hicieron muchos comentarios sarcásticos.

Los desarrolladores de LISP intentaron hacer mucho para que fuera un lenguaje más atractivo, probablemente bajo la suposición incorrecta de que las críticas se basaban en algo real, lo que resultó en el gigante de Common Lisp. Por otro lado, Scheme recapturó algo de la pureza del LISP original con características basadas en ideas modernas, como el alcance léxico, la recursión de la cola y la sorprendente continuación (que desafortunadamente hace que Scheme se mapee mal en arquitecturas modernas basadas en pilas). Ninguno de ellos, desafortunadamente, obtuvo una programación orientada a objetos en su forma más pura, prefiriendo un modelo similar a ADA que sea así, pero al mismo tiempo no lo sea del todo.

Aún así, el modelo de memoria de LISP fue tan útil, e incluso la sintaxis fue tan útil para la secuencia de comandos de pirateo rápido que muchos sistemas obtuvieron Green Spunning. Yo también lo he hecho. Que yo sepa, la primera vez que las actitudes tipo LISP se utilizaron en gran medida con otro idioma fue Google y C ++.

Puedo obtener ladrillos para esto, pero mi idioma preferido para la piratería de IA es en realidad Perl. No escribiría un gran sistema en él, pero si tiene un montón de texto del que necesita extraer información, no hay nada igual.

Sí, LISP es un lenguaje de programación ampliamente utilizado en IA.

LISP (procesamiento de listas) es ese lenguaje de alto nivel que impresiona bastante a los desarrolladores de inteligencia artificial y también se ha utilizado en muchos proyectos clásicos de inteligencia artificial.

Las mejores características de LISP:

  • Soporta programación simbólica.
  • Recolección de basura
  • Uniformidad de sintaxis.
  • Extensible.
  • Creación rápida de prototipos.
  • Traducciones automáticas.
  • Gran herramienta de creación de prototipos.

También puede usar otros lenguajes en IA (Inteligencia Artificial) como C ++, JAVA, Prolog y Python. Para obtener más información sobre todos los idiomas, visite los 5 lenguajes de programación principales para crear soluciones de inteligencia artificial – Techtic Solutions

Me sorprendió hace un tiempo cuando descubrí que la mayor parte de la base de código de Crash Bandicoot (¿alguien recuerda este juego?) Está escrita en un dialecto LISP personalizado. Aquí hay un artículo interesante de Andy Gavin, creador de este juego, que explica por qué han elegido LISP para la IA y la programación de control de personajes.

http://all-things-andy-gavin.com

Fue hace décadas, cuando la única alternativa era usar un lenguaje cuyo único tipo de datos eran los enteros pequeños. En estos días ya no es cierto.

Lisp, por supuesto, se puede usar para IA (y ocasionalmente todavía se usa para IA entre viejos fogeys), pero también se puede usar Haskell, Erlang, Prolog, Python, C ++ o innumerables otros idiomas.

Una muy buena introducción a los méritos de Lisp en IA, o mejor dicho, IA como se practicaba hace un cuarto de siglo, es el libro del Dr. Peter Norvig, Paradigms of Artificial Intelligence Programming. Hay mucho material en este libro, pero muestra de pasada cómo Lisp es capaz de construir manipuladores simbólicos con poco alboroto.

Si él no se opone a que yo cite, la revisión de la cápsula de Quora User de este libro es

Lea PAIP si desea aprender sobre cómo escribir Common Lisp al estilo de los años 90, de manera relativamente limpia, mientras estudia conceptos simples de IA, y detalles de Common Lisp como eficiencia.

Como menciona la respuesta de Robert Smith, en ese momento, otros idiomas habrían requerido una gran cantidad de Greenspunning para lograr este nivel de productividad. También señala correctamente que hoy estamos bendecidos con muchos lenguajes modernos, construidos sobre esas tres décadas de teoría del lenguaje de programación, teoría de tipos y avances del compilador.

Mucha gente está usando Clojure. Pero, podrían no estar haciendo proyectos de IA.

La popularidad de LISP en los años 80 fue acompañada de una falta de discernimiento sobre si los proyectos de una aplicación eran un proyecto de IA.

Entonces, hubo muchos proyectos en máquinas LISP que hicieron un mejor formateo, por ejemplo. O bien, había editores y otras cosas similares. Pero, las máquinas LISP no podían ofrecer programas para competir con cosas como Adobe Acrobat o Windows Word y EMACS. Lo intentaron, pero muchos de los contendientes se estrellaron. Como los programas estaban en LISP, las personas los etiquetarían como AI. Y, se suponía que debía pagar más por su estación de trabajo original, por ejemplo, $ 50K en lugar de $ 2K por su elegante caja de Windows.

Por lo tanto, debe preguntarse si LISP fue realmente ampliamente utilizado para la IA. La investigación de IA no fue tan generalizada como las afirmaciones de la investigación de AI.

Probablemente haya más IA hoy. Es lamentable que las personas sean tan comunicativas acerca de que la IA es una ciencia numérica que alguna vez fue simbólica. Pero, realmente puede ser ambas cosas, a menudo al mismo tiempo. Entonces, ahora las personas confunden cosas como técnicas estadísticas con IA. Pero, este estado de cosas es probablemente mejor que si las personas todavía estuvieran tratando de replicar EMACS en LISP, o Clojure para el caso, mientras lo llaman AI.

La idea de que los programas se escriban ellos mismos continúa. Y, a veces, se pasa por alto el poder de este proceso. Quizás ocurra más en procesos separados ahora, dentro de diferentes servidores conectados a través de un proceso de negocio. Uno podría encontrar una base de datos SQL estándar en el corazón de esta reescritura. Pero, este tipo de cosas son más pragmáticas. Por ejemplo, la colocación de AD, usando relevancia, puede en cierto sentido reescribir páginas web; y, ¿qué quiere decir que los componentes AD no obtienen código generado por computadora (javascript) para su funcionamiento? Es probable que mucho de esto se construya a partir de macro sistemas. (Pero, ¿la computadora o alguna parte de un grupo de computadoras sabe que tiene el propósito de hacer una mejor comercialización?)

Creo que buscamos que las computadoras informen y actúen según su propósito para realizar una tarea, conociendo y seleccionando su propósito. Los programas LISP por sí mismos, así como los procesos numéricos por sí mismos, no se esfuerzan por hacer algo. Ellos solo actúan. Como he dejado un hueco sobre la programación numérica y simbólica combinada, tendré que decir que las combinaciones de los dos no necesariamente tienen conciencia de su propósito.

Ampliando lo que Peter Norvig ya ha dicho, agregaría que LISP ha tenido una maravillosa homogeneidad entre la sintaxis y la estructura de los programas y los datos. Ambas eran expresiones S que representaban estructuras de árbol como XML pero menos detalladas. Uno podría analizar fragmentos de programas fácilmente, “ejecutar” (interpretar) datos como programas y crear rápidamente lenguajes específicos de dominio (DSL) “así como así”. Hasta cierto punto, Scala lo permite hoy, pero no tan naturalmente. Por ejemplo, sería trivial crear un lenguaje basado en reglas con construcciones como (SI (patrón de coincidencia) ENTONCES (insertar creencia)). Las DSL serían fáciles de crear e interpretar.
En todos los demás idiomas que he usado, la división de programas vs datos ha sido muy pronunciada.

Ya no está sucediendo una cantidad tremenda en el campo de la IA: ciertamente ha disminuido desde su apogeo en los años 80. Sin embargo, creo que Lisp es casi seguro que sigue siendo el lenguaje de facto para mucho de lo que todavía está sucediendo en el campo de la IA.

¿Es el uso principal de AI lisp? Casi seguro que no, en este punto.

Es una suposición aproximada, pero me atrevería a decir que el intérprete de lisp dentro de los editores de texto “emacs” ejecuta probablemente entre el 95 y el 98% del código de lisp que se usa en la producción actual.

Tomé a Lisp como un curso sin crédito de 3 meses en mi programa MIS en la universidad. Pagó $ 225 por Microsoft Lisp. Evangelizó a Lisp por años. Aún usando CommonLisp. Pero no, Lisp no se usa ampliamente en IA, Python es mucho más popular. En este momento estoy usando Pythonista en un iPad Mini 4 que todavía estoy tratando de descubrir casos de uso que puedan ser lo suficientemente buenos para una empresa de nueva creación.

No. LISP es solo una herramienta y ahora están disponibles alternativas mucho más eficientes y fáciles de usar, como ya se mencionó.

Estudié la IA intensamente hace algunas décadas, usando el texto de Patrick Henry Winston y ahora, mirando hacia atrás, puedo ver claramente las raíces del “Big Data” en la generación de inferencia basada en IA y el reconocimiento de patrones.

Cuando hice cursos de IA en la universidad, todas las tareas de programación estaban en LISP (Scheme) o PROLOG. Supongo que los lenguajes de programación funcionales y / o lógicos son los más adecuados para un cierto tipo de tareas que a menudo ocurren dentro del tema de la IA. Al menos todos los Scheming me enseñaron cómo anidar mis paréntesis correctamente.

El atractivo de lisp para AI es que no hubo diferenciación entre código y datos. Por lo tanto, era concebible y emocionante que el código pudiera convertirse en estructuras cada vez más inteligentes que pudieran transmitirse.

Hoy en día, no conozco a muchas personas que usan Lisp para la IA. El estado del arte de los lenguajes de alto nivel hace que no sea tan atractivo, y nadie es realmente un modelo de la mente que de todos modos podría usar tales características.

Alguien me preguntó recientemente si programé en Lisp. Dije que solía hacerlo, en los años 80. “Pero mejoré”. 😉