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: Una Libreria Unificata di Sintesi di Programmi
La sintesi di programmi — la generazione automatica di codice secondo specifiche date — è uno dei compiti più fondamentali dell'intelligenza artificiale e il sogno di molti programmatori. Sebbene siano stati sviluppati numerosi strumenti intelligenti di sintesi di programmi per affrontare lo spazio esponenziale dei programmi, il riutilizzo e la ricombinazione dei metodi esistenti risultano laboriosi e dispendiosi in termini di tempo. Questo articolo propone Herb.jl, una libreria unificata di sintesi di programmi scritta nel linguaggio di programmazione Julia per affrontare questi problemi. Poiché i metodi esistenti si basano su blocchi costruttivi simili, gli autori mirano a modularizzare gli algoritmi di sintesi sottostanti in sottocomponenti comunicabili e completamente estensibili, consentendo il riutilizzo diretto di questi moduli.
Il campo della sintesi di programmi affronta quattro problemi principali:
Specificità del Dominio: Le implementazioni di sintetizzatori sono solitamente progettate per linguaggi specifici, difficili da adattare a nuove regole sintattiche
Modularità Insufficiente: Gli stessi blocchi costruttivi non possono essere facilmente riutilizzati, i ricercatori devono reimplementare ripetutamente le stesse idee
Difficoltà di Confronto: A causa delle differenze nelle scelte ingegneristiche, i confronti tra metodi spesso si riducono a confronti della qualità dell'implementazione
Difficoltà nel Riutilizzo dei Benchmark: Le scelte delle regole sintattiche dei benchmark sono spesso implicite, influenzando i confronti equi
Fornisce Benchmark Standardizzati: Reimplementa benchmark standard in formato leggibile e estensibile
Riassume Principi di Progettazione: Delinea i principi di progettazione guida in Herb.jl, di valore di riferimento per altre implementazioni di sintetizzatori
# Definire la specifica input-output
problem = Problem([
IOExample(Dict(:x => 0), 1),
IOExample(Dict(:x => 1), 3),
IOExample(Dict(:x => 2), 5),
IOExample(Dict(:x => 3), 7)
])
# Definire la grammatica
grammar = @cfgrammar begin
Int = 1 | 2 | x
Int = Int + Int
Int = Int * Int
end
# Eseguire la ricerca
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'articolo cita lavori importanti nel campo della sintesi di programmi, tra cui:
Benchmark della competizione SyGuS (Padhi et al., 2019)
Algoritmo Probe (Barke et al., 2020)
Sintetizzatore FrAngel (Shi et al., 2019)
Sintetizzatore Neo (Feng et al., 2018)
Rassegna sulla Sintesi di Programmi (Gulwani et al., 2017)
Valutazione Complessiva: Questo è un articolo di alta qualità che propone un framework unificato urgentemente necessario nel campo della sintesi di programmi. Sebbene vi sia spazio per miglioramenti nella valutazione sperimentale, i suoi contributi tecnici e il valore pratico sono entrambi eccezionali, e ha il potenziale per diventare un'infrastruttura importante in questo campo.