stringtranslate.com

Синтез программы

В информатике синтез программ — это задача построения программы , которая доказуемо удовлетворяет заданной формальной спецификации высокого уровня . В отличие от проверки программ , программа должна быть построена , а не дана; однако обе области используют методы формального доказательства, и обе включают подходы с различной степенью автоматизации. В отличие от методов автоматического программирования , спецификации в синтезе программ обычно являются неалгоритмическими утверждениями в соответствующем логическом исчислении . [1]

Основное применение синтеза программ — освободить программиста от бремени написания правильного, эффективного кода, который удовлетворяет спецификации. Однако синтез программ также имеет приложения к супероптимизации и выводу инвариантов циклов . [2]

Источник

В 1957 году на Летнем институте символической логики в Корнеллском университете Алонзо Чёрч определил задачу синтеза схемы из математических требований. [3] Несмотря на то, что работа относится только к схемам, а не к программам, она считается одним из самых ранних описаний синтеза программ, и некоторые исследователи называют синтез программ «проблемой Чёрча». В 1960-х годах похожая идея для «автоматического программиста» была исследована исследователями в области искусственного интеллекта. [ необходима цитата ]

С тех пор различные исследовательские сообщества рассматривали проблему синтеза программ. Известные работы включают в себя подход теории автоматов 1969 года Бюхи и Ландвебера , [4] и работы Манны и Вальдингера (около 1980 года). Развитие современных языков программирования высокого уровня также можно понимать как форму синтеза программ.

Развитие 21 века

В начале 21 века в сообществе формальной верификации и смежных областях произошел всплеск практического интереса к идее синтеза программ . Армандо Солар-Лезама показал, что можно кодировать проблемы синтеза программ в булевой логике и использовать алгоритмы для проблемы выполнимости булевых уравнений для автоматического поиска программ. [5]

Синтез, управляемый синтаксисом

В 2013 году исследователи из UPenn , UC Berkeley и MIT предложили унифицированную структуру для задач синтеза программ под названием Syntax-guided Synthesis (стилизованный SyGuS) . [6] Входные данные для алгоритма SyGuS состоят из логической спецификации вместе с контекстно-свободной грамматикой выражений, которая ограничивает синтаксис допустимых решений. [7] Например, чтобы синтезировать функцию f , которая возвращает максимальное из двух целых чисел, логическая спецификация может выглядеть следующим образом:

( f ( x , y ) = xf ( x , y ) = y ) ∧ f ( x , y ) ≥ x ∧ f ( x , y ) ≥ y

и грамматика может быть такой:

< Эксп >  ::= x | y | 0 | 1 | < Эксп > + < Эксп > | ite( < Условие > , < Эксп > , < Эксп > ) < Условие >  ::=  < Эксп > <= < Эксп >

где "ite" означает "if-then-else". Выражение

ite(x <= y, y, x)

было бы правильным решением, поскольку оно соответствует грамматике и спецификации.

С 2014 по 2019 год ежегодный конкурс Syntax-Guided Synthesis Competition (или SyGuS-Comp) сравнивал различные алгоритмы синтеза программ в соревновательном мероприятии. [8] В соревновании использовался стандартизированный формат ввода SyGuS-IF, основанный на SMT-Lib 2. Например, следующий SyGuS-IF кодирует задачу синтеза максимального из двух целых чисел (как представлено выше):

(набор-логический LIA)(synth-fun f ((x Int) (y Int)) Int ((i Целое) (c Целое) (b Логическое)) ((i Int (cxy (+ ii) (ite bii))) (c Целое (0 1)) (b Бул ((<= ii)))))(объявить-var x Int)(объявить-var y Int)(ограничение (>= (fxy) x))(ограничение (>= (fxy) y))(ограничение (или (= (fxy) x) (= (fxy) y)))(чек-синтезатор)

Соответствующий решатель может вернуть следующий вывод:

((define-fun f ((x Int) (y Int)) Int (ite (<= xy) yx)))

Индуктивный синтез, управляемый контрпримером

