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 : Une Bibliothèque Unifiée de Synthèse de Programmes
La synthèse de programmes — la génération automatique de code selon une spécification donnée — est l'une des tâches fondamentales de l'intelligence artificielle et le rêve de nombreux programmeurs. Bien que de nombreux outils intelligents de synthèse de programmes aient été développés pour traiter l'espace exponentiel des programmes, la réutilisation et la recombinaison des méthodes existantes sont fastidieuses et chronophages. Cet article propose Herb.jl, une bibliothèque unifiée de synthèse de programmes écrite en langage de programmation Julia pour résoudre ces problèmes. Puisque les méthodes existantes reposent sur des blocs de construction similaires, les auteurs visent à modulariser les algorithmes de synthèse sous-jacents en sous-composants communicants et entièrement extensibles, permettant ainsi une réapplication directe de ces modules.
Le domaine de la synthèse de programmes fait face à quatre problèmes majeurs :
Spécificité au domaine : Les implémentations de synthétiseurs sont généralement conçues pour des langages spécifiques et s'adaptent difficilement aux nouvelles règles syntaxiques
Modularité insuffisante : Les mêmes blocs de construction ne peuvent pas être facilement réutilisés, obligeant les chercheurs à réimplémenter les mêmes idées
Difficulté de comparaison : En raison des différences dans les choix d'ingénierie, la comparaison des méthodes dégénère souvent en comparaison de la qualité d'implémentation
Difficultés de réutilisation des benchmarks : Les choix de règles syntaxiques des benchmarks sont souvent implicites, affectant les comparaisons équitables
Proposition de Herb.jl : Une nouvelle bibliothèque unifiée de synthèse de programmes écrite en langage Julia
Démonstration d'implémentations modulaires : Illustration de la façon d'implémenter facilement des synthétiseurs existants avec Herb.jl
Fourniture de benchmarks standardisés : Réimplémentation de benchmarks standards dans un format lisible par l'homme et extensible
Résumé des principes de conception : Énumération des principes de conception directeurs dans Herb.jl, servant de référence pour d'autres implémentations de synthétiseurs
# Définir une spécification entrée-sortie
problem = Problem([
IOExample(Dict(:x => 0), 1),
IOExample(Dict(:x => 1), 3),
IOExample(Dict(:x => 2), 5),
IOExample(Dict(:x => 3), 7)
])
# Définir la grammaire
grammar = @cfgrammar begin
Int = 1 | 2 | x
Int = Int + Int
Int = Int * Int
end
# Exécuter la recherche
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
L'article cite des travaux importants dans le domaine de la synthèse de programmes, notamment :
Benchmarks de compétition SyGuS (Padhi et al., 2019)
Algorithme Probe (Barke et al., 2020)
Synthétiseur FrAngel (Shi et al., 2019)
Synthétiseur Neo (Feng et al., 2018)
Synthèse de programmes : aperçu (Gulwani et al., 2017)
Évaluation Globale : Ceci est un article de haute qualité présentant un cadre unifié dont le domaine de la synthèse de programmes a grand besoin. Bien qu'il y ait place pour amélioration dans l'évaluation expérimentale, ses contributions techniques et sa valeur pratique sont remarquables, et il devrait devenir une infrastructure importante dans ce domaine.