Синтез программы - Program synthesis
В информатике , синтез программы является задача построить программу , которая доказуемо удовлетворяет данность высокого уровня формальной спецификации . В отличие от проверки программы , программа должна быть построена, а не дана; однако в обеих областях используются формальные методы доказательства, и обе включают подходы с разной степенью автоматизации. В отличие от автоматического программирования методов, спецификации в синтезе программ, как правило , не- алгоритмические утверждения в соответствующем логическом исчислении .
Источник
Во время Летнего института символической логики в Корнельском университете в 1957 году Алонзо Черч сформулировал задачу синтеза схемы на основе математических требований. Несмотря на то, что работа относится только к схемам, а не к программам, эта работа считается одним из самых ранних описаний синтеза программ, и некоторые исследователи называют синтез программ «проблемой Чёрча». В 1960-х годах аналогичная идея для «автоматического программиста» была изучена исследователями искусственного интеллекта.
С тех пор различные исследовательские сообщества рассмотрели проблему синтеза программ. Известные работы включают теоретико-автоматный подход Бюхи и Ландвебера 1969 г. , а также работы Манна и Вальдингера (ок. 1980 г.). Развитие современных языков программирования высокого уровня также можно понимать как форму синтеза программ.
События 21 века
В начале 21 века наблюдался всплеск практического интереса к идее программного синтеза в сообществе формальной верификации и в смежных областях. Армандо Солар-Лезама показал, что можно закодировать задачи синтеза программ в булевой логике и использовать алгоритмы для задачи булевой выполнимости для автоматического поиска программ. В 2013 году исследователи из UPenn , Калифорнийского университета в Беркли и Массачусетского технологического института предложили унифицированную основу для задач синтеза программ . С 2014 года проводится ежегодное соревнование по синтаксису программ, в котором сравниваются различные алгоритмы синтеза программ на соревнованиях, соревнование по синтаксическому синтезу или SyGuS-Comp. Тем не менее, доступные алгоритмы способны синтезировать только небольшие программы.
Каркас Манна и Вальдингера
№ | Утверждения | Цели | Программа | Источник |
---|---|---|---|---|
51 | ||||
52 | ||||
53 | s | |||
54 | т | |||
55 | Решимость (51,52) | |||
56 | s | Решимость (52,53) | ||
57 год | s | Решимость (53,52) | ||
58 | п ? s : t | Решимость (53,54) |
Структура Манна и Вальдингера , опубликованная в 1980 году, начинается с заданной пользователем формулы спецификации первого порядка . Для этой формулы строится доказательство, тем самым синтезируя функциональную программу из унифицирующих замен.
Фреймворк представлен в виде таблицы, столбцы которой содержат:
- Номер строки («Nr») для справки.
- Формулы, которые уже были установлены, включая аксиомы и предварительные условия, («Утверждения»)
- Формулы еще предстоит доказать, включая постусловия, («Цели»),
- Термины, обозначающие допустимое выходное значение («Программа»)
- Обоснование текущей строки («Исходная точка»)
Первоначально в таблицу вводятся базовые знания, предварительные и пост-условия. После этого соответствующие правила проверки применяются вручную. Фреймворк был разработан для повышения читабельности промежуточных формул для человека: в отличие от классического разрешения , он не требует клаузальной нормальной формы , но позволяет рассуждать с помощью формул произвольной структуры и содержащих любые соединительные элементы (« неклаузальное разрешение »). Доказательство завершено, если оно было выведено в столбце « Цели» или, что то же самое, в столбце « Утверждения» . Программы, полученные с помощью этого подхода, гарантированно удовлетворяют формуле спецификации, начиная с; в этом смысле они правильны по построению . Только минималистский, но Тьюринг , чисто функциональный язык программирования , состоящий из условной, рекурсии и арифметических и других операторов поддерживаются. В тематических исследованиях, выполненных в рамках этой структуры, были синтезированы алгоритмы для вычисления, например, деления , остатка , квадратного корня , объединения терминов , ответов на запросы реляционной базы данных и нескольких алгоритмов сортировки .
Правила доказательства
Правила доказательства включают:
- Неклаузальное разрешение (см. Таблицу).
- Например, строка 55 получается путем разрешения формул утверждения из 51 и 52, которые имеют общие подформулы . Резольвента формируется как дизъюнкция , с замененной на , и с замененной на . Эта резольвента логически следует из конъюнкции и . В более общем плане и необходимо иметь только две унифицируемые подформулы и , соответственно; их резольвентное затем формируется из и , как и раньше, где это наиболее общий объединитель из и . Это правило обобщает разрешение статей .
- Термины программы родительских формул объединяются, как показано в строке 58, для формирования выходных данных резольвенты. В общем случае применяется и к последнему. Поскольку подформула появляется в выходных данных, необходимо проявлять осторожность, чтобы разрешить только подформулы, соответствующие вычислимым свойствам.
- Логические преобразования.
- Например, можно преобразовать в ) как в утверждениях, так и в целях, поскольку оба они эквивалентны.
- Разделение конъюнктивных утверждений и дизъюнктивных целей.
- Пример показан в строках с 11 по 13 приведенного ниже примера игрушки.
- Это правило позволяет синтезировать рекурсивные функции . Для заданного предусловия и постусловия «Учитывая такое, что найти такое, что » и соответствующего заданного пользователем правильного упорядочивания домена всегда целесообразно добавить Утверждение « ». Разрешение этого утверждения может привести к рекурсивному вызову в термине Program.
- Пример приведен в Manna, Waldinger (1980), p.108-111, где синтезирован алгоритм для вычисления частного и остатка от двух заданных целых чисел с использованием правильного порядка, определенного (p.110).
Мюррей показал, что эти правила полны для логики первого порядка . В 1986 году Манна и Уолдингер добавили обобщенные правила E-разрешения и парамодуляции, чтобы также обеспечить равенство; позже эти правила оказались неполными (но, тем не менее, здравыми ).
Пример
№ | Утверждения | Цели | Программа | Источник |
---|---|---|---|---|
1 | Аксиома | |||
2 | Аксиома | |||
3 | Аксиома | |||
10 | M | Технические характеристики | ||
11 | M | Distr (10) | ||
12 | M | С разрезом (11) | ||
13 | M | С разрезом (11) | ||
14 | Икс | Решимость (12,1) | ||
15 | Икс | Решимость (14,2) | ||
16 | Икс | Решимость (15,3) | ||
17 | у | Решимость (13,1) | ||
18 | у | Решимость (17,2) | ||
19 | х <у ? у : х | Решимость (18,16) |
В качестве примера игрушки, функциональная программа для вычисления максимума двух чисел , и может быть получена следующим образом .
Исходя из описания требования « Максимум больше или равен любому заданному числу и является одним из заданных чисел », формула первого порядка получается как ее формальный перевод. Эта формула требует доказательства. Путем обратной сколемизации получается спецификация в строке 10, где прописные и строчные буквы обозначают переменную и константу Сколема соответственно.
После применения правила преобразования для закона распределения в строке 11 целью доказательства является дизъюнкция, и поэтому его можно разделить на два случая, а именно. строки 12 и 13.
Обращаясь к первому случаю, сопоставление строки 12 с аксиомой в строке 1 приводит к созданию экземпляра программной переменной в строке 14. Интуитивно последний конъюнкт строки 12 задает значение, которое должно принимать в этом случае. Формально правило разрешения отсутствия клауза, показанное в строке 57 выше, применяется к строкам 12 и 1, при этом
- p является общим экземпляром x = x для A = A и x = M , полученным синтаксическим объединением последних формул,
- Р [ р ] является истинным ∧ х = х , получается из конкретизированной линии 1 (соответственно дополняетсячтобы сделать контекст F [⋅] вокруг р видно), и
- G [ p ] является x ≤ x ∧ y ≤ x ∧ x = x , полученным из созданной строки 12,
дает истину ∧ ложь ) ∧ ( x ≤ x ∧ y ≤ x ∧ true , что упрощается до .
Аналогичным образом строка 14 дает строку 15, а затем строку 16 по разрешению. Кроме того, второй случай в строке 13 обрабатывается аналогичным образом, в результате чего получается строка 18.
На последнем этапе оба случая (т.е. строки 16 и 18) объединяются с использованием правила разрешения из строки 58; Чтобы применить это правило, был необходим подготовительный шаг 15 → 16. Интуитивно строка 18 может быть прочитана как «в случае , если выходные данные действительны (относительно исходной спецификации), а в строке 15 говорится:« в случае , если выходные данные действительны »; на шаге 15 → 16 установлено, что оба случая 16 и 18 дополняют друг друга. Поскольку обе строки 16 и 18 содержат термин программы, условное выражение приводит к столбцу программы. Поскольку формула цели была получена, доказательство выполнено, и столбец программы в строке " " содержит программу.
Смотрите также
- Индуктивное программирование
- Метапрограммирование
- Вывод программы
- Программирование на естественном языке
- Реактивный синтез
Примечания
использованная литература
- Зохар Манна, Ричард Уолдингер (1975). «Знание и рассуждение в синтезе программ». Искусственный интеллект . 6 (2): 175–208. DOI : 10.1016 / 0004-3702 (75) 90008-9 .