Контрпримерный управляемый индуктивный синтез (CEGIS) — это эффективный подход к созданию синтезаторов звуковых программ. [9] [10] CEGIS включает взаимодействие двух компонентов: генератора , который генерирует программы-кандидаты, и верификатора , который проверяет, соответствуют ли кандидаты спецификации.

При заданном наборе входов I , наборе возможных программ P и спецификации S целью синтеза программы является нахождение программы p в P такой, что для всех входов i в I выполняется S ( p , i ). CEGIS параметризуется с помощью генератора и верификатора:

CEGIS запускает генератор и верификатор в цикле, накапливая контрпримеры:

Алгоритм cegis является  входным параметром : Генератор программ сгенерирует , верификатор проверить , спецификация спецификация , вывод : Программа, которая удовлетворяет спецификации , или неудача входные данные  := пустой набор цикл  кандидат  := сгенерировать ( спецификация , входные данные ) если  проверить ( спецификация , кандидат ) тогда  вернуть  кандидата  иначе  проверить выдает контрпример e добавить e к входным данным  конец if

Реализации CEGIS обычно используют решатели SMT в качестве верификаторов.

CEGIS был вдохновлен уточнением абстракции, направляемым контрпримерами (CEGAR). [11]

Структура Манны и Вальдингера

Структура Манны и Вальдингера , опубликованная в 1980 году, [12] [13] начинается с формулы спецификации первого порядка, заданной пользователем . Для этой формулы строится доказательство, тем самым также синтезируя функциональную программу из унифицирующих подстановок.

Структура представлена ​​в виде таблицы, столбцы которой содержат:

Первоначально в таблицу вводятся фоновые знания, предварительные условия и постусловия. После этого вручную применяются соответствующие правила доказательства. Фреймворк был разработан для улучшения читаемости промежуточных формул человеком: в отличие от классической резолюции , он не требует клаузальной нормальной формы , но позволяет рассуждать с формулами произвольной структуры и содержащими любые юнкторы (« неклаузальная резолюция »). Доказательство считается полным, когда выведено в столбце Цели или, что эквивалентно, в столбце Утверждения . Программы, полученные с помощью этого подхода, гарантированно удовлетворяют формуле спецификации, с которой началась; в этом смысле они являются правильными по построению . [14] Поддерживается только минималистский, но полный по Тьюрингу [15] чисто функциональный язык программирования , состоящий из условных, рекурсивных, арифметических и других операторов [примечание 3] . Исследования конкретных случаев, выполненные в рамках этой структуры, синтезировали алгоритмы для вычисления, например, деления , остатка , [16] квадратного корня , [17] объединения терминов , [18] ответов на запросы реляционной базы данных [19] и нескольких алгоритмов сортировки . [20] [21]

Правила доказательства

Правила доказательства включают в себя:

Например, строка 55 получается путем разрешения формул утверждения из 51 и из 52, которые обе имеют некоторую общую подформулу . Резольвента формируется как дизъюнкция , с заменой на , и , с заменой на . Эта резольвента логически следует из конъюнкции и . В более общем смысле, и необходимо иметь только две унифицируемые подформулы и , соответственно; их резольвента затем формируется из и как и прежде, где — наиболее общий унификатор и . Это правило обобщает разрешение предложений . [22]
Программные термины родительских формул объединяются, как показано в строке 58, для формирования выходных данных резольвенты. В общем случае применяется к последней также. Поскольку подформула появляется в выходных данных, необходимо соблюдать осторожность, чтобы разрешать только подформулы, соответствующие вычислимым свойствам.
Например, можно преобразовать в ) как в утверждениях, так и в целях, поскольку оба они эквивалентны.
Пример показан в строках 11–13 игрушечного примера ниже.
Это правило допускает синтез рекурсивных функций . Для заданного пред- и постусловия "Дано такое, что , найти такое, что ", и соответствующего заданного пользователем полного упорядочения области , всегда разумно добавить Утверждение " ". [23] Разрешение с помощью этого утверждения может ввести рекурсивный вызов в термине Программы.
Пример приведен в работе Манна, Вальдингера (1980), стр. 108-111, где синтезирован алгоритм вычисления частного и остатка двух заданных целых чисел с использованием порядка, определенного в (стр. 110).

