Индуктивное программирование ( ИП ) — это особая область автоматического программирования , охватывающая исследования в области искусственного интеллекта и программирования , которая занимается изучением обычно декларативных ( логических или функциональных ) и часто рекурсивных программ на основе неполных спецификаций, таких как примеры ввода/вывода или ограничения.
В зависимости от используемого языка программирования существует несколько видов индуктивного программирования. Индуктивное функциональное программирование , которое использует функциональные языки программирования, такие как Lisp или Haskell , и в особенности индуктивное логическое программирование , которое использует языки логического программирования, такие как Prolog и другие логические представления, такие как дескриптивная логика , были более известны, но использовались также и другие парадигмы языка (программирования), такие как программирование в ограничениях или вероятностное программирование .
Индуктивное программирование включает в себя все подходы, которые связаны с обучением программ или алгоритмов из неполных ( формальных ) спецификаций. Возможные входы в системе IP представляют собой набор обучающих входов и соответствующих выходов или выходную оценочную функцию, описывающую желаемое поведение предполагаемой программы, трассы или последовательности действий, которые описывают процесс вычисления определенных выходов, ограничения для программы, которые должны быть вызваны относительно ее временной эффективности или ее сложности, различные виды фоновых знаний, такие как стандартные типы данных , предопределенные функции, которые должны использоваться, схемы программ или шаблоны, описывающие поток данных предполагаемой программы, эвристики для руководства поиском решения или другие предубеждения.
Выходные данные IP-системы представляют собой программу на некотором произвольном языке программирования, содержащую условные операторы и циклические или рекурсивные управляющие структуры, или любой другой вид языка представления Тьюринга .
Во многих приложениях выходная программа должна быть корректной по отношению к примерам и частичной спецификации, и это приводит к рассмотрению индуктивного программирования как особой области внутри автоматического программирования или синтеза программ , [1] [2] обычно противопоставляемой «дедуктивному» синтезу программ, [3] [4] [5] , где спецификация обычно является полной.
В других случаях индуктивное программирование рассматривается как более общая область, где может использоваться любой декларативный язык программирования или представления, и мы даже можем иметь некоторую степень ошибки в примерах, как в общем машинном обучении , более конкретной области анализа структуры или области символического искусственного интеллекта . Отличительной чертой является количество примеров или необходимая частичная спецификация. Как правило, методы индуктивного программирования могут изучаться всего на нескольких примерах.
Разнообразие индуктивного программирования обычно обусловлено приложениями и используемыми языками: помимо логического программирования и функционального программирования, в индуктивном программировании использовались или предлагались другие парадигмы программирования и языки представления, такие как функциональное логическое программирование , программирование в ограничениях , вероятностное программирование , абдуктивное логическое программирование , модальная логика , языки действий , языки агентов и многие типы императивных языков .
Исследования по индуктивному синтезу рекурсивных функциональных программ начались в начале 1970-х годов и были поставлены на прочную теоретическую основу с основополагающей системой THESIS Саммерса [6] и работой Бирманна. [7] Эти подходы были разделены на две фазы: во-первых, примеры ввода-вывода преобразуются в нерекурсивные программы (трассы) с использованием небольшого набора базовых операторов; во-вторых, закономерности в трассах ищутся и используются для их сворачивания в рекурсивную программу. Основные результаты до середины 1980-х годов рассмотрены Смитом. [8] Из-за ограниченного прогресса в отношении диапазона программ, которые можно было синтезировать, исследовательская деятельность значительно сократилась в следующем десятилетии.
Появление логического программирования принесло новый импульс, а также новое направление в начале 1980-х годов, особенно благодаря системе MIS Шапиро [9], в конечном итоге породившей новую область индуктивного логического программирования (ILP). [10] Ранние работы Плоткина [11] [12] и его « относительное наименьшее общее обобщение (rlgg) » оказали огромное влияние на индуктивное логическое программирование. Большая часть работ ILP посвящена более широкому классу проблем, поскольку основное внимание уделяется не только рекурсивным логическим программам, но и машинному обучению символических гипотез из логических представлений. Однако были некоторые обнадеживающие результаты по обучению рекурсивным программам Prolog, таким как быстрая сортировка из примеров, вместе с подходящими фоновыми знаниями, например, с GOLEM. [13] Но снова, после первоначального успеха, сообщество было разочаровано ограниченным прогрессом в индукции рекурсивных программ [14] [15] [16], поскольку ILP все меньше и меньше фокусировался на рекурсивных программах и все больше и больше склонялся к настройке машинного обучения с приложениями в реляционном анализе данных и обнаружении знаний. [17]
Параллельно с работой в ILP, Коза [18] предложил генетическое программирование в начале 1990-х годов как подход к обучению программ на основе генерации и тестирования. Идея генетического программирования получила дальнейшее развитие в системе индуктивного программирования ADATE [19] и системе MagicHaskeller на основе систематического поиска. [20] Здесь снова функциональные программы изучаются на основе наборов положительных примеров вместе с функцией оценки выходных данных (фитнеса), которая определяет желаемое поведение входных/выходных данных обучаемой программы.
Ранние работы по индукции грамматики (также известной как грамматический вывод) связаны с индуктивным программированием, поскольку переписывание систем или логических программ может использоваться для представления правил производства. Фактически, ранние работы по индуктивному выводу рассматривали индукцию грамматики и вывод программы Lisp как в основном одну и ту же проблему. [21] Результаты с точки зрения обучаемости были связаны с классическими концепциями, такими как идентификация-в-пределе, как представлено в основополагающей работе Голда. [22] Совсем недавно проблема изучения языка была рассмотрена сообществом индуктивного программирования. [23] [24]
В последние годы классические подходы были возобновлены и развиты с большим успехом. Поэтому проблема синтеза была переформулирована на основе систем переписывания терминов на основе конструкторов с учетом современных методов функционального программирования, а также умеренного использования стратегий поиска и использования фоновых знаний, а также автоматического изобретения подпрограмм. В последнее время появилось много новых и успешных приложений за пределами синтеза программ, особенно в области манипулирования данными, программирования по примерам и когнитивного моделирования (см. ниже).
Другие идеи также были исследованы с общей характеристикой использования декларативных языков для представления гипотез. Например, использование признаков более высокого порядка, схем или структурированных расстояний было предложено для лучшей обработки рекурсивных типов данных и структур; [25] [26] [27] абстракция также была исследована как более мощный подход к кумулятивному обучению и изобретению функций. [28] [29]
Одной из мощных парадигм, которая недавно использовалась для представления гипотез в индуктивном программировании (обычно в форме генеративных моделей ), является вероятностное программирование (и связанные с ним парадигмы, такие как стохастические логические программы и байесовское логическое программирование). [30] [31] [29] [32]
Первый семинар по подходам и приложениям индуктивного программирования (AAIP), проведенный совместно с ICML 2005, определил все приложения, где «требуется изучение программ или рекурсивных правил, [...] прежде всего в области разработки программного обеспечения, где структурное обучение, программные помощники и программные агенты могут помочь освободить программистов от рутинных задач, оказать поддержку в программировании конечным пользователям или поддержку начинающим программистам и системам обучения программированию. Другими областями применения являются изучение языка, изучение правил рекурсивного управления для планирования ИИ, изучение рекурсивных концепций в веб-майнинге или для преобразований форматов данных».
С тех пор эти и многие другие области оказались успешными нишами для применения индуктивного программирования, такими как программирование для конечного пользователя [33] , смежные области программирования на примерах [34] и программирования путем демонстрации [35] , а также интеллектуальные обучающие системы .
Другие области, в которых недавно применялся индуктивный вывод, включают приобретение знаний , [36] искусственный интеллект в целом , [37] обучение с подкреплением и оценку теорий, [38] [39] и когнитивную науку в целом. [40] [32] Также могут быть перспективные приложения в интеллектуальных агентах, играх, робототехнике, персонализации, окружающем интеллекте и человеческих интерфейсах.
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{cite journal}}
: Цитировать журнал требует |journal=
( помощь )