Enumeration Algorithm¶
Given an input and a declared solution relation, generate every associated solution without repetition, with performance evaluated by preprocessing, inter-output delay, incremental time, total output-sensitive time, and space.
Core Idea¶
In the standard finite-output enumeration-complexity setting, an enumeration algorithm solves a computational problem by producing its entire finite solution set, one solution at a time. Formally, an enumeration problem starts with an input instance (x) and a declared relation (R(x,y)) saying which outputs (y) are valid for that input. The algorithm's contract is stronger than finding one witness and more constructive than counting witnesses: it must eventually emit every (y) satisfying (R(x,y)), emit no invalid (y), avoid emitting the same solution twice, and, once the finite set is exhausted, terminate or otherwise report that no solutions remain. Enumeration-complexity treatments make this input-to-solution-set relation the primitive object rather than treating a long list as an ordinary single output.[1] Infinite enumeration problems also exist, but they require adapted coverage and fairness definitions and do not use finite exhaustion or termination unchanged.
The defining difficulty is that the output can be exponentially larger than the input. A graph with (n) vertices can have exponentially many distinguished subgraphs; a Boolean formula can have exponentially many satisfying assignments; a database query can return a relation much larger than its query text. An input-only running-time bound therefore says little: merely printing all valid solutions already costs at least the size of the output. Enumeration analysis instead asks how computation is distributed over the stream. How long is the preprocessing before the first answer? What is the delay between consecutive answers? How much time is needed for the first (k) answers and to certify exhaustion? Is the total time polynomial in the combined input and output sizes? How much memory is retained to avoid duplicates, preserve traversal state, or enforce an output order? The classic study of maximal-independent-set generation already separated polynomial total time, incremental polynomial time, polynomial delay, requested output order, and space, showing that these measures capture genuinely different promises.[2]
Enumeration algorithm is therefore a method class, not a single technique. Tree traversal, reverse search, indexed query cursors, and blocking or non-blocking model enumeration differ internally but implement the same all-solutions stream contract and output-sensitive ledger.[3][4][5]
The word every is relative to the declared relation. A maximal-independent-set enumerator need not emit every independent set; maximality is part of (R). Correctness has two layers: the predicate fixes what counts, and the enumerator must cover that set exactly. A mistaken predicate can yield a complete stream of the wrong solutions; a mistaken traversal yields an incomplete or duplicated stream of the right predicate.
Structural Signature¶
Sig role-phrases:
- the input instance — the finite encoded object (x), such as a graph, formula, database, hypergraph, or polyhedron, that fixes one run of the problem
- the valid-solution relation — the predicate (R(x,y)) and output representation that determine exactly which objects count as answers
- the implicit solution space — the usually unmaterialized set (R(x)={y:R(x,y)}), often too large to construct before emission begins
- the generation state — a frontier, recursion stack, parent map, index, continuation, compiled representation, or other state from which another answer can be produced
- the next-output operation — the procedure that advances the state, emits a valid solution, or certifies that the stream is exhausted
- the coverage invariant — every solution in (R(x)) is eventually emitted, including the boundary cases fixed by the relation
- the uniqueness invariant — no represented solution is emitted more than once, enforced structurally or by duplicate detection
- the output-sensitive cost ledger — preprocessing, first-answer and inter-output delay, first-(k) incremental time, exhaustion time, total time, and memory measured separately
These roles form a precise recognition test. A computation is an enumeration algorithm when it implements a declared input-to-finite-solution-set relation as a sound, complete, nonrepeating stream with a meaningful end condition. Particular strategies such as backtracking, reverse search, priority-queue generation, blocking clauses, or indexed cursor traversal are replaceable mechanisms inside the signature. What cannot be removed is the all-solutions obligation together with the stream schedule that makes an exponentially large output computationally usable.
What It Is Not¶
- Not merely an algorithm that prints a sequence. Any algorithm may produce multiple lines, states, or log events. Enumeration requires those emissions to be the complete extension of a declared solution relation, not incidental intermediate output.
- Not a one-witness search repeated informally. Re-running a solver with different random seeds may discover several answers, but unless the procedure prevents repetition and certifies exhaustion, it does not establish that every solution was produced.
- Not counting. A counting algorithm returns |(R(x))| or an estimate of it; an enumeration algorithm returns the individual members. Counting can be hard when listing is easy and vice versa, and a correct count does not identify the solutions.
- Not census measurement by default. A census or inventory tries to observe every extant unit of a bounded real population. Enumeration algorithms construct or expose every object satisfying a computational relation, including objects that existed only implicitly before generation. The two share a completeness commitment but differ in substrate, diagnostics, and cost theory.
- Not synonymous with brute force. Exhaustively testing every syntactically possible candidate is one enumerating strategy, but useful enumeration algorithms exploit structure to avoid invalid regions, arrange outputs with bounded delay, or traverse only valid solutions. The output is exhaustive; the work need not be blind.
- Not necessarily backtracking. Backtracking is one commit-check-rollback traversal discipline. Direct combinatorial generation, reverse search, database cursor algorithms, compiled decision diagrams, and saturation methods can enumerate without that exact discipline.
- Not necessarily ordered. Unless the problem specifies lexicographic, weight, rank, random, or another order, correctness concerns the set of outputs rather than their sequence. Requiring an order can materially change delay and space complexity.
Scope of Application¶
Enumeration algorithm lives throughout theoretical and applied computer science wherever the desired result is the full extension of a computational relation rather than one witness or one aggregate. Its mechanisms and performance vocabulary transfer literally inside this domain family.
Combinatorial and graph algorithms. Canonical tasks include listing maximal independent sets or cliques, spanning trees, matchings, paths, cuts, graph colorings, connected induced subgraphs, and topological orderings. These problems motivated polynomial-delay, output-sensitive, supergraph, and reverse-search techniques. Avis and Fukuda's reverse-search framework, for example, treats enumeration as traversal of an implicit solution graph and applies it to triangulations, hyperplane-arrangement cells, spanning trees, connected induced subgraphs, and topological orderings.[3]
Database query evaluation. A non-Boolean query denotes a set of answer tuples, and a database system often needs to return them incrementally rather than materialize the complete result before the first row appears. Enumeration analysis separates preprocessing from delay; Bagan, Durand, and Grandjean proved linear-preprocessing and constant-delay results for a substantial acyclic-query class, making the output schedule itself a query-complexity property.[4]
Constraint satisfaction, SAT, and knowledge representation. Model enumeration produces all satisfying assignments, solutions, explanations, diagnoses, or answer sets admitted by a logical theory. AllSAT implementations expose the characteristic duplicate-control and memory choices: blocking approaches exclude already-seen models, non-blocking approaches continue the search more locally, and compiled representations such as binary decision diagrams can compact families of assignments.[5]
Computational geometry and polyhedral computation. Vertex and facet enumeration, triangulation generation, arrangement-cell listing, and related configuration tasks can have output far larger than the input description. Here output-sensitive total time, polynomial delay, output order, degeneracy, and working memory are first-class design considerations rather than afterthoughts.
Logic and finite-model query answering. First-order and monadic-second-order query fragments are studied by whether their answers can be preprocessed and then enumerated with bounded delay on restricted structures. The same interface recurs: a structure and formula define (R(x,y)); an enumerator exposes all satisfying tuples or assignments.
Symbolic computation and closure systems. Enumerators list monomials of implicitly represented polynomials, members generated by closure operations, minimal transversals of hypergraphs, and other sets whose elements are individually checkable but not given explicitly. Saturation and interpolation methods show that enumeration is broader than state-space search in the narrow AI sense.[1]
The boundary is computational. A library inventory, a census, or a natural-history catalog may use software that enumerates records, but its governing abstraction is complete measurement of an extant population unless the question specifically concerns the algorithmic all-solutions relation and its output schedule. Conversely, a database query is not excluded merely because its answers refer to stored facts: query semantics define a computational result relation, and the cursor's preprocessing/delay/termination behavior is exactly an enumeration concern.
Clarity¶
The abstraction clarifies four questions that the loose instruction “find all answers” tends to collapse.
First, it separates the solution relation from the generation strategy. The relation answers “which objects count?”; the strategy answers “how will they be produced?” One can change from backtracking to reverse search without changing the problem, or change “independent” to “maximal independent” while keeping a similar traversal. This prevents correctness arguments about the predicate from being confused with performance arguments about the enumerator.
Second, it separates soundness, coverage, uniqueness, and exhaustion. Soundness asks whether every emitted object is valid. Coverage asks whether every valid object will eventually appear. Uniqueness asks whether equivalent representations are emitted once or repeatedly. Exhaustion asks whether the procedure can certify that no unseen answer remains. A solver that produces only valid answers may still be incomplete; one that eventually covers everything may still drown the consumer in duplicates; one that stops after a quota may be useful but has ceased to fulfill the full enumeration contract.
Third, it replaces the vague adjective “efficient” with a schedule. An output-polynomial algorithm can perform most of its work before printing anything; that may be acceptable for an offline library build and unacceptable for an interactive cursor. A polynomial-delay algorithm limits every gap yet may use an enormous visited set. A low-memory traversal may revisit subproblems and increase delay. Naming the metric exposes what the consumer actually receives and when.[2][1]
Fourth, it distinguishes complete output from blind candidate exhaustion. The result set is exhaustive, but the algorithm may visit only valid solutions, prune infeasible prefixes, compile the relation, or navigate an implicit spanning tree. This makes it possible to ask the decisive boundary question: is the procedure paying for the number of genuine answers, or for a much larger space of rejected candidates?
A concrete diagnostic follows. Request (1) the input/solution relation, (2) soundness and coverage invariants, (3) the duplicate policy, (4) the meaning of “done,” and (5) the preprocessing, delay, total-time, and space promises. If these are undefined, the object may be a useful generator or iterator, but the full enumeration claim is not precise.
Manages Complexity¶
Enumeration algorithms manage a large solution set by turning one impossible-to-hold object — “all answers” — into a controlled temporal interface. The consumer need not wait for, store, or even request a monolithic materialization. A cursor, iterator, generator, or continuation exposes one answer and enough state to continue. This makes an exponential output streamable, though never magically small.
The abstraction decomposes design into recurring controls. Pruning excludes prefixes with no valid extension. Canonical generation gives each solution one derivation; duplicate detection instead stores prior emissions. Preprocessing builds indexes or compiled structures that reduce later delay. Traversal order, buffering, and termination detection shape which answers arrive when and how exhaustion is known. Each moves cost between time, space, order, and proof burden.
Output-sensitive accounting prevents an exponentially large answer set from being mislabeled inefficient merely because total time is exponential. If there are (N) answers of nontrivial size, any exact enumerator must spend at least enough time to emit them. The informative question is how much overhead is paid beyond output production and where it falls. Output-polynomial time bounds the complete run in terms of input and output. Incremental time bounds production of the first (k) answers. Delay bounds the gaps. Space records the hidden cost of queues, indexes, visited sets, cached prefixes, and compiled forms.[1]
The method further localizes failure. Repeated outputs indicate an identity or canonicalization defect. A long first-answer pause implicates preprocessing or the hardness of finding any witness. Growing pauses implicate incremental rather than uniform-delay behavior. A long pause after the last answer implicates exhaustion detection. Memory growth proportional to answers implicates global duplicate suppression or breadth retention. Wrong answers implicate the solution predicate or emission check; missing answers implicate pruning or traversal coverage. Instead of “the generator is slow or wrong,” the signature points to a specific obligation and a specific phase.
The stable contract also permits implementations to be factored, reduced, or replaced—such as exchanging a global visited set for a reverse-search parent relation—without changing the external correctness obligations.
Abstract Reasoning¶
Enumeration reasoning begins by asking whether the task is genuinely set-valued. If the application needs one feasible plan, a decision procedure or witness search may suffice. If it needs every diagnosis, every minimal explanation, every query tuple, every model, or a proof that no unseen case remains, the enumeration contract is activated. This choice predicts the relevant lower bound: the output cardinality and representation size become part of the problem, not an implementation accident.
The next move is to define the relation and representation before choosing a traversal. Are symmetric configurations distinct? Does one partial assignment represent many total assignments? Is maximality or optimality part of validity? Are database duplicates interpreted under set or bag semantics? These choices alter both the output set and the duplicate invariant. They also license predictions: quotienting by symmetry can reduce the output dramatically but demands canonical representatives; allowing compressed solutions reduces emissions but makes decoding and coverage proofs more complex.
The signature supports diagnosis from temporal behavior. If the first answer is fast but the tenth is slow, the generator may have good witness finding but poor incremental behavior. If outputs arrive steadily until memory exhaustion, delay may be good while space is not. If the algorithm is fast in arbitrary order and stalls under lexicographic order, ordering is the binding constraint; Johnson, Yannakakis, and Papadimitriou's maximal-independent-set result demonstrates that forward and reverse lexicographic requirements can have radically different complexity.[2] If a generator cannot certify completion, it may really be an anytime search or sampler.
It also licenses interventions: replace a visited set with a proved unique-parent rule; move work out of preprocessing to improve first-answer latency; restructure or buffer traversal to smooth delay; or use reverse search when a computable parent relation can replace global history.[3] If the full stream is unusable, change the task honestly to top-(k), sampling, counting, or compact representation rather than silently truncating an “all” claim.
Finally, the abstraction supports proof decomposition. Correctness is not one monolithic theorem. Prove that each emission satisfies (R); prove that every (R)-solution is reachable; prove a solution has one canonical occurrence or that duplicates are detected; prove the traversal cannot remain forever between outputs under the claimed delay bound; and prove the final state means exhaustion. This decomposition transfers across the computational subfields even when their internal machinery differs.
Knowledge Transfer¶
Within computer science, enumeration algorithm transfers as shared abstract mechanism. A graph theorist listing maximal independent sets, a database theorist streaming query tuples, a SAT engineer producing every model, and a computational geometer listing polytope vertices can all specify an input/solution relation, an output stream, coverage and uniqueness invariants, and a preprocessing/delay/incremental/total-time/space profile. They can exchange design methods — pruning, canonical generation, reverse search, output-sensitive analysis, cursor interfaces, duplicate suppression — while retaining the same meanings. This is more than metaphor, and it explains why enumeration complexity forms a recognizable research area rather than a loose collection of “list things” problems.
Yet the transfer is bounded to computational solution generation. Outside computing, “enumerate every possibility” usually invokes algorithm, completeness, or complete_enumeration; it does not carry delay classes, solution predicates, implicit spanning trees, or algorithmic exhaustion certificates intact. Biological catalogs and censuses share no-missingness, but their governing problems are observation, population boundaries, identity, and measurement error.
The honest transfer pattern is therefore the playbook's B case: the named method travels literally across several subdomains of one broad formal-computational domain, while its portable residue beyond that domain belongs to parent primes. Carry algorithm when the lesson is about a definite procedure, completeness when the lesson is no gaps relative to a criterion, and complete_enumeration when the lesson is a full-population measurement programme. Carry enumeration algorithm only when the distinctive all-solutions computational contract and its output schedule remain operative.
Examples¶
Canonical¶
Let (C_4) be the four-cycle with vertices (1,2,3,4) and edges (12,23,34,41). A set of vertices is independent when it contains no adjacent pair, and maximal independent when no additional vertex can be added without breaking independence. The relation (R(C_4,S)) therefore has exactly two solutions: {1,3} and {2,4}. An enumeration algorithm for maximal independent sets must emit both sets, reject singletons because they are extendable, reject adjacent pairs because they are invalid, avoid emitting either solution through two different construction histories, and stop after the second output. On arbitrary graphs the output can be exponentially large; classic algorithms traverse an implicit tree, and Johnson, Yannakakis, and Papadimitriou showed how output order, delay, and space become separate issues for this problem.[2]
Mapped back: (C_4) is the input instance; “(S) is a maximal independent set of (C_4)” is the valid-solution relation; {{1,3},{2,4}} is the implicit solution space; the traversal stack or parent rule is the generation state; emission plus advance is the next-output operation; producing both sets establishes the coverage invariant; producing each once establishes the uniqueness invariant; and the time to first set, gap to the second, exhaustion time, total work, and retained traversal data form the output-sensitive cost ledger.
Applied / In Practice¶
Consider a database with Works(employee, project) equal to {(Ada,P1), (Ada,P2), (Ben,P2), (Cy,P3)} and Active(project) equal to {P1,P2}. The conjunctive query
has three answers: (Ada,P1), (Ada,P2), and (Ben,P2). A query enumerator may first index the active project keys and semijoin or filter Works; it can then expose the surviving tuples one at a time through a cursor. The user receives the first row without requiring the complete answer relation to be materialized as one object, every answer tuple appears once under set semantics, and cursor exhaustion certifies that no fourth tuple satisfies the query. For suitable acyclic query classes, database theory makes this schedule formal: linear preprocessing followed by constant delay between answers is achievable.[4]
Mapped back: the database plus query are the input instance; query satisfaction is the valid-solution relation; the three result tuples are the implicit solution space; the index and cursor position are the generation state; cursor advance is the next-output operation; emitting all three surviving joins establishes coverage; set semantics and keyed traversal establish uniqueness; and index-build time, time between next() calls, final exhaustion, total result size, and cursor/index memory are the output-sensitive cost ledger. The example is enumeration rather than ordinary lookup because the request is the full result relation, not one stored item.
Structural Tensions¶
T1: Complete output versus early usefulness (the whole set may arrive too late). Enumeration's defining promise is that no valid solution is left unseen, yet users often derive most value from the first few diverse or high-quality answers. An output-polynomial algorithm may be excellent at completing the whole run while withholding every answer until late; an aggressive anytime procedure may serve useful answers immediately but never certify coverage. Improving one side can weaken the other unless the schedule is designed explicitly. Diagnostic: Does the consumer need the completed set and an exhaustion certificate, or does it need useful early answers strongly enough that the task should be reformulated as ranked, top-(k), or anytime generation?
T2: Duplicate freedom versus memory (remembering the past can dominate the run). When many construction histories reach the same solution, storing every emitted object makes duplicate suppression simple and correctness legible, but the visited set can grow as large as the output. Canonical-generation and reverse-search rules avoid that memory by making each solution have one admissible derivation, but they transfer burden into a harder structural proof and may increase per-output computation. Diagnostic: Is uniqueness enforced by retaining all prior outputs, or by a proved unique-parent/canonical rule—and which resource, memory or derivation work, is actually scarce?
T3: Arbitrary order versus requested order (useful sequencing can change complexity). Arbitrary-order enumeration lets the algorithm follow whatever traversal makes coverage easiest. Lexicographic, weight, diversity, or best-first order makes the stream more useful and resumable, but it may require a large priority queue, delay the next eligible output, or render a formerly tractable schedule hard. Order is not cosmetic metadata; it can alter the computational problem. Diagnostic: Is the requested order indispensable to consumption, or is it silently imposing the dominant time/space cost on a set whose arbitrary-order enumeration is much easier?
T4: Preprocessing versus delay (pay before the first answer or between answers). Indexes, decompositions, compiled decision diagrams, and auxiliary parent maps can make every later next operation cheap, but the first answer waits while those structures are built. Minimal preprocessing improves responsiveness but may produce irregular or growing gaps later. Neither schedule dominates across interactive and offline workloads. Diagnostic: Is the system optimized for first-answer latency, stable cursor service, or completion time—and is its cost being reported under the metric the user actually experiences?
T5: Output delay versus output-space explosion (fast production can still overwhelm). Constant or polynomial delay controls gaps, not cardinality. A generator can be exemplary by enumeration-complexity standards and still emit exponentially many answers that no person or downstream system can store. Conversely, compact representations, counts, or samples sacrifice individual explicit outputs while making the solution space usable. Diagnostic: Even if every next answer is cheap, is explicit exhaustive output the consumable artifact, or should the task switch honestly to a compressed representation, count, sampler, or query interface?
T6: Aggressive pruning versus completeness proof (every shortcut threatens coverage). Constraint propagation, symmetry breaking, dominance rules, and branch pruning create the speed that makes enumeration possible, but each exclusion rule must preserve at least one representative of every required solution. A pruning rule that is safe for finding one witness may be unsafe for listing all witnesses; a symmetry rule that removes duplicates may accidentally remove an entire orbit. Diagnostic: For every pruned region, what proof shows it contains no valid solution—or contains only solutions represented elsewhere under the declared equivalence?
T7: Autonomy versus reduction (a named computational discipline or Algorithm plus Completeness). Enumeration algorithm has a mature internal identity: relation-defined solution sets, output-sensitive complexity classes, duplicate-control methods, output-order effects, and termination semantics recur across graphs, databases, SAT, logic, and geometry. Yet its portable skeleton can be decomposed into the prime algorithm plus a completeness requirement, and the nearby complete_enumeration already names the no-missingness commitment for population-mapping programmes. The node earns autonomy only because the stream schedule and enumeration-complexity diagnostics are not recoverable from either parent alone. Diagnostic: Resolve toward algorithm or complete_enumeration when the case lacks inter-output computational semantics; retain enumeration algorithm when the all-solutions relation, duplicate-free stream, exhaustion condition, and output-sensitive ledger all do explanatory work.
Structural–Framed Character¶
Enumeration algorithm is mixed-structural. It has an unusually clean formal skeleton, but the named abstraction remains a computer-science method class rather than a substrate-free prime.
On evaluative weight, it is structural: emitting every related solution once is a neutral correctness contract, not a judgment that enumeration is desirable. On human-practice-bound, it leans framed: solution relations, output interfaces, complexity measures, and termination certificates exist because an agent specifies and executes a computational task, even though the mathematics of the relation is observer-independent once fixed. On institutional origin, it is also framed: its standardized vocabulary and classes were developed within algorithms and complexity theory. On vocabulary travels, it is structural inside computing—preprocessing, delay, incremental time, output-sensitive total time, and space retain their meanings from graph algorithms to databases and SAT—but those terms do not travel intact to censuses, biological surveys, or ordinary list-making. On import versus recognize, the same mechanism is recognized across computational subfields; outside them, calling a cataloging project an enumeration algorithm usually imports a computer-science frame rather than discovers its operative mechanism.
Its portable skeleton is the strict parent algorithm: a definite procedure over inputs, states, outputs, correctness, termination, and resources. A completeness criterion supplies the “all answers” obligation. What belongs specifically to this domain abstraction is their computational coupling into a stream whose temporal and spatial profile is evaluated relative to a potentially enormous output. Its character: formally structural across computational substrates, but institutionally and operationally pinned to the computer-science practice of generating complete relation-defined answer sets.
Structural Core vs. Domain Accent¶
This section decides why enumeration algorithm is a domain-specific abstraction rather than a prime.
What is skeletal (could lift toward a cross-domain prime). Strip away computing vocabulary and a thin structure remains: a bounded criterion defines a set; a procedure exposes the members one by one; every member must eventually appear; repetitions are excluded; and the process ends only when coverage is complete. The general procedure component is already algorithm. The no-gap component is already completeness, and the deliberate map-every-unit programme is close to complete_enumeration. These are genuinely portable: a census, an inventory, a biological atlas, and a computational model generator can all be described at this skeletal level.
What is domain-bound. The identity that makes the node useful begins where that generic description stops. Its set is specified as an input-indexed computational relation (R(x,y)); answers may be implicit combinatorial objects rather than observed population units; the stream is judged by preprocessing, first-output time, delay, incremental time, output-polynomial total time, and machine space; duplicate freedom is achieved by visited sets, canonical generation, blocking constraints, or unique-parent traversal; output order is itself a complexity parameter; and exhaustion is an algorithmic state rather than an empirical completeness audit. Remove the relation, stream schedule, machine-resource measures, and generation mechanisms and the result is no longer enumeration algorithm in the disciplinary sense. It is simply a complete list, census, or procedure.
Why this does not clear the prime bar. A prime's distinctive mechanism and vocabulary should travel across independent domains without heavy reinterpretation. Enumeration algorithm travels exactly across graph algorithms, database theory, logic, SAT, computational geometry, and symbolic computation, but these are subdomains of a shared computational-formal substrate. A census bureau does not acquire an inter-output delay class by interviewing residents, a naturalist does not use reverse search to establish that no species was missed, and an inventory's chief uncertainty is empirical observation and identity rather than reachability of an implicit relation. The cross-domain lesson is already carried by algorithm, completeness, and, for extant populations, complete_enumeration. The named node's additional explanatory power is real but stays inside computing; beyond it, transfer requires analogy or replacement of the defining diagnostics. That is the domain-specific boundary.
The candidate also survives the mere-composite test. “Algorithm plus completeness” predicts that all answers are required, but it does not predict why preprocessing and delay must be separated, why output order can change complexity, why a visited set creates output-sized space, why exhaustion time matters, or why reverse search trades global memory for a parent relation. Those emergent diagnostics justify a named domain abstraction even though its DAG parentage remains minimal.
Instantiates / Related Primes¶
-
algorithm— confirmed strict parent. Every enumeration algorithm is an algorithm: it accepts an encoded input, executes definite effective steps, preserves correctness invariants, and has explicit termination and resource semantics. Enumeration adds a set-valued output contract, uniqueness and coverage obligations, and output-sensitive scheduling. The proposed prose edge is subsumption, strict:enumeration_algorithmis a kind ofalgorithm, while many algorithms decide, optimize, count, transform, or find one witness without enumerating. -
complete_enumeration— confirmed close relation, declined as a DAG parent. Both commit to every unit and treat missingness as a defect. The live prime, however, is explicitly a population-mapping and measurement programme: defined extant units, observation, provenance, population boundaries, and completeness-dependent inference versus sampling. Enumeration algorithm instead generates or exposes an input-indexed solution relation and is differentiated by delay, incremental time, output order, machine space, and algorithmic exhaustion. The relation is useful prose adjacency, not a clean subsumption edge under the present live identities. Ifcomplete_enumerationis later broadened beyond its measurement-program identity, this judgment should be revisited. -
search_and_retrieval— confirmed neighbor, declined as a parent. Some enumerators retrieve database tuples or traverse a search space, but enumeration can also directly generate combinatorial objects, enumerate closure sets, or emit models from compiled representations. Search and Retrieval is query-to-relevant-item location and ranking; enumeration's differentia is complete, nonrepeating coverage of the relation. Neither presupposes the other in every instance. -
backtracking— confirmed optional technique, not parent. Backtracking can implement enumeration by recursively extending partial solutions and rolling back at infeasible prefixes. Reverse search, direct generation, database cursor algorithms, compiled decision diagrams, and other methods show that commit-check-rollback is not constitutive. -
completeness— confirmed conceptual component, no additional edge proposed. Enumeration correctness includes completeness relative to (R(x,y)), but that property alone does not organize the node as a genus. Adding bothalgorithmandcompletenessas parents would overstate a generic property as a second taxonomic parent; the prose relation captures it without unnecessary DAG load.
Relationships to Other Abstractions¶
Current abstraction Enumeration Algorithm Domain-specific
Parents (1) — more general patterns this builds on
-
Enumeration Algorithm is a kind of Algorithm Prime
algorithm— confirmed strict parent. Every enumeration algorithm is an algorithm: it accepts an encoded input, executes definite effective steps, preserves correctness invariants, and has explicit termination and resource semantics.Enumeration adds a set-valued output contract, uniqueness and coverage obligations, and output-sensitive scheduling. The proposed prose edge is subsumption, strict:enumeration_algorithmis a kind ofalgorithm, while many algorithms decide, optimize, count, transform, or find one witness without enumerating.
Hierarchy paths (2) — routes to 2 parentless roots
- Enumeration Algorithm → Algorithm → Function (Mapping)
Neighborhood in Abstraction Space¶
Enumeration Algorithm sits in a sparse region of the domain-specific corpus (76th percentile for distinctiveness): few abstractions share its structure, so a faithful description tends to retrieve it precisely.
Family — Formal Languages, Types & Programs (41 abstractions)
Nearest neighbors
- Formal Theory — 0.84
- Specification language — 0.83
- Search Algorithm — 0.83
- Emptiness problem — 0.83
- Means-End Analysis — 0.82
Computed from structural-signature embeddings · 2026-09-08
Not to Be Confused With¶
-
Algorithm. The general prime names any finite, definite, effective input-to-output procedure. Enumeration algorithm is the strict subclass whose output is the entire finite extension of a declared relation, exposed without repetition and with a stream schedule. Tell: Would one valid result, a decision bit, a count, or an optimum satisfy the contract? If yes, the task may be an algorithm but is not enumeration.
-
Complete Enumeration. This catalog prime names a programme to map every unit of a defined population so completeness-dependent inferences become possible, with boundaries, observation, provenance, and missingness audit. Enumeration algorithm generates every computational solution and is analyzed by delay, incremental time, output-sensitive total time, order, and space. Tell: Is the hard problem observing every extant unit and defending the population boundary, or generating every relation-defined solution under a machine-resource schedule?
-
Search Algorithm. The existing domain abstraction casts a problem as a state space explored under a frontier-ordering strategy toward a goal, with completeness and optimality properties attached to strategies such as BFS or A. Enumeration need not use a frontier and must output all solutions rather than reach one goal. *Tell:** Is the main design choice which state to explore next to find a goal, or how to emit the entire solution relation once each with bounded gaps?
-
Search and Retrieval. Search and Retrieval locates items matching a query, often ranking a relevant subset and trading precision, recall, and latency. Enumeration insists on complete coverage of its exact solution relation and often has no ranking or relevance continuum. Tell: May the system return the most relevant matches and stop, or must it certify that every valid answer has appeared?
-
Backtracking. Backtracking is a traversal mechanism that extends a partial solution, checks constraints, and rolls back the latest commitment. It may stop after one solution or continue to enumerate; enumeration may use entirely different mechanisms. Tell: Does the concept name commit-check-rollback, or the all-solutions stream contract independent of how traversal is implemented?
-
Exhaustive / brute-force search. Brute force tests a broad candidate space with little structural pruning. An enumeration algorithm's output is exhaustive, but its computation may avoid invalid candidates and visit only valid objects through canonical generation or reverse search. Tell: Is “exhaustive” describing the required answer set or the indiscriminate work performed to obtain it?
References¶
[1] Strozecki, Y. (2021). Enumeration Complexity: Incremental Time, Delay and Space. Habilitation thesis, Université de Versailles Saint-Quentin-en-Yvelines. Author-hosted manuscript; university record. Defines enumeration problems as input-indexed solution relations and develops total, incremental, delay, and space measures, duplicate-control costs, and standard enumeration methods. registry ↩a ↩b ↩c ↩d
[2] Johnson, D. S., Yannakakis, M., & Papadimitriou, C. H. (1988). On generating all maximal independent sets. Information Processing Letters, 27(3), 119–123. https://doi.org/10.1016/0020-0190(88)90065-8. Distinguishes polynomial total time, incremental polynomial time, polynomial delay, order, and space; gives a lexicographic polynomial-delay result and an order-sensitive hardness contrast. registry ↩a ↩b ↩c ↩d
[3] Avis, D., & Fukuda, K. (1996). Reverse search for enumeration. Discrete Applied Mathematics, 65(1–3), 21–46. https://doi.org/10.1016/0166-218X(95)00026-N. Develops reverse search as an implicit-tree enumeration framework and applies it across operations research, combinatorics, and geometry. registry ↩a ↩b ↩c
[4] Bagan, G., Durand, A., & Grandjean, E. (2007). On acyclic conjunctive queries and constant delay enumeration. In Computer Science Logic 2007, 208–222. https://doi.org/10.1007/978-3-540-74915-8_18. Establishes linear-delay and, for a substantial acyclic-query subclass, linear-preprocessing/constant-delay enumeration results. registry ↩a ↩b ↩c
[5] Toda, T., & Soh, T. (2016). Implementing efficient all solutions SAT solvers. ACM Journal of Experimental Algorithmics, 21, Article 1.12. https://doi.org/10.1145/2975585. Surveys, implements, and experimentally compares blocking, non-blocking, and formula/BDD-caching approaches to AllSAT model enumeration. registry ↩a ↩b