Index
  1. Part I: Foundations
  2. 1 Introduction to Predica
  3. 2 Entity Types as Logical Sorts
  4. 3 Cardinality Constraints and 1NF
  5. 4 Supplier-and-Parts Database
  6. 5 Nesting the Relational Model
  7. 6 Cardinality
  8. 7 Identity
  9. 8 Boolean-valued Attributes
  10. 9 Types
  11. 10 Database Values and Consistency
  12. 11 Closed World Assumption
  13. 12 Relvar versus attribute predicates
  14. 13 Metadata annotations
  15. 14 Pushing relationships down into the entities
  16. 15 The Information Principle
  17. 16 The Atomicity Paradox
  18. 17 The First Great Blunder
  19. 18 Design Principles and Features
  20. 19 Benefits of a Decomposition into Domains with Unary Predicates
  21. 20 Related Work
  22. Part II: Path Expressions
  23. 21 Example Schema
  24. 22 Navigation
  25. 23 Path Tails
  26. 24 Filters
  27. 25 Tuple Construction
  28. 26 Renaming with as
  29. 27 This
  30. 28 Calculated Attributes
  31. 29 Let Bindings
  32. 30 Splat
  33. 31 Folds
  34. 32 Universal Navigation
  35. 33 Path Operations
  36. 34 Alternatives
  37. 35 Conditionals
  38. 36 Lists
  39. 37 Groups
  40. 38 Type Checking Path Expressions
  41. Part III: Constraints
  42. 39 Constraint Forms
  43. 40 Firearm Purchase Example
  44. 41 Construction Project Example
  45. 42 Cardinality Constraint Patterns
  46. 43 Student Enrolment Courses Example
  47. 44 Using Predica to define legality
  48. Part IV: Types
  49. 45 Types
  50. 46 Built-in Types
  51. 47 Structural types
  52. 48 Type expressions
  53. 49 Type Aliases
  54. 50 Equality Between Types
  55. 51 Expression literals and constructors
  56. 52 Static vs dynamic typing
  57. 53 Isomorphisms
  58. 54 Objects
  59. Part V: Nominal Types
  60. 55 Value Types
  61. 56 Entity Types
  62. 57 Keys
  63. 58 Enumerated Types
  64. 59 Variant types
  65. 60 Quotient types
  66. 61 Attributes
  67. 62 Parameterised Attributes
  68. 63 Derived Attributes
  69. 64 Embedding
  70. 65 Generics
  71. 66 Ordering
  72. 67 Constraints
  73. 68 Theorems
  74. Part VI: Subtypes
  75. 69 Type graph
  76. 70 Necessarily disjoint and non-disjoint
  77. 71 Abstract types
  78. 72 Subtypes of abstract types
  79. 73 Subtypes of concrete types
  80. 74 Comparable Types
  81. 75 Union types
  82. Part VII: Query
  83. 76 Constants
  84. 77 Functions
  85. 78 Function Overload Resolution
  86. 79 Example: Head-Tail List Functions
  87. 80 Query Examples
  88. 81 Filter Conditions
  89. 82 Inverse relationships
  90. 83 Views
  91. 84 Responsive Applications without async/await
  92. 85 Folds
  93. 86 Lists
  94. 87 Group Aggregation
  95. Part VIII: Relations
  96. 88 Relations as Extensions
  97. 89 Notation and Surface Syntax
  98. 90 Headings, Domains, and Universe
  99. 91 Projection and Result Shape
  100. 92 Supplier Relation Examples
  101. 93 Relational Model Correspondence
  102. 94 Supplier/Parts Translation
  103. 95 Materialised Accessors
  104. 96 Implementation Notes
  105. Part IX: Updates
  106. 97 Transactions
  107. 98 Read-only Models over Weakly Constrained Data
  108. 99 Program Variables as Locations
  109. 100 Uninitialised Locations
  110. 101 Parameter Access and Ownership
  111. 102 Comparison with Rust
  112. 103 Variable Updates
  113. 104 Constraint-Violating Updates
  114. 105 Control Flow
  115. 106 Unreachable
  116. 107 Runtime Failures and Exceptions
  117. 108 Procedures and Effects
  118. 109 Entity Creation and Base Updates
  119. 110 Block-Bodied Functions
  120. 111 Path Expression Updates
  121. Part X: Components
  122. 112 Introduction to components
  123. 113 Component Manifest
  124. 114 Namespaces
  125. 115 Using Declarations
  126. 116 Name Resolution
  127. 117 Schema evolution
  128. 118 Standard Library
  129. Part XI: Normalisation
  130. 119 1NF
  131. 120 2NF
  132. 121 3NF
  133. 122 BCNF
  134. 123 4NF
  135. 124 5NF
  136. 125 6NF
  137. 126 DKNF
  138. 127 Misplaced Facts
  139. Part XII: Examples
  140. 128 Geometry Example
  141. 129 Event Sourcing
  142. 130 Box of objects
  143. Part XIII: Syntax
  144. 131 Lexical Grammar
  145. 132 Syntactic Grammar
  146. 133 Source Files and Declarations
  147. 134 Statement Grammar
  148. 135 Expression Grammar
  149. 136 Type Definition Grammar
  150. Part XIV: Semantics
  151. 137 Frames
  152. 138 Frame Display Forms
  153. 139 Frame Construction and Closure
  154. 140 Frame Relabelling and Merge
  155. 141 Horizontal Frame Operations
  156. 142 Vertical Frame Operations
  157. 143 Frame Negation, Protected Comprehensions, and Unary Frames
  158. 144 Denotation Type Conventions
  159. 145 Denotation Terms
  160. 146 Denotation Precedence
  161. 147 Attribute Cardinality Constraints and Denotation
  162. 148 Denotation Environment
  163. 149 Denotation of Scalar Terms and Attribute Navigation
  164. 150 Denotation of Tuples, Filtering, and Composition
  165. 151 Denotation of Path Operations and Alternatives
  166. 152 Denotation of Conditionals, Negation, Folds, and Cardinality
  167. 153 Denotation of Absence, This, Splat, Let, and Constraints
  168. 154 Predicates Induced by Variants and Enums
  169. 155 Denotation Examples
  170. 156 Examples of correspondence between Predica and logic
  171. 157 Denotation of Predica Locations
  172. Part XV: Implementation
  173. 158 Data representation
  174. 159 Persistent Object Store
  175. 160 Snapshot Isolation
  176. 161 CEDA MVCC Storage
  177. 162 Implementing the Genealogy Example
  178. 163 Implementing a Triangulated Mesh
  179. 164 Annotator
  180. 165 Optimisation
  181. 166 Physical independence
  182. 167 Chunk size
  183. 168 Query Optimisation
  184. 169 Reference Implementation

