diff options
| author | Marcos Magueta <maguetamarcos@gmail.com> | 2025-12-01 18:34:31 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-01 18:34:31 -0300 |
| commit | 8c8b32d59acc78c7c3e1e8ecae8492a1b728b482 (patch) | |
| tree | b218e550b2b09e4920af6e12db531bfd65f65929 /docs/type-hierarchy.puml | |
| parent | e03b7c75be589d12ddc97d074abd2e3a5c6b7cdf (diff) | |
| download | Sakura-8c8b32d59acc78c7c3e1e8ecae8492a1b728b482.tar.gz Sakura-8c8b32d59acc78c7c3e1e8ecae8492a1b728b482.zip | |
Diagrams (#18)
Diffstat (limited to 'docs/type-hierarchy.puml')
| -rw-r--r-- | docs/type-hierarchy.puml | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/docs/type-hierarchy.puml b/docs/type-hierarchy.puml new file mode 100644 index 0000000..c53a965 --- /dev/null +++ b/docs/type-hierarchy.puml @@ -0,0 +1,289 @@ +@startuml type-hierarchy +!theme plain +title Type System: Stratified Universes & Types as Relations + +package "Universe Stratification" { + class "Universe₀" as U0 { + Base values + Examples: 3, -5, 3.14, true, "hello" + The set of all runtime values + } + + class "Universe₁" as U1 { + Type relations (classify values) + Examples: natural, integer, real, boolean + Each type is a relation over Universe₀ + Type relations are infinite relations + } + + class "Universe₂" as U2 { + Type of type relations + The classifier of type relations + Prevents self-reference paradoxes + } + + class "Universe₃" as U3 { + Meta-type level + Type : Universe₂ : Universe₃ + } + + U0 : Universe₁ + U1 : Universe₂ + U2 : Universe₃ + U3 : Universe₄ + + note right of U1 + **Stratification prevents Russell's Paradox** + Type relations live in Universe₁ + and classify values in Universe₀. + A type cannot contain itself. + + natural : Universe₁ + 3 ∈ natural (3 ∈ Universe₀) + But: natural ∉ natural ✗ (universe mismatch) + end note +} + +package "Supertypes (Universe₁)" { + class Number { + Membership: number[X] where X : Universe₀ + Definition: Union of all numeric types + number[X] :- natural[X]; integer[X]; + rational[X]; real[X]. + Allows polymorphism over numeric types + Universe level: Universe₁ + } + + class Scalar { + Membership: scalar[X] where X : Universe₀ + Definition: Atomic (non-composite) values + scalar[X] :- number[X]; boolean[X]; string[X]. + Universe level: Universe₁ + } +} + +package "Numeric Type Relations (Universe₁)" { + class Naturals { + Membership: natural[X] where X : Universe₀ + Criteria: + - X is erlang:integer() + - X >= 0 + Cardinality: aleph_zero + Generator: 0, 1, 2, 3, ... + Universe level: Universe₁ + } + + class Integers { + Membership: integer[X] where X : Universe₀ + Criteria: + - X is erlang:integer() + Cardinality: aleph_zero + Generator: 0, 1, -1, 2, -2, ... + Universe level: Universe₁ + } + + class Rationals { + Membership: rational[X] where X : Universe₀ + Criteria: + - X is (P, Q) + - integer[P], integer[Q] + - Q ≠ 0 + Cardinality: aleph_zero + Generator: Stern-Brocot tree + Universe level: Universe₁ + } + + class Reals { + Membership: real[X] where X : Universe₀ + Criteria: + - X is erlang:float() + Cardinality: continuum + Generator: IEEE 754 floats + Universe level: Universe₁ + } +} + +package "Other Primitive Types (Universe₁)" { + class Strings { + Membership: string[X] where X : Universe₀ + Criteria: + - X is erlang:string() + Cardinality: aleph_zero + Ordering: by length, then lexicographic + Universe level: Universe₁ + } + + class Booleans { + Membership: boolean[X] where X : Universe₀ + Criteria: + - X is erlang:boolean() + - X ∈ {true, false} + Cardinality: 2 + Universe level: Universe₁ + } +} + +package "Constrained Type Relations (Universe₁)" { + class PositiveIntegers { + Definition: positive_int[X] where X : Universe₀ + Criteria: + - integer[X] + - X > 0 + Relation: positive_int ⊆ integer + Universe level: Universe₁ + } + + class BoundedInt { + Definition: bounded_int[X, Min, Max] + where X : Universe₀ + Criteria: + - integer[X] + - Min ≤ X ≤ Max + Relation: bounded_int ⊆ integer + Universe level: Universe₁ + } + + class NonEmptyStrings { + Definition: non_empty_string[X] + where X : Universe₀ + Criteria: + - string[X] + - length(X) > 0 + Relation: non_empty_string ⊆ string + Universe level: Universe₁ + } +} + +package "Composite Type Relations (Universe₁)" { + class Complex { + Definition (Karuta-style): + complex[X] where X : Universe₀ + complex[X] :- + X is (A, B), + real[A], real[B]. + + Interpretation: + - (A, B) where A is real part + - B is imaginary part + Relation: complex ⊆ real × real + Universe level: Universe₁ + } + + class Employee { + Definition: + employee[X] where X : Universe₀ + employee[X] :- + X is (Name, Age, Salary), + non_empty_string[Name], + positive_int[Age], + positive_int[Salary]. + + Relation: employee ⊆ string × ℕ⁺ × ℕ⁺ + Universe level: Universe₁ + } +} + +' Universe stratification relationships +U1 --> U0 : classifies values in +U2 --> U1 : types type relations +U3 --> U2 : meta-level + +' All type relations live in Universe₁ +U1 ..> Number : contains +U1 ..> Naturals : contains +U1 ..> Integers : contains +U1 ..> Rationals : contains +U1 ..> Reals : contains +U1 ..> Booleans : contains +U1 ..> Strings : contains +U1 ..> Scalar : contains + +' Type relation hierarchy (within Universe₁) +Number <|-- Naturals : ⊇ +Number <|-- Integers : ⊇ +Number <|-- Rationals : ⊇ +Number <|-- Reals : ⊇ + +Number <|-- Scalar : ⊇ +Booleans <|-- Scalar : ⊇ +Strings <|-- Scalar : ⊇ + +' Subset relations among numeric types +Naturals .up.|> Integers : ⊆ +Integers .up.|> Rationals : ⊆ +Rationals .up.|> Reals : ⊆ + +' Constrained types +Integers .down.|> PositiveIntegers : ⊇ +Integers .down.|> BoundedInt : ⊇ +Strings .down.|> NonEmptyStrings : ⊇ + +' Composite types (also in Universe₁) +Number .down.|> Complex : number × number +Complex : (view: pair of numbers) + +Scalar .down.|> Employee : scalar × scalar × scalar +Employee : (view: string × nat × nat) + +note right of Complex + **Views as Type Relations:** + Types can be defined as relational views + over other type relations. + + Example using supertype: + complex[C] :- C is (R, I), + number[R], number[I]. + + Or more specifically: + complex[C] :- C is (R, I), + real[R], real[I]. + + Views can use supertypes for flexibility! + All views live in Universe₁. +end note + +note left of Number + **Core Principle:** Every type is a relation + Type checking = membership checking in relations + T1 <: T2 iff T1 ⊆ T2 (subset relation) + + **Supertypes enable polymorphism:** + A function can accept number[X] and work + with naturals, integers, rationals, or reals. + + **Universe Levels:** + All type relations: Universe₁ + All values: Universe₀ + Type of types: Universe₂ + + **Erlang Type Mapping:** + natural → integer() + (≥ 0) + integer → integer() + rational → {integer(), integer()} + real → float() + string → string() + boolean → boolean() +end note + +note bottom of U0 + **Avoiding Russell's Paradox:** + + Like F*, Domino uses predicative universe + stratification. The key invariant: + + Type u#i : Type u#(i+1) + + In Domino: + - Values (3, "hello", true) : Universe₀ + - Type relations (natural, string) : Universe₁ + - Type : Universe₂ + + This prevents: + natural ∈ natural (universe mismatch!) + + A type relation cannot be a member of itself. + All type relations classify values in Universe₀ + but exist at Universe₁. +end note + +@enduml |
