En general, diría que lo principal que veo sobre los idiomas "preferidos" para AI es que tienen una programación de alto orden junto con muchas herramientas para la abstracción.
Es la programación de alto orden (también conocida como funciones de objetos de primera clase) que tiende a ser una característica definitoria de la mayoría de los lenguajes de IA http://en.wikipedia.org/wiki/Higher-order_programming que puedo ver. Ese artículo es un apéndice y deja fuera Prolog http://en.wikipedia.org/wiki/Prolog que permite "predicados" de alto orden.
Pero básicamente la programación de alto orden es la idea de que puede pasar una función como una variable. Sorprendentemente, muchos de los lenguajes de scripting también tienen funciones como objetos de primera clase. LISP/Prolog son un dado como lenguajes de IA. Pero algunos de los otros pueden ser sorprendentes. He visto varios libros de AI para Python. Uno de ellos es http://www.nltk.org/book. También he visto algunos para Ruby y Perl. Si estudias más sobre LISP, reconocerás que muchas de sus características son similares a los lenguajes de scripting modernos. Sin embargo LISP salió en 1958 ... así que realmente estaba adelantado a su tiempo.
Hay bibliotecas de AI para Java. Y en Java puedes clasificar las funciones como objetos de primera clase usando métodos en clases, es más difícil/menos conveniente que LISP pero posible. En C y C++ tienes indicadores de función, aunque una vez más son mucho más molestos que LISP.
Una vez que tiene funciones como objetos de primera clase, puede programar mucho más genéricamente de lo que es posible. Sin funciones como objetos de primera clase, puede que tenga que construir sum(array)
, product(array)
para realizar las diferentes operaciones. Pero con funciones como objetos de primera clase, puede calcular accumulate(array, +)
y accumulate(array, *)
. Incluso podría hacer accumulate(array, getDataElement, operation)
. Como la IA está tan mal definida, ese tipo de flexibilidad es de gran ayuda. Ahora puedes construir un código mucho más genérico que es mucho más fácil de extender de maneras que ni siquiera se concibieron originalmente.
Y Lambda (que ahora se abre camino por todas partes) se convierte en una forma de guardar el tipeo para que no tenga que definir cada función. En el ejemplo anterior, en lugar de tener que hacer getDataElement(arrayelement) { return arrayelement.GPA }
en algún lugar, puede decir accumulate(array, lambda element: return element.GPA, +)
. De modo que no tiene que contaminar el espacio de nombres con toneladas de funciones para llamar solo una o dos veces.
Si retrocedes en el tiempo hasta 1958, básicamente tus elecciones fueron LISP, Fortran o Assembly. Comparado con Fortran, LISP era mucho más flexible (lamentablemente también menos eficiente) y ofrecía medios de abstracción mucho mejores. Además de las funciones como objetos de primera clase, también tenía tipado dinámico, recolección de basura, etc. (todo lo que tiene un lenguaje de scripting hoy). Ahora hay más opciones para usar como lenguaje, aunque LISP se benefició de ser el primero y convertirse en el lenguaje que todos usaron para AI. Ahora mira Ruby/Python/Perl/JavaScript/Java/C#/e incluso el último estándar propuesto para C comienzas a ver las características de LISP a escondidas (map/reduce, lambdas, recolección de basura, etc.). LISP estaba muy por delante de su tiempo en la década de 1950.
Aún ahora, LISP aún mantiene algunos ases en el hoyo durante la mayor parte de la competencia. Los macro sistemas en LISP están realmente avanzados. En C puede ir y ampliar el idioma con llamadas a la biblioteca o macros simples (básicamente una sustitución de texto). En LISP puede definir nuevos elementos de lenguaje (piense en su propia sentencia if, ahora piense en su propio lenguaje personalizado para definir GUI).En general, los lenguajes LISP aún ofrecen formas de abstracción que los principales lenguajes aún no han alcanzado. Claro que puede definir su propio compilador personalizado para C y agregar todas las construcciones de lenguaje que desee, pero nadie realmente lo hace. En LISP, el programador puede hacerlo fácilmente a través de Macros. También se compila LISP y según el tiroteo en el lenguaje de programación, es más eficiente que Perl, Python y Ruby en general.
Prolog básicamente es un lenguaje lógico hecho para representar hechos y reglas. ¿Qué son los sistemas expertos sino colecciones de reglas y hechos? Dado que es muy conveniente representar un conjunto de reglas en Prolog, existe una sinergia evidente con los sistemas expertos.
Ahora creo que usar LISP/Prolog para cada problema de IA no es un hecho. De hecho, solo mire la multitud de bibliotecas de Machine Learning/Data Mining disponibles para Java. Sin embargo, cuando está creando prototipos de un nuevo sistema o está experimentando porque no sabe lo que está haciendo, es mucho más fácil hacerlo con un lenguaje de scripting que con uno estáticamente estático. LISP fue el idioma más antiguo en tener todas estas características que damos por sentado. Básicamente no hubo competencia en absoluto al principio.
También en general, la academia parece querer mucho los lenguajes funcionales. Entonces, no hace daño que LISP sea funcional. Aunque ahora tienes ML, Haskell, OCaml, etc. en ese frente también (algunos de estos lenguajes admiten múltiples paradigmas ...).
Esta pregunta tiene algunas respuestas excelentes: http://stackoverflow.com/questions/130475/why-is-lisp-used-for-ai – Isaac
Del número de favoritos (uno de los cuales es el mío), se podría decir muchos desarrolladores se preguntan sobre la relación. Sin embargo, la respuesta puede no ser fácil, y puede no llegar rápidamente. Le recomiendo encarecidamente que no cierre la pregunta rápidamente. Aquí hay algunos consejos sobre cómo mantener la atención a su pregunta: [http://meta.stackexchange.com/questions/7046/how-to-get-attention-for-your-old-unanswered-questions]. Estoy seguro de que si le das suficiente tiempo, aparecerán excelentes respuestas aquí. –