20 Related Work

Full decomposition with unary predicates

Predica’s treatment of all attributes as unary predicates over decomposed domains resonates with several strands of prior work, but the specific combination of ideas does not appear in the literature as a unified modelling foundation.

In classical first-order logic, it is well known that n-ary predicates can be simulated using unary predicates together with additional structure, and that monadic fragments of first-order logic enjoy strong decidability properties. However, these results are typically presented as technical encodings or proof techniques rather than as a basis for data modelling or schema design.

In knowledge representation, especially in frame systems, semantic networks, and description logics, one finds the notion of roles that behave much like unary predicates on individuals. Binary and higher-arity relations are still treated as primitive, and n-ary relations are often handled via reification, but there is no systematic commitment to representing all information as unary predicates over a recursively decomposed domain.

In the relational model and its successors, attributes are sometimes informally described as roles, and domains are allowed to be arbitrarily complex. Nonetheless, n-ary relations remain the primary semantic unit, and there is no move to reconstruct them compositionally from families of unary predicates. Attribute-centric perspectives have been explored, but not to the extent of eliminating n-ary relations as primitives.

Categorical and type-theoretic semantics introduce another closely related perspective: predicates can be viewed as families of sets indexed by a domain, and unary predicates correspond to fibres in a fibration or objects in a comprehension category. This aligns well with Predica’s view of attributes as unary predicates whose extensions vary over domain instances, but these constructions are typically used to model existing logics and type systems, not to drive a reorganisation of data modelling around unary predicates.

Finally, in programming languages and type theory, higher-arity functions and tuples are routinely encoded using unary functions and nested pairs (via currying and Church encodings). These encodings demonstrate that higher-arity structure can be reduced to iterated unary structure, but they are employed as representational devices rather than as a semantic stance on how information should be modelled.

Predica differs from these lines of work by taking the unary perspective as foundational: all attributes are unary predicates; domains are recursively decomposed; and n-ary relations are reconstructed from the cross-product of unary predicate facts. This yields a uniform representation of information that removes the need for tuple-valued attributes, relation-valued attributes, and possreps, while keeping natural language predicates as the primary semantic anchor.

Previous19 Benefits of a Decomposition into Domains with Unary Predicates NextPart II: Path Expressions