La programación inductiva ( PI ) es un área especial de la programación automática , que abarca la investigación de la inteligencia artificial y la programación , que aborda el aprendizaje de programas típicamente declarativos ( lógicos o funcionales ) y a menudo recursivos a partir de especificaciones incompletas, como ejemplos de entrada/salida o restricciones.
Dependiendo del lenguaje de programación utilizado, existen varios tipos de programación inductiva. La programación funcional inductiva , que utiliza lenguajes de programación funcional como Lisp o Haskell , y más especialmente la programación lógica inductiva , que utiliza lenguajes de programación lógica como Prolog y otras representaciones lógicas como lógicas descriptivas , han sido las más destacadas, pero también se han utilizado otros paradigmas de lenguajes (de programación), como la programación con restricciones o la programación probabilística .
La programación inductiva incorpora todos los enfoques que se ocupan de aprender programas o algoritmos a partir de especificaciones incompletas ( formales ). Las posibles entradas en un sistema IP son un conjunto de entradas de entrenamiento y salidas correspondientes o una función de evaluación de salida, que describe el comportamiento deseado del programa previsto, rastros o secuencias de acción que describen el proceso de cálculo de salidas específicas, restricciones para el programa que se inducirá en relación con su eficiencia temporal o su complejidad, varios tipos de conocimiento previo como tipos de datos estándar , funciones predefinidas que se utilizarán, esquemas de programa o plantillas que describan el flujo de datos del programa previsto, heurísticas para guiar la búsqueda de una solución u otros sesgos.
La salida de un sistema IP es un programa en algún lenguaje de programación arbitrario que contiene condicionales y estructuras de control recursivas o de bucle, o cualquier otro tipo de lenguaje de representación Turing-completo .
En muchas aplicaciones, el programa de salida debe ser correcto con respecto a los ejemplos y la especificación parcial, y esto lleva a considerar la programación inductiva como un área especial dentro de la programación automática o síntesis de programas , [1] [2] generalmente opuesta a la síntesis de programas 'deductiva', [3] [4] [5] donde la especificación suele ser completa.
En otros casos, la programación inductiva se considera un área más general donde se puede utilizar cualquier lenguaje de representación o programación declarativa e incluso podemos tener algún grado de error en los ejemplos, como en el aprendizaje automático general , el área más específica de minería de estructuras o el área de inteligencia artificial simbólica . Una característica distintiva es la cantidad de ejemplos o especificación parcial necesaria. Por lo general, las técnicas de programación inductiva pueden aprender a partir de solo unos pocos ejemplos.
La diversidad de la programación inductiva generalmente proviene de las aplicaciones y los lenguajes que se utilizan: además de la programación lógica y la programación funcional, se han utilizado o sugerido otros paradigmas de programación y lenguajes de representación en la programación inductiva, como la programación lógica funcional , la programación por restricciones , la programación probabilística , la programación lógica abductiva , la lógica modal , los lenguajes de acción , los lenguajes de agente y muchos tipos de lenguajes imperativos .
La investigación sobre la síntesis inductiva de programas funcionales recursivos comenzó a principios de los años 1970 y alcanzó bases teóricas sólidas con el sistema seminal THESIS de Summers [6] y el trabajo de Biermann [7] . Estos enfoques se dividieron en dos fases: primero, los ejemplos de entrada-salida se transforman en programas no recursivos (trazas) utilizando un pequeño conjunto de operadores básicos; segundo, se buscan regularidades en las trazas y se utilizan para plegarlas en un programa recursivo. Los principales resultados hasta mediados de los años 1980 son examinados por Smith [8] . Debido al progreso limitado con respecto a la gama de programas que se podían sintetizar, las actividades de investigación disminuyeron significativamente en la década siguiente.
El advenimiento de la programación lógica trajo consigo un nuevo impulso pero también una nueva dirección a principios de los años 1980, especialmente debido al sistema MIS de Shapiro [9] que eventualmente generó el nuevo campo de la programación lógica inductiva (ILP). [10] Los primeros trabajos de Plotkin, [11] [12] y su " generalización relativa mínima general (rlgg) ", tuvieron un enorme impacto en la programación lógica inductiva. La mayor parte del trabajo de ILP aborda una clase más amplia de problemas, ya que el enfoque no solo está en programas lógicos recursivos sino en el aprendizaje automático de hipótesis simbólicas a partir de representaciones lógicas. Sin embargo, hubo algunos resultados alentadores en el aprendizaje de programas Prolog recursivos como quicksort a partir de ejemplos junto con el conocimiento previo adecuado, por ejemplo con GOLEM. [13] Pero nuevamente, después del éxito inicial, la comunidad se decepcionó por el progreso limitado sobre la inducción de programas recursivos [14] [15] [16] con ILP cada vez menos enfocándose en programas recursivos y inclinándose cada vez más hacia un entorno de aprendizaje automático con aplicaciones en minería de datos relacionales y descubrimiento de conocimiento. [17]
En paralelo al trabajo en ILP, Koza [18] propuso la programación genética a principios de los años 1990 como un enfoque basado en la generación y prueba de programas de aprendizaje. La idea de la programación genética se desarrolló aún más en el sistema de programación inductiva ADATE [19] y el sistema basado en búsqueda sistemática MagicHaskeller [20] . Aquí nuevamente, los programas funcionales se aprenden a partir de conjuntos de ejemplos positivos junto con una función de evaluación de salida (aptitud) que especifica el comportamiento de entrada/salida deseado del programa que se va a aprender.
Los primeros trabajos en inducción gramatical (también conocida como inferencia gramatical) están relacionados con la programación inductiva, ya que se pueden utilizar sistemas de reescritura o programas lógicos para representar reglas de producción. De hecho, los primeros trabajos en inferencia inductiva consideraban que la inducción gramatical y la inferencia de programas Lisp eran básicamente el mismo problema. [21] Los resultados en términos de capacidad de aprendizaje se relacionaban con conceptos clásicos, como la identificación en el límite, tal como se introdujo en el trabajo seminal de Gold. [22] Más recientemente, la comunidad de programación inductiva abordó el problema del aprendizaje de idiomas. [23] [24]
En los últimos años, los enfoques clásicos se han retomado y avanzado con gran éxito. Por lo tanto, el problema de síntesis se ha reformulado sobre la base de sistemas de reescritura de términos basados en constructores, teniendo en cuenta las técnicas modernas de programación funcional, así como el uso moderado de estrategias basadas en búsqueda y el uso de conocimientos previos, así como la invención automática de subprogramas. Recientemente han aparecido muchas aplicaciones nuevas y exitosas más allá de la síntesis de programas, especialmente en el área de manipulación de datos, programación por ejemplo y modelado cognitivo (ver más abajo).
También se han explorado otras ideas con la característica común de utilizar lenguajes declarativos para la representación de hipótesis. Por ejemplo, se ha defendido el uso de características de orden superior, esquemas o distancias estructuradas para un mejor manejo de estructuras y tipos de datos recursivos ; [25] [26] [27] también se ha explorado la abstracción como un enfoque más potente para el aprendizaje acumulativo y la invención de funciones. [28] [29]
Un paradigma poderoso que se ha utilizado recientemente para la representación de hipótesis en programación inductiva (generalmente en forma de modelos generativos ) es la programación probabilística (y paradigmas relacionados, como los programas de lógica estocástica y la programación lógica bayesiana). [30] [31] [29] [32]
El primer taller sobre Enfoques y aplicaciones de la programación inductiva (AAIP, por sus siglas en inglés), celebrado en conjunto con ICML 2005, identificó todas las aplicaciones en las que "se requiere el aprendizaje de programas o reglas recursivas, [...] primero en el dominio de la ingeniería de software, donde el aprendizaje estructural, los asistentes de software y los agentes de software pueden ayudar a aliviar a los programadores de tareas rutinarias, brindar soporte de programación a los usuarios finales o brindar soporte a programadores novatos y sistemas de tutoría de programación. Otras áreas de aplicación son el aprendizaje de idiomas, el aprendizaje de reglas de control recursivas para la planificación de IA, el aprendizaje de conceptos recursivos en minería web o para transformaciones de formatos de datos".
Desde entonces, estas y muchas otras áreas han demostrado ser nichos de aplicación exitosos para la programación inductiva, como la programación del usuario final , [33] las áreas relacionadas de programación por ejemplo [34] y programación por demostración , [35] y sistemas de tutoría inteligente .
Otras áreas en las que se ha aplicado recientemente la inferencia inductiva son la adquisición de conocimiento , [36] la inteligencia artificial general , [37] el aprendizaje por refuerzo y la evaluación de teorías, [38] [39] y la ciencia cognitiva en general. [40] [32] También puede haber aplicaciones prospectivas en agentes inteligentes, juegos, robótica, personalización, inteligencia ambiental e interfaces humanas.
{{cite journal}}
: Requiere citar revista |journal=
( ayuda ){{cite journal}}
: Requiere citar revista |journal=
( ayuda )