host: relations-as-posts slice 4 — type ALGEBRA (intersection ∧ union)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 25s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 25s
An algebraic type is a post with operand edges: conj edges (intersection members), disj edges (union members). host/blog-instances-of-expr computes its extent from the operands' extents by set intersection/union, RECURSIVELY — operands can themselves be algebraic (meta-circular; tested with (tag ∧ article) ∧ tag). host/blog-is-a-expr? generalises is-a? to type expressions; make-and!/make-or! build them. Binary today (nth 0/1, no fold over operands — robust on the serving JIT). Operand edges are KV-only (host/blog--add-edge-kv!, read via host/blog-out), NOT in lib/relations — feeding extra kinds into the Datalog graph blows up its per-query re-saturation; load-edges! skips conj/disj on replay too. conformance 295/295 (+4: intersection/union membership, extent = set op, nested expr). (NB: host conformance can EXIT 124 purely from a sibling loop's CPU contention — ran with timeout 1200.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -85,16 +85,20 @@ relation-subtype closure when relations get subtyped; the boot title cache above
|
||||
- NOTE: `host/blog-relate!` (direct/seed) stays UNVALIDATED — the seed needs to write
|
||||
`X is-a relation` where `relation` isn't under `type`. Validation is a *handler* boundary.
|
||||
|
||||
### Slice 4 — type algebra
|
||||
Types are posts + `subtype-of` is a partial order ⇒ a **lattice**, and `is-a?` is transitive
|
||||
set-membership ⇒ extents have set semantics. So algebra is expressible as posts:
|
||||
- **Intersection** `A ∧ B` — a type-post whose membership predicate is `is-a? A ∧ is-a? B`
|
||||
(meet / GLB in the lattice). **Union** `A ∨ B` — `is-a? A ∨ is-a? B` (join / LUB).
|
||||
- **Refinement** `{x : T | φ(x)}` — a type-post with a `:constraint` predicate over a post
|
||||
(generalises today's `article` schema "must have a heading"). Gradual: declaring the type
|
||||
adds the obligation; the next save must satisfy it.
|
||||
- Algebraic types are *themselves posts* with edges to their operands — `is-a?` recurses on
|
||||
the expression. Meta-circular: the algebra lives in the graph it describes.
|
||||
### Slice 4 — type algebra — DONE (intersection ∧ union)
|
||||
- An algebraic type is a post with operand edges: `conj` edges (intersection members),
|
||||
`disj` edges (union members). `host/blog-instances-of-expr` computes its EXTENT from the
|
||||
operands' extents by set intersection / union, RECURSIVELY — so operands can themselves be
|
||||
algebraic (meta-circular; tested with `(tag ∧ article) ∧ tag`). `host/blog-is-a-expr?`
|
||||
generalises `is-a?` to type expressions. `host/blog-make-and!` / `make-or!` build them.
|
||||
- Binary today (`nth 0/1`, no fold over operands — robust on the serving JIT); n-ary fold is
|
||||
a follow-up once iteration-with-perform is JIT-reliable.
|
||||
- **Operand edges are KV-only** (`host/blog--add-edge-kv!`, read via `host/blog-out`), NOT in
|
||||
lib/relations — feeding extra kinds into the Datalog graph blows up its per-query
|
||||
re-saturation; `load-edges!` skips `conj`/`disj` on replay for the same reason.
|
||||
- **Refinement** `{x : T | φ(x)}` (a type-post with a `:constraint` predicate) → Slice 5,
|
||||
with constraints-as-posts. (Process note: a sibling loop running heavy conformance saturates
|
||||
the box; host conformance can EXIT 124 purely from CPU contention — use `timeout 1200`.)
|
||||
|
||||
### Slice 5 — constraints as posts + validation
|
||||
- Promote the schema/`:constraint` slot to **constraint-posts** (a predicate expr +
|
||||
|
||||
Reference in New Issue
Block a user