Мюррей показал, что эти правила являются полными для логики первого порядка . [24] В 1986 году Манна и Уолдингер добавили обобщенные правила E-разрешения и парамодуляции , чтобы также обрабатывать равенство; [25] позже эти правила оказались неполными (но тем не менее верными ). [26]

Пример

В качестве игрового примера функциональная программа для вычисления максимального из двух чисел может быть получена следующим образом. [ необходима цитата ]

Начиная с описания требования " Максимум больше или равен любому заданному числу и является одним из заданных чисел " , формула первого порядка получается как ее формальный перевод. Эта формула должна быть доказана. С помощью обратной сколемизации [примечание 4] получается спецификация в строке 10, заглавная и строчная буквы обозначают переменную и константу Сколема соответственно.

После применения правила преобразования для распределительного закона в строке 11 целью доказательства является дизъюнкция, и, следовательно, ее можно разделить на два случая, а именно строки 12 и 13.

Возвращаясь к первому случаю, разрешение строки 12 с помощью аксиомы в строке 1 приводит к инстанциированию программной переменной в строке 14. Интуитивно, последний конъюнкт строки 12 предписывает значение, которое должно быть принято в этом случае. Формально, правило разрешения без предложения, показанное в строке 57 выше, применяется к строкам 12 и 1, с

