lisp - unidos - poliglotas famosos
Requisitos de idioma para el desarrollo de la IA (8)
¿Qué quieres decir con "IA"? El campo es tan amplio que hace que esta pregunta no tenga respuesta. ¿Qué aplicaciones estás mirando?
LISP fue utilizado porque era mejor que FORTRAN. También se usó el prólogo, pero nadie lo recuerda. Esto fue cuando las personas creyeron que los enfoques basados en símbolos eran el camino a seguir, antes de que se entendiera qué tan difíciles son las capas de detección y expresión.
Pero la "IA" moderna (visión artificial, planificadores, infierno, la extraña habilidad de Google para saber lo que "quiso decir") se realiza en lenguajes de programación más eficientes que son más sostenibles para que se desarrolle un gran equipo. Esto generalmente significa C ++ en estos días. -pero no es que nadie piense que C ++ es un buen lenguaje para la IA.
Demonios, puedes hacer mucho de lo que se llamó "AI" en los años 70 en MATLAB. Nadie ha llamado a MATLAB "un buen lenguaje para la IA", ¿verdad?
Posible duplicado:
¿Por qué se usa Lisp para la IA?
¿Qué hace que un lenguaje sea adecuado para el desarrollo de la Inteligencia Artificial?
He escuchado que LISP y Prolog son ampliamente utilizados en este campo. ¿Qué características las hacen adecuadas para la IA?
En general, diría que lo principal que veo sobre los idiomas "preferidos" para la IA 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 como objetos de primera clase) que tiende a ser una característica definitoria de la mayoría de los lenguajes AI http://en.wikipedia.org/wiki/Higher-order_programming que puedo ver. Ese artículo es un talón y deja de lado 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 dados como lenguajes AI. Pero algunos de los otros pueden ser sorprendentes. He visto varios libros de IA para Python. Uno de ellos es http://www.nltk.org/book . También he visto algunos de Ruby y Perl. Si estudia más sobre LISP, reconocerá que muchas de sus características son similares a los lenguajes de scripting modernos. Sin embargo, LISP salió en 1958 ... así que realmente se adelantó a su tiempo.
Hay bibliotecas de AI para Java. Y en Java puede clasificar las funciones de pirateo como objetos de primera clase usando métodos en clases, pero es más difícil / menos conveniente que LISP. En C y C ++ tienes punteros de función, aunque de nuevo 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, es posible que tenga que construir sum(array)
, product(array)
para realizar las diferentes operaciones. Pero con las funciones como objetos de primera clase, podría calcular accumulate(array, +)
y accumulate(array, *)
. Incluso podrías accumulate(array, getDataElement, operation)
. Dado que la inteligencia artificial está tan mal definida, el tipo de flexibilidad es una gran ayuda. Ahora puede crear un código mucho más genérico que es mucho más fácil de extender de maneras que ni siquiera fueron concebidas originalmente.
Y Lambda (ahora encuentra su camino por todas partes) se convierte en una forma de guardar la escritura para que no tenga que definir cada función. En el ejemplo anterior, en lugar de tener que realizar getDataElement(arrayelement) { return arrayelement.GPA }
algún lugar, simplemente puede decir accumulate(array, lambda element: return element.GPA, +)
. Por lo tanto, no tiene que contaminar su espacio de nombres con toneladas de funciones para que solo se las llame una o dos veces.
Si regresa en el tiempo a 1958, básicamente sus opciones fueron LISP, Fortran o Assembly. En comparación con Fortran, LISP era mucho más flexible (y, 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 tipografía dinámica, recolección de basura, etc. (cosas que cualquier lenguaje de scripting tiene 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 usamos para la IA. Ahora mire Ruby / Python / Perl / JavaScript / Java / C # / e incluso el último estándar propuesto para C comienza a ver las características de LISP (mapa / reducir, lambdas, recolección de basura, etc.). LISP estaba muy por delante de su tiempo en la década de 1950.
Incluso ahora, LISP aún mantiene algunos ases en el hoyo durante la mayor parte de la competencia. Los macro sistemas en LISP son realmente avanzados. En C puede ir y ampliar el idioma con llamadas de biblioteca o macros simples (básicamente una sustitución de texto). En LISP puede definir nuevos elementos de idioma (piense en su propia declaración if, ahora piense en su propio lenguaje personalizado para definir GUIs). En general, los lenguajes LISP aún ofrecen formas de abstracción que los lenguajes comunes aún no han alcanzado. Seguro que puedes definir tu propio compilador personalizado para C y agregar todas las construcciones de lenguaje que quieras, pero nadie lo hace realmente. En LISP, el programador puede hacer eso fácilmente a través de Macros. Además, LISP está compilado y, por el lenguaje de programación shootout, es más eficiente que Perl, Python y Ruby en general.
El prólogo es básicamente un lenguaje lógico hecho para representar hechos y reglas. Qué son los sistemas expertos pero las 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 aprendizaje automático / minería de datos disponibles para Java. Sin embargo, cuando está creando un prototipo 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ático. LISP fue el primer idioma 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 gustar mucho los lenguajes funcionales. Así que no hace daño que LISP sea funcional. Aunque ahora también tienes ML, Haskell, OCaml, etc. en ese frente (algunos de estos lenguajes admiten múltiples paradigmas ...).
La principal tarjeta de llamadas de Lisp y Prolog en este campo particular es que admiten conceptos de metaprogramación como lambdas. La razón por la que es importante es que es útil cuando desea utilizar su propio lenguaje de programación dentro de un lenguaje de programación, como lo hará comúnmente al escribir reglas de sistemas expertos.
Para hacerlo bien en un lenguaje imperativo de nivel inferior como C, generalmente es mejor crear un compilador o biblioteca de idiomas para su nuevo idioma (regla del sistema experto), para que pueda escribir sus reglas en el nuevo idioma y sus acciones. en C. Este es el principio detrás de cosas como CLIPS .
Las construcciones de coincidencia de patrones con creación de instancias (o la capacidad de construir fácilmente el código de coincidencia de patrones) son una gran ventaja. La coincidencia de patrones no es totalmente necesaria para hacer AI, pero puede simplificar el código para muchas tareas de AI. Estoy descubriendo que esto también hace que F # sea un lenguaje conveniente para AI
Las dos cosas principales que desea son la capacidad de hacer programación experimental y la capacidad de hacer programación no convencional.
Cuando estás haciendo IA, por definición, realmente no sabes lo que estás haciendo. (Si lo hicieras, no sería AI, ¿verdad?) Esto significa que quieres un idioma en el que puedas probar cosas y cambiarlas rápidamente. No he encontrado ningún idioma que me guste más que Common Lisp para eso, personalmente.
Del mismo modo, estás haciendo algo no muy convencional. Prolog ya es un lenguaje poco convencional, y Lisp tiene macros que pueden transformar el lenguaje enormemente.
Los idiomas per se (sin bibliotecas) son adecuados / cómodos para áreas específicas de investigación / investigación y / o aprendizaje / estudio ("cómo hacer las cosas más simples de la manera más difícil").
La idoneidad para el desarrollo comercial está determinada por la disponibilidad de marcos, bibliotecas, herramientas de desarrollo, comunidades de desarrolladores y adopción por parte de las empresas. Por ejemplo, en Internet encontrará soporte para cualquier, incluso las áreas / temas más exóticos (incluidas, por supuesto, áreas de IA) , por ejemplo, en C # porque es la corriente principal.
Por cierto, ¿qué es específicamente el contexto de la pregunta? AI es un término tan amplio.
Actualizar:
Vaya, realmente no esperaba llamar la atención y la discusión a mi respuesta.
Bajo ("cómo hacer las cosas más simples de la manera más difícil"), me refiero a que estudiar y aprender, así como los objetivos / técnicas / enfoques / metodología de I + D académico no coinciden con los objetivos del desarrollo (comercial).
En proyectos estudiantiles (o incluso académicos) se puede escribir toneladas de código que probablemente requerirían una línea de código en RAD comercial (usando componente / servicio / característica de marco o biblioteca).
Porque..! oooh! Porque no tiene sentido enredar / desarrollar una discusión sin primero acordar definiciones comunes de términos ... que son subjetivos y dependen del contexto ... y no son tan fáciles de formular en un contexto general / abstracto. Y este es un asunto interdisciplinario de áreas enteras de diferentes ciencias.
La pregunta es amplia (filosófica) y formulada evasivamente ... sin principio ni fin ... sin respuestas definitivas sin contexto y definiciones ...
¿Vamos a desarrollar aquí alguna propuesta específica?
Los lenguajes de programación funcionales son más fáciles de paralelizar debido a su naturaleza sin estado. Parece que ya hay un tema al respecto con algunas buenas respuestas aquí: ¿ Ventajas de la programación sin estado?
Como se dijo, también es generalmente más sencillo construir programas que generan programas en LISP debido a la simplicidad del lenguaje, pero esto solo es relevante para ciertas áreas de la IA, como el cálculo evolutivo.
Editar:
De acuerdo, intentaré explicar un poco por qué el paralelismo es importante para la inteligencia artificial utilizando la IA simbólica como ejemplo, ya que probablemente sea el área de la IA que mejor entiendo. Básicamente, es lo que todos usaban en el día en que se inventó LISP, y la hipótesis del símbolo físico en la que se basa es más o menos la misma forma en que se haría para calcular y modelar cosas en el código LISP. Este enlace explica un poco sobre esto: http://www.cs.st-andrews.ac.uk/~mkw/IC_Group/What_is_Symbolic_AI_full.html
Básicamente, la idea es crear un modelo de su entorno y luego buscarlo para encontrar una solución. Uno de los algoritmos más sencillos de implementar es una primera búsqueda, que es una búsqueda exhaustiva de todos los estados posibles. Mientras produce un resultado óptimo, usualmente es prohibitivo y consume mucho tiempo. Una forma de optimizar esto es mediante el uso de una heurística (siendo A * un ejemplo), otra es dividir el trabajo entre las CPU.
Debido a la apatridia, en teoría, cualquier nodo que expanda en su búsqueda podría ejecutarse en un hilo separado sin la complejidad o la sobrecarga que implica el bloqueo de datos compartidos. En general, suponiendo que el hardware pueda admitirlo, entonces, cuanto más altamente pueda paralizar una tarea, más rápido obtendrá su resultado. Un ejemplo de esto podría ser el proyecto fold @ home, que distribuye el trabajo en muchas GPU para encontrar configuraciones óptimas de plegamiento de proteínas (que pueden no tener nada que ver con LISP, pero son relevantes para el paralelismo).
Por lo que sé por LISP es que es un lenguaje de programación funcional , y con él usted puede hacer "programas que hacen programas. No sé si mi respuesta se adapta a sus necesidades, consulte los enlaces anteriores para obtener más información.