2010-08-19 12 views
16

Duplicar posibles:
Why is Lisp used for AI?requisitos de idioma para el desarrollo AI

Lo que hace que un lenguaje adecuado para el desarrollo de la Inteligencia Artificial?

He oído que LISP y Prolog son ampliamente utilizados en este campo. ¿Qué características los hacen adecuados para AI?

+3

Esta pregunta tiene algunas respuestas excelentes: http://stackoverflow.com/questions/130475/why-is-lisp-used-for-ai – Isaac

+0

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í. –

Respuesta

8

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 ...).

+1

+1, one nitpick: en C++, normalmente usaría objetos de función (es decir, objetos de las clases que sobrecargan 'operator()'), no punteros de función para emular funciones de primera clase. – missingfaktor

0

Por lo que yo sé de LISP es que es un Functional Programming idioma, y ​​con ella son capaces de hacer "programas que hacen programas. No sé si mi respuesta se adapte a sus necesidades, ver los enlaces anteriores para más información .

0

Idiomas per se (sin librerías) son adecuados/cómodo para áreas específicas de investigación/investigación y/o de aprendizaje/estudiando ("cómo hacer las cosas más simples de la manera más dura").
Idoneidad para el desarrollo comercial está determinado por la disponibilidad de marcos, bibliotecas, herramientas de desarrollo, comunidades de desarrolladores, adopción por parte de las empresas. Por ejemplo, en Internet encontrará soporte para cualquier, incluso las cuestiones/áreas más exóticas (que incluye, por supuesto, áreas de AI), por ejemplo, en C# porque es convencional.

Por cierto, ¿qué es específicamente el contexto de la pregunta? AI es un término tan amplio.


Actualización:
Oooops, realmente no esperaba llamar la atención y discusión a mi respuesta.

En virtud ("cómo hacer las cosas más simples de la manera más difícil"), me refiero a que estudiar y aprender, así como académicos R & D objetivos/técnicas/enfoques/metodología no coinciden con los objetivos de (comercial) desarrollo.

En proyectos de estudiantes (o incluso académicos) se pueden escribir toneladas de código que probablemente requerirían una línea de código en RAD comercial (uso de componente/servicio/función de framework o biblioteca).

¡Porque ..! oooh! Porque no tiene sentido enredar/desarrollar ninguna 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 esto es materia interdisciplinario de zonas enteras de diferentes ciencias

La pregunta es amplio (filosófica) y evasivas formulado ... sin principio ni fin ... al no tener respuestas definitivas y sin contexto y de las definiciones ...

¿Vamos a desarrollar aquí alguna propuesta de especificación?

+0

¿Qué quiere decir con "cómo hacer las cosas más simples de la manera más difícil"? – Ken

1

Los lenguajes de programación funcionales son más fáciles de paralelizar debido a su naturaleza apátrida. Parece que ya hay un tema al respecto con algunas buenas respuestas aquí: Advantages of stateless programming?

Como se dijo, también es generalmente más fácil de crear programas que generan programas en LISP debido a la simplicidad del lenguaje, pero esto solo es relevante para ciertos áreas de AI como la computación evolutiva.

Editar:

Ok, voy a tratar de explicar un poco acerca de por qué es importante paralelismo AI usando IA simbólica como ejemplo, ya que su probablemente el área de la IA que entiendo mejor. Básicamente es lo que todo el mundo estaba usando 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 de la misma manera en que se haría para calcular y modelar cosas en el código LISP. Este enlace explica un poco al respecto: http://www.cs.st-andrews.ac.uk/~mkw/IC_Group/What_is_Symbolic_AI_full.html

Así que, 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 la búsqueda de amplitud, que es una búsqueda exhaustiva de todos los estados posibles. Mientras se produce un resultado óptimo, por lo general es prohibitivamente lento. Una forma de optimizar esto es usar una heurística (A * es un ejemplo), y 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 sobrecarga involucrada en el bloqueo de datos compartidos. En general, suponiendo que el hardware pueda soportarlo, cuanto más alto sea el paralelismo de una tarea, más rápido obtendrá el resultado. Un ejemplo de esto podría ser el proyecto folding @ home, que distribuye el trabajo en muchas GPU para encontrar configuraciones óptimas de plegado de proteínas (que pueden no tener nada que ver con LISP, pero son relevantes para el paralelismo).

+0

Necesita explicar por qué el paralelismo es importante para AI en particular. –

+0

Acabo de actualizar mi publicación. Espero que eso explique las cosas un poco mejor. Aclamaciones. –

+0

