aboutsummaryrefslogtreecommitdiffstats
path: root/docs/infinite-relations.puml
diff options
context:
space:
mode:
Diffstat (limited to 'docs/infinite-relations.puml')
-rw-r--r--docs/infinite-relations.puml177
1 files changed, 177 insertions, 0 deletions
diff --git a/docs/infinite-relations.puml b/docs/infinite-relations.puml
new file mode 100644
index 0000000..cd6aa0f
--- /dev/null
+++ b/docs/infinite-relations.puml
@@ -0,0 +1,177 @@
+@startuml infinite-relations
+!theme plain
+title Infinite Type Relations: Unfold Pattern & Membership
+
+abstract class InfiniteTypeRelation {
+ + name: atom()
+ + cardinality: aleph_zero | continuum
+ + erlang_type: type()
+ + membership_predicate: function()
+ + unfold_generator: function()
+ + constraints: constraints()
+}
+
+class Naturals {
+ Erlang Type: integer()
+ Membership: natural[X] :-
+ erlang:is_integer(X),
+ X >= 0.
+
+ Unfold Generator:
+ unfold(0, fun(N) -> N + 1 end)
+ → 0, 1, 2, 3, ...
+
+ Cardinality: aleph_zero
+}
+
+class Integers {
+ Erlang Type: integer()
+ Membership: integer[X] :-
+ erlang:is_integer(X).
+
+ Unfold Generator:
+ unfold({0, 1}, fun({N, S}) ->
+ case S of
+ 1 -> {N, -1};
+ -1 -> {N+1, 1}
+ end
+ end)
+ → 0, 1, -1, 2, -2, ...
+
+ Cardinality: aleph_zero
+}
+
+class Rationals {
+ Erlang Type: {integer(), integer()}
+ Membership: rational[X] :-
+ X is (P, Q),
+ integer[P], integer[Q],
+ Q ≠ 0.
+
+ Unfold Generator:
+ Stern-Brocot tree unfold
+ → (0,1), (1,1), (1,2), ...
+
+ Cardinality: aleph_zero
+}
+
+class Reals {
+ Erlang Type: float()
+ Membership: real[X] :-
+ erlang:is_float(X).
+
+ Unfold Generator:
+ IEEE 754 float enumeration
+ (impractical, continuum)
+
+ Cardinality: continuum
+}
+
+class Strings {
+ Erlang Type: string()
+ Membership: string[X] :-
+ erlang:is_list(X),
+ all_chars(X).
+
+ Unfold Generator:
+ Length-ordered, lexicographic
+ → "", "a", "b", ..., "aa", ...
+
+ Cardinality: aleph_zero
+}
+
+class Plus {
+ Erlang Type: {integer(), integer(), integer()}
+ Membership: plus[A, B, Sum] :-
+ integer[A], integer[B],
+ Sum is A + B.
+
+ Unfold Generator:
+ Diagonalization of ℤ × ℤ
+ → (0,0,0), (0,1,1), (1,0,1), ...
+
+ Cardinality: continuum (ℤ × ℤ)
+}
+
+package "Constraint Application" {
+ class ConstrainedGenerator {
+ Pattern: Apply constraints during unfold
+ base_generator: unfold()
+ constraints: [constraint()]
+ ..
+ filter_unfold(Gen, Constraints) ->
+ filter(Gen, satisfies_all(Constraints))
+ }
+
+ note bottom of ConstrainedGenerator
+ **Example 1: Bounded Naturals**
+ natural[X], X >= 0, X =< 100
+ → Generates: 0, 1, 2, ..., 100 (finite!)
+
+ **Example 2: Constrained Plus**
+ plus[5, B, 12]
+ → Solves: B = 7
+ → Generates: single tuple (5, 7, 12)
+
+ **Example 3: Range Query**
+ integer[X], X >= -10, X =< 10
+ → Generates: 0, 1, -1, 2, -2, ..., 10, -10
+ end note
+}
+
+package "Composite Type Relations (Views)" {
+ class Complex {
+ Type Definition (Karuta):
+ complex[X] :-
+ X is (A, B),
+ real[A], real[B].
+
+ Implementation:
+ Unfold real × real with
+ product enumeration
+
+ Not primitive: Defined as view
+ over primitive real relation
+ }
+}
+
+InfiniteTypeRelation <|-- Naturals
+InfiniteTypeRelation <|-- Integers
+InfiniteTypeRelation <|-- Rationals
+InfiniteTypeRelation <|-- Reals
+InfiniteTypeRelation <|-- Strings
+InfiniteTypeRelation <|-- Plus
+
+Naturals --> ConstrainedGenerator: apply\nconstraints
+Integers --> ConstrainedGenerator
+Rationals --> ConstrainedGenerator
+Plus --> ConstrainedGenerator
+
+Reals --> Complex: used in\nproduct
+Complex : (view relation)
+
+note right of Naturals
+ **Core Pattern:** Infinite relations use unfold
+ to generate members. Primitive types are
+ infinite relations.
+
+ **Membership:** Erlang type + constraints
+
+ **Unfold Pattern:**
+ unfold(Seed, Step) generates infinite sequence:
+ Seed, Step(Seed), Step(Step(Seed)), ...
+
+ This enables lazy evaluation and
+ constraint-based pruning.
+end note
+
+note left of Plus
+ **Function Relations:**
+ Mathematical functions like plus, multiply, etc.
+ are relations with continuum cardinality.
+
+ Membership = evaluation
+ Generation = enumeration
+end note
+
+@enduml