что дает truefalse ) ∧ ( x ≤ x ∧ y ≤ x ∧ true , что упрощается до .

Аналогичным образом строка 14 дает строку 15, а затем строку 16 по разрешению. Кроме того, второй случай в строке 13 обрабатывается аналогично, в конечном итоге давая строку 18.

На последнем шаге оба случая (т. е. строки 16 и 18) объединяются с использованием правила разрешения из строки 58; чтобы сделать это правило применимым, потребовался подготовительный шаг 15→16. Интуитивно, строка 18 может быть прочитана как «в случае , вывод действителен (по отношению к исходной спецификации), в то время как строка 15 гласит «в случае , вывод действителен; шаг 15→16 установил, что оба случая 16 и 18 являются взаимодополняющими. [примечание 5] Поскольку обе строки 16 и 18 содержат программный термин, в столбце программы получается условное выражение . Поскольку формула цели была выведена, доказательство выполнено, и столбец программы строки « » содержит программу.

Смотрите также

Примечания

  1. ^ Различие «Утверждения» / «Цели» введено только для удобства; следуя парадигме доказательства от противного , Цель эквивалентна утверждению .
  2. ^ Когда и — формула Goal и термин Program в строке, соответственно, то во всех случаях, когда выполняется, — допустимый вывод синтезируемой программы. Этот инвариант поддерживается всеми правилами доказательства. Формула Assertion обычно не связана с термином Program.
  3. ^ С самого начала поддерживается только условный оператор ( ?: ). Однако можно добавлять произвольные новые операторы и отношения, предоставляя их свойства в качестве аксиом. В игрушечном примере ниже были аксиоматизированы только те свойства и , которые действительно нужны в доказательстве, в строках с 1 по 3.
  4. ^ В то время как обычная скулемизация сохраняет выполнимость, обратная скулемизация, т. е. замена универсально квантифицированных переменных функциями, сохраняет валидность.
  5. ^ Для этого нужна была аксиома 3; на самом деле, если бы не было общего порядка , то для несопоставимых входных данных не мог бы быть вычислен максимум .

Ссылки

  1. ^ Basin, D.; Deville, Y.; Flener, P.; Hamfelt, A.; Fischer Nilsson, J. (2004). «Синтез программ в вычислительной логике». В M. Bruynooghe и K.-K. Lau (ред.). Разработка программ в вычислительной логике . LNCS. Том 3049. Springer. стр. 30–65. CiteSeerX  10.1.1.62.4976 .
  2. ^ (Алур, Сингх и Фисман)
  3. ^ Алонзо Чёрч (1957). «Применение рекурсивной арифметики к проблеме синтеза схем». Резюме Летнего института символической логики . 1 : 3–50.
  4. ^ Ричард Бюхи, Лоуренс Ландвебер (апрель 1969 г.). «Решение последовательных условий с помощью стратегий конечных состояний». Труды Американского математического общества . 138 : 295–311. doi :10.2307/1994916. JSTOR  1994916.
  5. ^ (Солар-Лезама)
  6. ^ Alur, Rajeev; al., et (2013). «Синтаксически-управляемый синтез». Труды по формальным методам в автоматизированном проектировании . IEEE. стр. 8.
  7. ^ (Дэвид и Крёнинг)
  8. ^ SyGuS-Comp (Конкурс по синтаксическому синтезу)
  9. ^ (Солар-Лезама)
  10. ^ (Дэвид и Крёнинг)
  11. ^ (Солар-Лезама)
  12. ^ Зохар Манна, Ричард Уолдингер (январь 1980 г.). «Дедуктивный подход к синтезу программ». Труды ACM по языкам и системам программирования . 2 : 90–121. doi :10.1145/357084.357090. S2CID  14770735.
  13. ^ Зохар Манна и Ричард Уолдингер (декабрь 1978 г.). Дедуктивный подход к синтезу программ (PDF) (Техническая записка). SRI International. Архивировано (PDF) из оригинала 27 января 2021 г.
  14. ^ См. Manna, Waldinger (1980), стр. 100 о корректности правил разрешения.
  15. ^ Boyer, Robert S.; Moore, J. Strother (май 1983 г.). Механическое доказательство полноты Тьюринга чистого Lisp (PDF) (технический отчет). Институт вычислительной науки, Техасский университет в Остине. 37. Архивировано (PDF) из оригинала 22 сентября 2017 г.
  16. ^ Манна, Вальдингер (1980), стр.108-111
  17. ^ Зохар Манна и Ричард Уолдингер (август 1987 г.). «Происхождение парадигмы бинарного поиска». Наука компьютерного программирования . 9 (1): 37–83. doi :10.1016/0167-6423(87)90025-6.
  18. ^ Даниэле Нарди (1989). «Формальный синтез алгоритма унификации методом дедуктивной таблицы». Журнал логического программирования . 7 : 1–43. doi :10.1016/0743-1066(89)90008-3.
  19. ^ Даниэле Нарди и Риккардо Розати (1992). «Дедуктивный синтез программ для ответов на запросы». В Кунг-Киу Лау и Тим Клемент (ред.). Международный семинар по синтезу и преобразованию логических программ (LOPSTR) . Семинары по вычислениям. Springer. стр. 15–29. doi :10.1007/978-1-4471-3560-9_2.
  20. ^ Джонатан Трауготт (1986). «Дедуктивный синтез программ сортировки». Труды Международной конференции по автоматизированной дедукции . LNCS . Т. 230. Springer. С. 641–660.
  21. Джонатан Трауготт (июнь 1989 г.). «Дедуктивный синтез программ сортировки». Журнал символических вычислений . 7 (6): 533–572. doi :10.1016/S0747-7171(89)80040-9.
  22. ^ Манна, Вальдингер (1980), стр.99
  23. ^ Манна, Вальдингер (1980), стр.104
  24. ^ Manna, Waldinger (1980), стр. 103, ссылаясь на: Neil V. Murray (февраль 1979). Процедура доказательства для безквантовой неклаузальной логики первого порядка (технический отчет). Syracuse Univ. 2-79.
  25. ^ Зохар Манна, Ричард Уолдингер (январь 1986 г.). «Специальные отношения в автоматизированной дедукции». Журнал ACM . 33 : 1–59. doi : 10.1145/4904.4905 . S2CID  15140138.
  26. ^ Зохар Манна, Ричард Уолдингер (1992). «Правила специальных отношений неполны». Proc. CADE 11. LNCS. Том 607. Springer. С. 492–506.