Que los programas funcionales sin estado son fáciles de paralizar es un mito. Quizás sea "más fácil" que otra cosa, pero en general no es fácil. –

3

La principal tarjeta de presentación tanto de Lisp como de Prolog en este campo en particular es que admiten conceptos de metaprogramación como lambdas. La razón por la que es importante es que ayuda cuando se quiere rodar su propio lenguaje de programación dentro de un lenguaje de programación, como lo que normalmente querrá hacer para escribir reglas del sistema experto.

Para hacer esto bien en un lenguaje imperativo de nivel inferior como C, generalmente es mejor crear un compilador o biblioteca de idiomas para su nuevo lenguaje (regla de sistema experto), para que pueda escribir sus reglas en el nuevo el lenguaje y sus acciones en C. Este es el principio detrás de cosas como CLIPS.

1

¿Qué quiere decir con "AI"? El campo es tan amplio que hace que esta pregunta sea incontestable. ¿Qué aplicaciones estás mirando?

Se usó LISP porque era mejor que FORTRAN. También se usó Prolog, pero nadie recuerda eso. Fue entonces cuando la gente creía que los enfoques basados ​​en símbolos eran el camino a seguir, antes de que se entendiera cuán difíciles son las capas de percepción y expresión.

Pero la moderna "AI" (visión artificial, planificadores, infierno, la extraña habilidad de Google para saber lo que "significó") se hace en lenguajes de programación más eficientes que son más sostenibles para que un gran equipo se desarrolle. Esto generalmente significa C++ en estos días, pero no es como si alguien pensara en C++ como un buen lenguaje para la inteligencia artificial.

Demonios, puedes hacer mucho de lo que se llamaba "AI" en los años 70 en MATLAB. Nadie ha llamado a MATLAB "un buen lenguaje para la IA" antes, ¿o sí?

+0

Para mí, el año pasado, Google descubrió una extraña habilidad para decir "¿Quiso decir {término completamente no relacionado}?". – Ken

+0

@Ken, como la mayoría de los sistemas de aprendizaje, probablemente haya encontrado una correlación que no coincide con sus expectativas. No significa que la correlación no esté allí, solo que no tiene sentido desde su perspectiva. Como cuando Cyc una vez asumió que todos los humanos eran famosos, porque solo estaban poblando con información sobre gente famosa. –

+0

Alex: la correlación es con frecuencia "una palabra mucho más común que se deletrea de manera similar". Google parece asumir que soy un hechizo/mecanógrafo terrible (¿promedio?).Ciertamente * creo * que hay una fuerte correlación, pero eso no significa que mostrarme la correlación sea del todo útil. Tristemente, Google parece no tener la capacidad de aprender que nunca acepto sus "correcciones de errores", y que tiendo a decir exactamente lo que quiero decir. – Ken

0

Las construcciones de coincidencia de patrones con creación de instancias (o la capacidad de construir fácilmente código de coincidencia de patrones) son una gran ventaja. La coincidencia de patrones no es totalmente necesaria para hacer A.I., pero sí puede simplificar el código para muchas A.A. Tareas. Estoy descubriendo que esto también hace que F # sea un lenguaje conveniente para A.I.

+0

¿Por qué la coincidencia de patrones es una ventaja para AI en particular? Tal vez sea una ventaja para toda la programación, en cuyo caso su consejo es realmente "usar el lenguaje más poderoso posible para AI". –

+0

Acepto que la coincidencia de patrones es una característica de lenguaje muy poderosa en general, y no solo para AI. Pero para la IA simbólica en particular, que a menudo implica la creación de instancias parciales, el procesamiento de listas, etc., creo que la coincidencia de patrones realmente puede ayudar a simplificar el código fuente. La coincidencia de patrones puede hacer que las construcciones de símbolos aparezcan en el código en sí, es decir, el código se puede hacer parecerse al problema. Para más tipos numéricos de IA (por ejemplo, redes neuronales), la coincidencia de patrones es buena, pero solo de forma general. – TechNeilogy

2

Las dos cosas principales que desea son la capacidad de hacer programación experimental y la capacidad de hacer programación no convencional.

Cuando haces AI, por definición, realmente no sabes lo que estás haciendo.(Si lo hiciera, no sería AI, ¿o sí?) Esto significa que quiere un lenguaje donde pueda probar cosas rápidamente y cambiarlas. No he encontrado ningún lenguaje que me guste más que Common Lisp para eso, personalmente.

Del mismo modo, estás haciendo algo no del todo convencional. Prolog ya es un lenguaje poco convencional, y Lisp tiene macros que pueden transformar enormemente el lenguaje.

Cuestiones relacionadas