Program synthesis -- the automatic generation of code given a specification -- is one of the most fundamental tasks in artificial intelligence (AI) and many programmers' dream. Numerous synthesizers have been developed to tackle program synthesis, manifesting different ideas to approach the exponentially growing program space. While numerous smart program synthesis tools exist, reusing and remixing previously developed methods is tedious and time-consuming. We propose Herb.jl, a unifying program synthesis library written in the Julia programming language, to address these issues. Since current methods rely on similar building blocks, we aim to modularize the underlying synthesis algorithm into communicating and fully extendable sub-compartments, allowing for straightforward reapplication of these modules. To demonstrate the benefits of using Herb.jl, we show three common use cases: 1. how to implement a simple problem and grammar, and how to solve it, 2. how to implement a previously developed synthesizer with just a few lines of code, and 3. how to run a synthesizer against a benchmark.
academic
Herb.jl: Унифицированная библиотека синтеза программ
Синтез программ — автоматическое создание кода на основе заданной спецификации — является одной из фундаментальных задач в искусственном интеллекте и давней мечтой многих программистов. Хотя разработано множество интеллектуальных инструментов синтеза программ для работы с экспоненциально растущим пространством программ, повторное использование и переосмысление существующих методов остаются утомительными и трудозатратными. В данной статье предлагается Herb.jl — унифицированная библиотека синтеза программ, написанная на языке программирования Julia, для решения этих проблем. Поскольку существующие методы опираются на сходные строительные блоки, авторы стремятся модуляризировать базовые алгоритмы синтеза в коммуникативные и полностью расширяемые подкомпоненты, позволяя прямое переприменение этих модулей.
Область синтеза программ сталкивается с четырьмя основными проблемами:
Специфичность для предметной области: реализации синтезаторов обычно разработаны для конкретного языка и плохо адаптируются к новым синтаксическим правилам
Недостаточная модульность: одинаковые строительные блоки невозможно легко переиспользовать, исследователи вынуждены повторно реализовывать одни и те же идеи
Сложность сравнения: из-за различий в инженерных решениях сравнение методов часто сводится к сравнению качества реализации
Сложность переиспользования тестовых наборов: выбор синтаксических правил для тестовых наборов часто остается неявным, что влияет на справедливость сравнения
Предложение Herb.jl: новая унифицированная библиотека синтеза программ, написанная на Julia
Демонстрация модульной реализации: показано, как легко реализовать существующие синтезаторы с использованием Herb.jl
Предоставление стандартизированных тестовых наборов: переиспользование стандартных тестовых наборов в человекочитаемом и расширяемом формате
Обобщение принципов проектирования: описание руководящих принципов проектирования в Herb.jl, имеющих справочную ценность для других реализаций синтезаторов
# Определение спецификации вход-выход
problem = Problem([
IOExample(Dict(:x => 0), 1),
IOExample(Dict(:x => 1), 3),
IOExample(Dict(:x => 2), 5),
IOExample(Dict(:x => 3), 7)
])
# Определение грамматики
grammar = @cfgrammar begin
Int = 1 | 2 | x
Int = Int + Int
Int = Int * Int
end
# Выполнение поиска
iterator = BFSIterator(grammar, :Int, max_depth=5)
solution, flag = synth(problem, iterator)
using HerbBenchmarks
pairs = get_all_problem_grammar_pairs(PBE_SLIA_Track_2019)
solved_problems = 0
for (problem, grammar) in pairs
solution = probe(grammar, :Start, problem; max_depth=5)
if !isnothing(solution)
solved_problems += 1
end
end
Статья цитирует важные работы в области синтеза программ, включая:
Тестовые наборы конкурса SyGuS (Padhi et al., 2019)
Алгоритм Probe (Barke et al., 2020)
Синтезатор FrAngel (Shi et al., 2019)
Синтезатор Neo (Feng et al., 2018)
Обзор синтеза программ (Gulwani et al., 2017)
Общая оценка: Это высококачественная системная статья, предлагающая давно необходимый унифицированный фреймворк для области синтеза программ. Хотя в экспериментальной оценке есть место для улучшения, его технический вклад и практическая ценность являются выдающимися и, вероятно, станут важной инфраструктурой в этой области.