Programming Language designed for Program Synthesis with SMT-validation.
This audit follows How to express intent in aeon
(November 3, 2026): types, liquid refinements, documentation, examples, CSV data,
optimization, properties, and resource use. It also covers @minimize_size.
The table includes every registered backend family on master, including
AMaze, bounded Boolean synthesis, ReGuS, and constrained LLM decoding.
Aliases with the same implementation share a row.
All complete candidates must satisfy their types and refinements. A backend’s
existing grammar, type, arity and budget limits still apply: accepting a
specification does not mean its search can express or find every solution.
@doc guides LLM generation only. Other algorithms accept it as documentation;
there is no sound general conversion from natural language to assertions.
Both @csv_data and @csv_file use the declared argument and result types:
Int, Float, Bool, and String. Numeric outputs produce squared-error
fitness; Boolean/string outputs produce mismatch counts. Malformed cells and
unsupported schemas fail explicitly. Satisfaction backends require an exact
fit; regression and noisy learners retain approximate fitting. Constructor CSV
schemas are not inferred. Concrete constructor examples can still come from
@example or functional properties.
“Objectives” covers scalar min/max and multiple objectives, including mixed directions. “Resources” covers CPU time and energy. Size and resources use the same fitness infrastructure, subject to the stated search limits.
| Synthesizer IDs | Examples and CSV | Properties | Objectives | Size / resources | Meaningful limits |
|---|---|---|---|---|---|
tdsyn, tdsyn_enumerative, tdsyn_random, tdsyn_backward |
Fitness | Fitness | Pareto | Yes | Type-directed grammar and budget. |
backward_*, forward_* |
Check complete results | Check complete results | Unsupported | Unsupported | Interactive single expansion steps may leave subgoals. |
synquid |
Fitness | Fitness | Pareto | Yes | Refinement-directed grammar; zero is not assumed optimal for arbitrary goals. |
tactics |
Fitness | Fitness | Pareto | Yes | Complete tactic walks; fixed explicit by scripts only validate specifications. |
enumerative |
Fitness | Fitness | Pareto | Yes | Native term grammar. |
random_search |
Fitness | Fitness | Pareto, including joint holes | Yes | Native term grammar. |
gp |
Fitness | Fitness | Pareto, including joint holes | Yes | Native term grammar and sampled genomes. |
rl_mcts |
Check | Check | External Pareto | Yes | Feasibility currently supplies the positive search reward. |
decision_tree |
Numeric regression + fitness | Fitness; functional equalities can supply labels | Pareto over fitted trees | Yes | Numeric inputs/results; candidate trees of increasing depth, constant models for nullary data. |
noisy |
Soft scalar observations, including both CSV forms | Check | Pareto with built-in regularized risk | Yes | Bounded scalar learner; only fully scored candidates enter the front. |
contata |
Unary Int/Bool/List I/O + check; typed CSV where scalar | Check; equalities can supply labels | External Pareto for a single function | Yes for a single function | Mutual recursive groups retain their joint checking oracle, but reject numeric optimization. |
structure_guided |
Recursive-constructor I/O + check; CSV signature does not fit | Check; constructor equalities can supply labels | External Pareto | Yes | Recursive input/output ADTs; bounded recurrence extraction. |
bustle, bustle_baseline |
Scalar/constructor I/O + check; Int/Bool/String CSV | Check; equalities can supply labels | External Pareto | Yes | Float is outside its grammar. |
fta |
Numeric I/O + general checks; exact-fit numeric CSV | Check | External Pareto | Yes | Objective mode retains observationally equal alternatives. |
afta |
I/O + general checks; exact-fit CSV in supported sorts | Check | External Pareto | Yes | Objective mode retains observationally equal alternatives. |
cata |
Check; exact-fit CSV within its grammar | Check | External Pareto | Yes | Constraint-annotated grammar. |
lta |
Check; exact-fit CSV within its grammar | Check | External Pareto | Yes | Bounded liquid-automaton extraction. |
arborist |
Int/Bool-result I/O in a sketch + check; typed CSV | Check; equalities can supply labels | External Pareto | Yes | Existing lifted-interpreter types and sketches; no Float leaves. |
symetric, xfta |
Fitness | Fitness | Scalar | Yes | Requires a usable output metric or @cluster feature space. |
smt |
Single: fitness; joint: logical/check | Single: fitness; joint: logical/check | Single: Pareto; joint: external Pareto | Yes | Supported solver sorts and bounded candidate templates. |
sygus |
Check; joint examples also logical | Check; joint properties also logical | External Pareto | Yes | cvc5 grammar/sort support; incremental solution enumeration. |
polynomial |
Logical examples; exact-fit CSV check | Logical + check | External Pareto | Yes | Arithmetic polynomial fragment and coefficient/certificate bounds. |
ortools, ortools_int, cpsat |
Hard examples; soft CSV regression | Check and continue to next assignment | Pareto over blocked assignments | Yes | Bounded numeric/Bool holes, fixed-length arrays and lists; fixed-point Float representation. |
boolean_bounded |
Logical examples; exact-fit Bool CSV check | Logical Boolean obligations + check | External Pareto over finite CNF selectors | Yes | First-order Boolean functions and declared CNF bound. |
amaze |
Fitness; typed Int/Bool CSV | Fitness | Pareto | Yes | Learned Int/Bool grammar. |
regus |
Fitness; CSV does not fit controller signature | Fitness | Pareto | Yes | ControlProgram and the @cluster execution-observation protocol. |
All regular llm* IDs |
Fitness and prompt hints | Fitness and prompt hints | Pareto among generated terms | Yes | Provider/model generation quality; ordinary compiler validation. |
llm_type_constrained |
Fitness and prompt hints | Fitness and prompt hints | Pareto among decoded terms | Yes | Monomorphic scalar types/arrows; one hole, no ADTs/recursion/linear types. |
The single-step IDs are backward_abs, backward_lit, backward_close,
backward_app, backward_if, forward_close, forward_let_app,
forward_let_if, forward_let_tapp, forward_let_abs, and forward_let_tabs.
Regular LLM IDs are llm, llm_openai, llm_qwen2.5-coder-32b,
llm_qwen2.5-coder-14b, llm_deepseek-coder-v2-16b, llm_codellama-13b,
llm_starcoder2-15b, and llm_deepseek-coder-6.7b.
Goal.kind distinguishes checkable error counts from general objectives.
specifications.py installs timed acceptance checks for satisfaction backends;
program_specifications.py shares whole-program substitution, completeness,
type/bounded-contract checks, fixed property corpora and objective evaluation
across CP-SAT, noisy search, and final program-backend acceptance.
example_adapters.py merges typed CSV and derived observations without
modifying source metadata. A functional property such as f x = reference x
provides exact labels for its generated inputs. The same bounded evaluator
handles nonliteral examples such as f (1 + 1) = 3. It evaluates only independent
expressions, retains conflicting observations, and leaves the original assertions
in validation. Equalities can be reversed or unconditionally conjoined.
Inequalities, implications and relationships between multiple calls do not become
invented labels. When a learner still needs data, uniquely determined refinement
outputs provide sampled examples through refinement_examples.py.
A minimized squared error (or maximized negative squared error) can supply
training labels while retaining the original objective. An arbitrary
minimize(f x - c) cannot soundly be converted into f x = c.
CandidateArchive keeps feasible candidate streams running for optimization.
Z3 blocks function interpretations, cvc5 requests successive synthesis solutions,
polynomial synthesis blocks program coefficients, CP-SAT blocks whole assignments,
and bounded Boolean synthesis blocks selector models. Runtime failure rejects a
candidate; exhaustion preserves a valid incumbent. PBE optimization retains
syntactically different subterms even if they agree on examples, since their
objectives can differ.
Both LLM adapters share one specification prompt formatter, including objective
directions, generated goal/property definitions, CSV rows, resource goals and
@doc. Prompts guide generation; they do not replace evaluation or typechecking.
Pareto-capable adapters expose backend.pareto_front as
[(objective_values, core_term), ...], and report it through
SynthesisUI.register_front. Joint entries contain a JointCandidate holding
all hole replacements. The existing synthesis API returns one seeded selection;
equal objective vectors retain one representative. Without numerical objectives,
satisfaction backends return the first valid candidate.
These are fronts of explored candidates, not globally optimal solutions. Search stops at its time, grammar, size or proposal limit. An in-flight compiler check can overrun the nominal time budget; cvc5 and bounded Boolean search also have process deadlines. Energy uses RAPL when available and the existing CPU-time proxy otherwise. Resource comparisons therefore depend on the execution environment.
The regression suites exercise real searches and combinations, not just capability
flags: specification_matrix_test.py, example_adapters_test.py,
specialized_specifications_test.py, runtime_specification_adapters_test.py,
synthesis_specifications_test.py, and synthesis_pareto_fallback_test.py.
LLM candidate streams are mocked for repeatable integration tests; no live-provider
success rate or model-quality claim is made.
@require(condition) is a mandatory candidate validation check. After
successful typechecking, the condition is evaluated before scoring objectives.
A false condition, evaluation error, or timeout rejects the candidate; search
continues with other candidates. Requirements add no fitness dimensions and
cannot trade off against minimize/maximize objectives or enter the Pareto front
as violations. This shared validation applies to GP, random search, TDSyn,
Synquid, and complete-program backends. OR-Tools can additionally encode a
translatable requirement in its constraint model. Existing backend restrictions
on types and search spaces still apply.
Requirements and expression objectives share a runtime environment for each candidate. A top-level value needed by several checks or scores is computed once and reused, including between validation and scoring callbacks. Cached values and failures are discarded when the candidate changes. This reuses bindings, not arbitrary repeated function calls; factor an expensive common result into a shared value to reuse it. CPU-time and energy objectives retain their independent measured executions.
Native grammar search (including GP, random search, and TDSyn) uses
GrammarScope and BoundLevel for its value-binding interface. Levels count
from the outermost scope, so extending a scope does not shift existing
references. Logical predicate binders occupy scope positions but cannot be
selected as runtime values.
The core AST and SMT/typechecking interfaces remain named. The grammar lowers
levels to core variables and allocates fresh identities whenever it introduces
a lambda or let binder. Opening a function signature also substitutes the fresh
variable into its dependent result type. Distinct generated binders have
distinct printable names when nested, preserving both outer-variable access
and unambiguous printed source. This prevents repeated polymorphic library
signatures (such as nested Array.zipWith callbacks) from reusing a binder’s
identity at incompatible types. Type errors in an individual native grammar
expansion reject that expansion rather than aborting the search.