aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2025-11-22 22:32:04 -0300
committerGitHub <noreply@github.com>2025-11-22 22:32:04 -0300
commit09be36e5f5e2c5714b9542df8ccc363ab86ac6da (patch)
tree06105bcbcc8cacc70e977e2370af270ae713226e /docs
parenta56ea3089524b440b12b660d36c07f46b4fd9eb3 (diff)
downloadSakura-09be36e5f5e2c5714b9542df8ccc363ab86ac6da.tar.gz
Sakura-09be36e5f5e2c5714b9542df8ccc363ab86ac6da.zip
Infinite relations (#10)
Diffstat (limited to 'docs')
-rw-r--r--docs/infinite_relations_design.org348
1 files changed, 348 insertions, 0 deletions
diff --git a/docs/infinite_relations_design.org b/docs/infinite_relations_design.org
new file mode 100644
index 0000000..c13e783
--- /dev/null
+++ b/docs/infinite_relations_design.org
@@ -0,0 +1,348 @@
+#+TITLE: Infinite Relations Design
+#+AUTHOR: Nekoma Team
+#+DATE: 2025-01-22
+
+* Overview
+
+This document specifies the design for infinite relations in Domino, enabling
+countably infinite (ℵ₀) and uncountably infinite (continuum) relations alongside
+finite relations.
+
+** Core Principle
+
+*Everything is a relation.* Types are relations. Functions are relations.
+Numbers are relations. This unifies the type system with the data model.
+
+* Cardinality System
+
+** Cardinality Types
+
+#+BEGIN_SRC erlang
+-type cardinality() :: {finite, non_neg_integer()} % Finite set with N elements
+ | aleph_zero % Countably infinite (ℵ₀)
+ | continuum. % Uncountably infinite (2^ℵ₀)
+#+END_SRC
+
+** Properties
+
+- Finite relations have explicit tuple count: ={finite, 1000}=
+- Countably infinite relations: =aleph_zero=
+- Uncountably infinite relations: =continuum=
+
+* Extended Data Model
+
+** Modified Relation Record
+
+#+BEGIN_SRC erlang
+-record(relation, {
+ hash, % Content hash (for finite) or generator hash (for infinite)
+ name, % Relation name (atom)
+ tree, % Merkle tree (finite only), undefined for infinite
+ schema, % Schema definition
+ cardinality, % {finite, N} | aleph_zero | continuum
+ generator, % Generator function (infinite only), undefined for finite
+ is_function % Boolean: true if relation represents a function
+}).
+#+END_SRC
+
+** Generator Specification
+
+Generators are functions that produce tuples on-demand based on constraints.
+
+#+BEGIN_SRC erlang
+-type generator_spec() ::
+ {primitive, atom()} % Built-in: naturals, integers, rationals
+ | {function_relation, atom(), arity()} % Built-in function: plus/3, times/3
+ | {custom, fun((constraints()) -> tuple())} % User-defined generator
+ | {derived, relational_operation()}. % Derived from other relations
+
+-type constraints() :: #{
+ attribute_name() => constraint_spec()
+}.
+
+-type constraint_spec() ::
+ {eq, value()} % Equality: age = 30
+ | {neq, value()} % Inequality: age ≠ 30
+ | {lt, value()} % Less than: age < 30
+ | {lte, value()} % Less than or equal
+ | {gt, value()} % Greater than
+ | {gte, value()} % Greater than or equal
+ | {in, [value()]} % Membership: age in [20,30,40]
+ | {range, value(), value()} % Range: age in [20..30]
+ | {member_of, relation_name()}. % Type constraint: x ∈ Naturals
+#+END_SRC
+
+* Primitive Infinite Relations
+
+** Naturals (ℕ)
+
+#+BEGIN_SRC erlang
+Schema: #{value => natural}
+Cardinality: aleph_zero
+Generator: Enumerates 0, 1, 2, 3, ...
+
+Example tuples:
+ #{value => 0}
+ #{value => 1}
+ #{value => 2}
+ ...
+#+END_SRC
+
+** Integers (ℤ)
+
+#+BEGIN_SRC erlang
+Schema: #{value => integer}
+Cardinality: aleph_zero
+Generator: Enumerates 0, 1, -1, 2, -2, 3, -3, ...
+
+Enumeration strategy: Interleave positive and negative
+ f(0) = 0
+ f(2n) = n (for n > 0)
+ f(2n+1) = -n (for n > 0)
+#+END_SRC
+
+** Rationals (ℚ)
+
+#+BEGIN_SRC erlang
+Schema: #{numerator => integer, denominator => natural}
+Cardinality: aleph_zero
+Generator: Stern-Brocot tree or Calkin-Wilf sequence
+
+Constraints:
+ - denominator > 0
+ - gcd(numerator, denominator) = 1 (reduced form)
+
+Example tuples:
+ #{numerator => 0, denominator => 1} % 0/1
+ #{numerator => 1, denominator => 1} % 1/1
+ #{numerator => 1, denominator => 2} % 1/2
+ #{numerator => 2, denominator => 1} % 2/1
+ #{numerator => 1, denominator => 3} % 1/3
+ ...
+#+END_SRC
+
+** Reals (ℝ) - Theoretical
+
+#+BEGIN_SRC erlang
+Schema: #{value => real}
+Cardinality: continuum
+Generator: Not fully enumerable (conceptual only)
+
+Note: In practice, we can only represent computable reals or
+ algebraic reals (still countable but more expressive).
+#+END_SRC
+
+* Function Relations
+
+A relation R is a *function* if: ∀a ∃!b : (a,b) ∈ R
+
+That is, for every input, there exists exactly one output.
+
+** Plus (addition)
+
+#+BEGIN_SRC erlang
+Name: plus
+Schema: #{a => number, b => number, sum => number}
+Cardinality: aleph_zero (when a,b ∈ ℤ or ℚ)
+Is_function: false (it's a 3-way relation, not (a,b) → sum)
+Function view: plus(a, b) = sum where (a, b, sum) ∈ Plus
+
+Generator: For each (a, b) pair, yield #{a => A, b => B, sum => A + B}
+
+Constraints required for iteration:
+ - At least two of {a, b, sum} must be bounded
+
+Valid queries:
+ - plus where a ∈ [0..10], b ∈ [0..10] ✓ (finite result: 121 tuples)
+ - plus where a = 5, b ∈ Naturals ✓ (countable: {5,0,5}, {5,1,6}, ...)
+ - plus where sum = 10 ✓ (countable: infinitely many a+b=10)
+ - plus with no constraints ✗ (cannot enumerate)
+#+END_SRC
+
+** Times (multiplication)
+
+#+BEGIN_SRC erlang
+Name: times
+Schema: #{a => number, b => number, product => number}
+Cardinality: aleph_zero
+Generator: For each (a, b) pair, yield #{a => A, b => B, product => A * B}
+#+END_SRC
+
+** Successor
+
+#+BEGIN_SRC erlang
+Name: successor
+Schema: #{n => integer, succ => integer}
+Cardinality: aleph_zero
+Is_function: true (n → succ is a function)
+Generator: For each n, yield #{n => N, succ => N + 1}
+#+END_SRC
+
+* Cardinality Algebra
+
+Rules for computing cardinality of relational operations:
+
+** Union (∪)
+
+| Left | Right | Result | Notes |
+|------------+------------+------------+--------------------------|
+| {finite,m} | {finite,n} | {finite,≤m+n} | May have duplicates |
+| {finite,n} | aleph_zero | aleph_zero | Finite + infinite = infinite |
+| aleph_zero | aleph_zero | aleph_zero | ℵ₀ + ℵ₀ = ℵ₀ |
+| aleph_zero | continuum | continuum | Continuum dominates |
+| continuum | continuum | continuum | 2^ℵ₀ + 2^ℵ₀ = 2^ℵ₀ |
+
+** Cartesian Product (×)
+
+| Left | Right | Result | Notes |
+|------------+------------+---------------+-----------------------|
+| {finite,m} | {finite,n} | {finite,m·n} | Product of sizes |
+| {finite,n} | aleph_zero | aleph_zero | n · ℵ₀ = ℵ₀ |
+| aleph_zero | aleph_zero | aleph_zero | ℵ₀ · ℵ₀ = ℵ₀ |
+| aleph_zero | continuum | continuum | ℵ₀ · 2^ℵ₀ = 2^ℵ₀ |
+| continuum | continuum | continuum | 2^ℵ₀ · 2^ℵ₀ = 2^ℵ₀ |
+
+** Natural Join (⋈)
+
+Cardinality depends on join selectivity:
+
+| Left | Right | Result | Notes |
+|------------+------------+------------+------------------------------------|
+| {finite,m} | {finite,n} | {finite,k} | k ≤ min(m,n) typically |
+| {finite,n} | aleph_zero | varies | Could be finite or aleph_zero |
+| aleph_zero | aleph_zero | varies | Depends on join condition |
+
+*Examples:*
+
+#+BEGIN_SRC erlang
+%% Finite ⋈ Infinite (finite result)
+Employees = {finite, 100} % 100 employees
+Naturals = aleph_zero % Infinite numbers
+Employees ⋈ Naturals on employee_id = value
+ ⇒ {finite, 100} % At most 100 matches
+
+%% Infinite ⋈ Infinite (infinite result)
+Naturals ⋈ Plus on Naturals.value = Plus.a
+ ⇒ aleph_zero % For each natural n, infinite (n,b,n+b) tuples
+
+%% Infinite ⋈ Infinite (finite result with constraints)
+(Naturals where value < 10) ⋈ (Naturals where value < 10)
+ ⇒ {finite, 100} % 10 × 10 = 100
+#+END_SRC
+
+** Selection (σ)
+
+| Input | Result | Notes |
+|------------+------------+------------------------------------|
+| {finite,n} | {finite,k} | k ≤ n (filtering reduces size) |
+| aleph_zero | varies | Could be finite or aleph_zero |
+| continuum | varies | Could be any cardinality |
+
+*Examples:*
+
+#+BEGIN_SRC erlang
+σ(Naturals, value < 10) ⇒ {finite, 10} % Bounded selection
+σ(Naturals, value > 5) ⇒ aleph_zero % Infinite result
+σ(Naturals, value % 2 = 0) ⇒ aleph_zero % Even numbers (infinite)
+#+END_SRC
+
+** Projection (π)
+
+| Input | Result | Notes |
+|------------+------------+---------------------------------|
+| {finite,n} | {finite,k} | k ≤ n (duplicates removed) |
+| aleph_zero | aleph_zero | Typically preserves infinity |
+| continuum | continuum | Typically preserves cardinality |
+
+* Constraint System
+
+** Mandatory Constraints
+
+Queries on infinite relations *must* provide constraints that bound the iteration.
+
+#+BEGIN_SRC erlang
+%% INVALID: Cannot iterate infinite relation without constraints
+Iterator = get_tuples_iterator(DB, naturals). ❌
+
+%% VALID: Bounded by constraint
+Iterator = get_tuples_iterator(DB, naturals, #{value => {range, 0, 100}}). ✓
+#+END_SRC
+
+** Constraint Validation
+
+Before executing a query on an infinite relation, validate:
+
+1. *Finite result check*: Do constraints guarantee finite result?
+2. *Bounded iteration check*: Can we enumerate results in finite time?
+
+#+BEGIN_SRC erlang
+validate_constraints(Relation, Constraints) ->
+ case Relation#relation.cardinality of
+ {finite, _} ->
+ ok; % Finite relations don't need constraints
+ aleph_zero ->
+ case infers_finite_result(Relation, Constraints) of
+ true -> ok;
+ false -> {error, unbounded_iteration}
+ end;
+ continuum ->
+ {error, uncountable_relation} % Cannot iterate continuum
+ end.
+#+END_SRC
+
+** Constraint Inference
+
+Smart inference of finiteness:
+
+#+BEGIN_SRC erlang
+%% These constraints imply finite results:
+#{value => {range, 0, 100}} % Range is finite
+#{value => {in, [1,2,3,4,5]}} % Membership in finite set
+#{value => {lt, 10}} % Bounded above (if naturals)
+
+%% These do NOT imply finite results:
+#{value => {gt, 10}} % Unbounded above
+#{value => {neq, 5}} % Excludes one element
+#+END_SRC
+
+* Implementation Strategy
+
+** Phase 1: Core Infrastructure
+1. Extend =relation= record with =cardinality= and =generator= fields
+2. Implement cardinality algebra functions
+3. Add constraint validation framework
+
+** Phase 2: Primitive Relations
+1. Implement =naturals= generator
+2. Implement =integers= generator (interleaving strategy)
+3. Implement =rationals= generator (Stern-Brocot or Calkin-Wilf)
+
+** Phase 3: Function Relations
+1. Implement =plus= relation
+2. Implement =times= relation
+3. Implement =successor=, =predecessor= relations
+
+** Phase 4: Query Engine
+1. Extend iterator model to support generators
+2. Implement constraint-based enumeration
+3. Add cardinality inference for query results
+
+** Phase 5: Relational Operators
+1. Extend join to handle infinite relations
+2. Extend union with cardinality tracking
+3. Extend selection with constraint propagation
+
+* Open Questions
+
+1. *Partial materialization*: Should we cache generated tuples?
+2. *Generator composition*: How to compose generators for derived relations?
+3. *Constraint solving*: Do we need a full constraint solver (CLP)?
+4. *Termination guarantees*: How to prove queries terminate?
+5. *Physical storage*: How to persist infinite relation definitions?
+
+* References
+
+- Codd, E. F. (1979). "Extending the Database Relational Model"
+- Cantor, G. "On the Cardinality of Sets"
+- Stern-Brocot Tree: Enumeration of rationals
+- Calkin-Wilf Tree: Alternative rational enumeration