Note: This document covers the SAT search methodology and axiom system as of March 8, 2026. For the current theoretical framework including the distinctness axiom, categorical foundation, Futamura projections, reflective tower, and extension profiles, see inevitability_summary.md and technical_overview.md.
What is the simplest finite structure that can identify its own components through its own operation, and what does the existence of such a structure tell us about the relationship between self-knowledge, computation, and actuality?
Reference document for the axiom-driven search for self-describing finite algebras. Covers all results from the computational axiom exploration sessions (March 2026).
All axioms act on a finite magma (N-element set with binary operation dot).
| Level | Name | Formal | Forces |
|---|---|---|---|
| L0 | Absorber ⊤ | ∀x: 0·x = 0 |
Element 0 is left-absorbing (top) |
| L1 | Absorber ⊥ | ∀x: 1·x = 1 |
Element 1 is left-absorbing (bottom) |
| L2 | Extensionality | All rows distinct | No two elements have the same behavior |
| L3 | Tester exists | ∃t≥2: ∀x: t·x ∈ {0,1} |
At least one non-absorber has boolean outputs |
| L4 | Encoder exists | ∃e≥2: e has ≥2 distinct non-boolean outputs |
At least one element that synthesizes |
| L5 | No extra absorbers | ∀x≥2, ∃y: x·y ≠ x |
Only 0 and 1 are absorbers |
| L6 | No extra testers | At most 2 testers among non-absorbers | Limits boolean-row elements |
| L7 | Inert exists | ∃v≥2: v is neither tester nor encoder |
At least one "substrate" element |
| L8 | Encoder separation | ≥2 encoders with distinct output sets |
Multiple independent synthesis channels |
| Axiom | Formal Statement | Plain English | What It Forces |
|---|---|---|---|
| C (Kripke) | If x is not a tester, then x·y ≥ 2 for all y ≥ 2 |
Only testers can produce boolean outputs on non-absorbers | Separates judgment (tester) from operation (encoder). Non-testers cannot make boolean decisions. |
| D (Inert Propagation) | If x is inert, then x·y ≥ 2 for all y ≥ 2 |
Inert elements preserve non-absorber status | Substrate doesn't collapse structure to booleans |
| PA (Power-Associativity) | (x·x)·x = x·(x·x) for all x |
Self-interaction is path-independent | Squaring map has algebraic regularity. Rules out some chaotic self-interactions. |
| VV (Inert Self-Application) | If v is inert, then v·v is a tester or encoder |
Substrate self-application yields "core" | Inert elements are not self-swallowing; they produce active structure |
| QE (Quote/Eval) | E·(Q·x) = x and Q·(E·x) = x for x ∈ core |
Q and E are mutual inverses on core elements {2,3,4,5} | Reflective pair: ability to quote and evaluate. Core is isomorphic to itself under Q;E. |
| 1-Inert | Exactly 1 inert element among non-absorbers | Only one substrate element | Reduces model space; forces unique substrate |
| E-Transparency | E·⊤ = ⊤ and E·⊥ = ⊥ |
Eval preserves absorbers | E is identity on structural boundaries |
| Branch | ρ·x = f·x if τ·x = ⊤, else ρ·x = g·x (on core) |
Tester-mediated conditional: ρ dispatches between f and g based on τ | Structural if/then/else. Requires C (Kripke) — only testers can branch. |
| Compose | η·x = ρ·(g·x) on core |
η is ρ after g (composition through branch) | Function composition exists in the algebra |
| Y-Combinator | Y·ρ = ρ·(Y·ρ), with Y·ρ ≥ 2 |
Fixed-point combinator for branch element | Self-reference / recursion exists. Non-trivial (not an absorber). |
| Selection | η·ρ = τ |
Compose of branch equals tester; terminates | Computational termination: composing then branching yields a judgment |
| Index | Symbol | Role | Computational | Counter | IO |
|---|---|---|---|---|---|
| 0 | ⊤ | absorber | top/true | — | — |
| 1 | ⊥ | absorber | bottom/false | — | — |
| 2 | f | encoder | branch-if (f path) | — | PUT |
| 3 | τ | tester | branch tester | — | — |
| 4 | g | inert | branch-else (g path) (g is classified as inert by its Cayley row behavior; in the term algebra it serves as the pair constructor CONS) | — | GET |
| 5 | — | encoder | free encoder | — | — |
| 6 | Q | encoder | quote | s4 | — |
| 7 | E | encoder | eval | — | — |
| 8 | ρ | encoder | branch element | s2 | — |
| 9 | η | encoder | compose element | s0 (zero state) | — |
| 10 | Y | inert | Y-combinator | s7 | — |
| 11 | ν | tester | — | s5 | — |
| 12 | — | encoder | — | s6 | — |
| 13 | INC | encoder | — | increment | — |
| 14 | — | encoder | — | s1 | — |
| 15 | SEQ | encoder | — | s3 | SEQ |
| Index | Symbol | Role | Function |
|---|---|---|---|
| 0 | ⊤ | absorber | top/true |
| 1 | ⊥ | absorber | bottom/false |
| 2 | f | encoder | branch-if (f path) |
| 3 | τ | tester | branch tester (boolean row) |
| 4 | g | encoder | branch-else (g path) |
| 5 | — | encoder | free encoder |
| 6 | Q | encoder | quote |
| 7 | E | encoder | eval |
| 8 | ρ | encoder | branch element |
| 9 | η | encoder | compose element |
| 10 | Y | inert | fixed-point combinator (inert role!) |
| 11 | — | encoder | free encoder |
| Index | Symbol | Role |
|---|---|---|
| 0 | ⊤ | absorber |
| 1 | ⊥ | absorber |
| 2 | t | tester |
| 3 | e₁ | encoder |
| 4 | e₂ | encoder |
| 5 | ν | inert |
| 6 | Q | encoder |
| 7 | E | encoder |
These hold across all SAT models in the dominant role-signature class, verified by Z3 SAT/UNSAT checks (not enumeration):
- Exactly 2 absorbers: L5 forces no additional absorbers beyond ⊤ and ⊥.
- Extensionality: All rows distinct (L2).
- Mixed squaring: PA holds, but full associativity is UNSAT. Squaring map has cycles and fixed points.
- No right identity: UNSAT at N≥6 — no element e with
x·e = xfor all x. - No associativity: Full
(a·b)·c = a·(b·c)is UNSAT. - No Moufang, no entropic: Both UNSAT.
- Encoder dominance in scaling: As N grows, encoder count grows; tester and inert counts stay bounded.
- Separation of computation and judgment: C (Kripke) forces this — non-testers cannot produce boolean outputs on non-absorbers, so branching requires a tester.
- No associative sub-magma of size ≥ 4: Exhaustive search on Ψ₁₆ confirms no subset of 4+ elements forms an associative sub-magma. The largest associative sub-magmas are size 3.
The tester row is completely free. At N=16, all 14 core tester cells can independently flip between 0 and 1 (SAT-verified with push/pop). At N=12, all 12 core tester cells are free. This means:
- The tester's partition of elements into "accept" vs "reject" is not determined by the structural axioms
- This is the "actuality" degree of freedom — the distinction the tester draws is a genuine choice
- No combination of structural axioms pins any tester cell
- E-transparency does NOT cascade to tester cells (verified: all combinations are SAT)
{⊤, ⊥, Q, E} generates all N elements via the binary operation, in ≤4 steps at N=16, ≤2 steps at N=12. Lean-verified at N=16 (generates_all : gen_iter 4 = Finset.univ).
Critical discovery: Z3's check() method returns models biased by internal solver heuristics. When enumerating models by blocking (adding Or(cells ≠ previous)), successive models tend to be structurally similar. This produced a false appearance of near-uniqueness:
- Enumeration at N=12 found "500 models with only 5 varying cells in the dominant cluster"
- Reality: cell-by-cell SAT analysis shows 117/144 cells are genuinely free
- The "dominant cluster" was a tiny neighborhood in a vast solution space, not a forced basin
The correct method: For each cell (i,j), use push(), add dot[i][j] == v, check SAT, pop(). A cell is fixed only if exactly one value is SAT. This is O(N³) SAT calls but gives ground truth.
| Category | Fixed | Free | Total |
|---|---|---|---|
| Absorber rows (0,1) | 24 | 0 | 24 |
| E-transparency | 2 | 0 | 2 |
| Selection η·ρ=τ | 1 | 0 | 1 |
| Tester row (actuality) | 0 | 12 | 12 |
| Structural (all other) | 0 | 105 | 105 |
| Total | 27 | 117 | 144 |
Determination ratio: 18.8%
| Category | Fixed | Free | Total |
|---|---|---|---|
| Absorber rows (0,1) | 16 | 0 | 16 |
| E-transparency | 2 | 0 | 2 |
| Tester row | 0 | 8 | 8 |
| Structural | 0 | 38 | 38 |
| Total | 18 | 46 | 64 |
Determination ratio: 28.1%
Constrained (role-level):
- Which elements are absorbers, testers, encoders, inert
- That QE are mutual inverses on core
- That Branch dispatches based on tester
- That Compose = Branch ∘ g
- That Y is a fixed-point combinator for ρ
- That η·ρ = τ (selection axiom)
Not constrained (cell-level):
- The actual values in any encoder row (each cell takes 6-10 values)
- The actual values in the inert row (each cell takes 6-8 values)
- The tester partition (which elements map to ⊤ vs ⊥)
- How Q and E act on non-core elements
- How any element acts on absorbers (beyond absorber self-rows)
At N=8, removing QE reduces fixed cells from 18 to 16. QE pins exactly 2 cells — only the E-transparency cells added by hand. The QE inverse-pair axiom constrains relationships between cells (E·(Q·x) = x) but doesn't pin individual values.
| Test | N | Axioms | Result | Time | Notes |
|---|---|---|---|---|---|
| L8 baseline | 6 | L0-L8 | SAT (2417 models) | ~5s | Minimum N for full ladder |
| L8 + C + D | 6 | L0-L8+C+D | SAT | <1s | |
| L8 + PA | 6 | L0-L8+PA | SAT | <1s | |
| L8 + VV | 6 | L0-L8+VV | SAT | <1s | |
| QE pair | 6 | L0-L8+C+D+PA+VV+QE | UNSAT | <1s | QE needs ≥8 elements |
| QE pair | 8 | L0-L8+C+D+PA+VV+QE | SAT | <1s | Minimum N for QE |
| Full base + QE | 8 | L8+C+D+PA+VV+QE+1I | SAT | <1s | |
| Branch (Path 2) | 12 | full+Branch | SAT | ~2s | Tester-mediated |
| Compose | 12 | full+Branch+Compose | SAT | ~2s | |
| Y-combinator | 12 | full+Br+Co+Y | SAT | ~2s | |
| Full package | 12 | full+Br+Co+Y+QE | SAT (31+) | ~3s | All computational axioms |
| Selection η·ρ=τ | 12 | full package + sel | SAT (500+) | ~18s | |
| N=16 Phase 1 | 16 | L8+C+D+PA+VV+QE+1I+E-trans | SAT | ~8s | Base axioms scale |
| N=16 Phase 2 | 16 | Phase 1 + Branch+Compose+Y | SAT | ~10s | Computational package |
| N=16 Phase 3 | 16 | Phase 2 + IO (PUT/GET/SEQ) | SAT | ~10s | IO roundtrip |
| N=16 Phase 4 | 16 | Phase 3 + 4-state counter | SAT | ~8s | Counter + IO |
| N=16 Phase 5 | 16 | Phase 4 + 8-state counter | SAT | ~10s | Full arithmetic |
| N=16 + Selection | 16 | Phase 5 + η·ρ=τ | SAT | ~9s | All axioms + selection |
| Ψ₁₆ᶠ (full ops) | 16 | All above + DEC+PAIR/FST/SND+INC2+SWAP | SAT | ~62s | Every operation simultaneously |
| Squaring stability | 12 | full + (x·x)·(x·x)=x·x | 0/500 models | ~300s | Incompatible with structure |
| active·(non-abs)≠inert | 12 | full + axiom | UNSAT | ~300s | Too strong |
| x·(active input)≠inert | 12 | full + axiom | SAT (1 unique) | ~310s | Different structure |
| active·active≠inert | 12 | full + axiom | SAT (1 unique) | ~310s | Different structure |
| E·⊤=⊤, E·⊥=⊥ | 12 | full + E-trans | SAT | <1s | E-transparency |
| Q·Y=Y, E·Y=Y | 12 | full + QE-trans | SAT (407 dom) | ~18s | Forces Q·10=10, conflicts with natural Q·10=4 |
| Full non-core identity | 12 | Q·x=x,E·x=x for x∉core | SAT (303 dom) | ~14s | Too disruptive (35 varying) |
| Full associativity | any | (a·b)·c = a·(b·c) | UNSAT | <1s | |
| Right identity | ≥6 | ∃e: x·e=x ∀x | UNSAT | <1s | |
| Moufang identity | any | UNSAT | <1s | ||
| Entropic identity | any | UNSAT | <1s |
The full axiom set scales cleanly from N=12 to N=16. All five phases are SAT, with the complete constraint set (base axioms + computational package + IO + 8-state counter + selection axiom) solving in under 10 seconds.
The N=16 model accommodates multi-duty elements — single elements that satisfy multiple functional roles simultaneously. This is possible because the axioms constrain relationships on the core range [2, CORE), and elements outside core can serve counter/IO roles without conflict.
The maximal extraction Ψ₁₆ᶠ adds four new operations on top of the full Ψ₁₆ constraint set:
| Operation | Element | Description |
|---|---|---|
| DEC | 15 | Reverse 8-cycle: DEC·sᵢ = s₍ᵢ₋₁ mod 8₎ |
| PAIR/FST/SND | 11/14/6 | Curried 2×2 product on {s0,s1} with projections |
| INC2 | 7 (E) | 4-state sub-counter on {s0,s1,s2,s3} |
| SWAP | 14 | Involution on core {2,3,4,5}: SWAP·(SWAP·x) = x |
All constraints are simultaneously SAT (62 seconds). The resulting table has 83 machine-checked Lean theorems in Psi16Full.lean (130+ total across 4 proof files).
In the full model, elements serve up to 4 roles each:
| Element | Roles |
|---|---|
| 14 | GET / FST / SWAP / s1 (4 roles) |
| 6 (Q) | Q / SND / s2 / p01 (4 roles) |
| 7 (E) | E / INC2 / s7 (3 roles) |
| 15 | DEC / PUT / s5 (3 roles) |
| 11 | PAIR / s3 / p11 (3 roles) |
| 9 (η) | η / p10 (2 roles) |
| 12 | s0 / p00 (2 roles) |
| 8 (ρ) | ρ / s6 (2 roles) |
| 10 (Y) | Y / s4 (2 roles) |
| 13 (INC) | INC only (1 role) |
Key structural changes from Ψ₁₆:
- g (element 4) is inert — not an encoder. The only inert element.
- 3 testers: τ(3), SEQ(5), s0(12) — up from 2 in Ψ₁₆
- Only 2 idempotents: {0, 1} — down from 4 in Ψ₁₆
- WL-1 discrete after 1 refinement (rigid)
- {⊤,⊥,Q,E} generates all 16 in ≤4 steps
C (Kripke) blocks operational dispatch (an encoder can't produce boolean output to control branching). Therefore branching MUST go through a tester. This is "Path 2":
ρ·x = f·x if τ·x = ⊤
ρ·x = g·x if τ·x = ⊥
All 8 phases tested SAT at N=12:
- Branch alone: SAT
- Branch + f≠g: SAT
- Branch + Compose: SAT
- Branch + Compose + Y: SAT
- Branch + Compose + Y + QE: SAT
- Full + 1-inert: SAT
- Full + Selection: SAT
- Full + E-transparency: SAT
In the dominant role-signature cluster at N=12, Q·10 (Q applied to the Y/inert element) is naturally fixed at 4 in all 499 dominant models. This is not an axiom but an emergent consequence. The QE round-trip E·(Q·10) = 10 does NOT hold (Q·10=4 gives E·4=2≠10).
| Feature | Min N | Elements needed |
|---|---|---|
| L8 (full ladder) | 6 | 2 absorbers + 1 tester + 2 encoders + 1 inert |
| + QE pair | 8 | + 2 for Q, E |
| + Branch/Compose/Y | 12 | + 1 branch + 1 compose + 1 Y + 1 free |
| + IO + 8-state counter + Selection | 16 | + 1 INC + IO/counter states (double-duty) |
| N | Absorbers | Testers | Encoders | Inert |
|---|---|---|---|---|
| 6 | 2 | 1 | 2 | 1 |
| 8 | 2 | 1 | 4 | 1 |
| 12 | 2 | 1 | 8 | 1 |
| 16 | 2 | 2 | 11 | 1 |
Pattern: absorbers fixed at 2, inert at 1 (with 1-inert axiom). Testers may increase at higher N (2 at N=16). All additional elements become encoders. Encoder dominance: encoders grow roughly as N-5.
The canonical representative at N=16, extracted with the full constraint set including the selection axiom η·ρ = τ. Machine-verified in Lean 4 (Kamea/Psi16.lean, 42 theorems, all by decide/native_decide).
PSI_16 = [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # 0 ⊤ (top) [absorber]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], # 1 ⊥ (bot) [absorber]
[1, 11, 9, 15, 11, 5, 3, 13, 8, 12, 10, 4, 6, 2, 14, 7], # 2 f / PUT [encoder]
[1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1], # 3 τ [tester]
[15, 0, 6, 9, 14, 5, 2, 2, 11, 2, 9, 4, 6, 10, 14, 3], # 4 g / GET [encoder]
[14, 1, 9, 2, 10, 5, 11, 3, 8, 2, 5, 5, 12, 11, 15, 8], # 5 x5 [encoder]
[0, 0, 5, 14, 2, 12, 4, 10, 7, 3, 4, 7, 3, 6, 4, 3], # 6 Q / s4 [encoder]
[0, 1, 4, 15, 6, 2, 15, 15, 10, 12, 7, 12, 5, 15, 3, 2], # 7 E [encoder]
[12, 1, 9, 9, 14, 5, 12, 7, 8, 8, 2, 7, 4, 10, 11, 2], # 8 ρ / s2 [encoder]
[10, 1, 12, 8, 11, 5, 15, 5, 3, 12, 9, 4, 4, 4, 3, 2], # 9 η / s0 [encoder]
[7, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7], # 10 Y / s7 [inert]
[0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0], # 11 ν / s5 [tester]
[1, 14, 6, 2, 4, 3, 3, 13, 5, 4, 13, 13, 6, 10, 4, 2], # 12 s6 [encoder]
[13, 1, 9, 8, 11, 2, 11, 2, 15, 14, 9, 12, 10, 15, 8, 6], # 13 INC [encoder]
[9, 0, 13, 3, 14, 6, 15, 11, 12, 12, 5, 2, 10, 12, 4, 8], # 14 s1 [encoder]
[1, 2, 3, 12, 6, 2, 7, 2, 2, 2, 7, 6, 2, 6, 2, 10], # 15 SEQ / s3 [encoder]
]Properties of Ψ₁₆:
- All 20 verification checks pass (axioms, roles, WL-1, generation, producibility, counter, IO, selection)
- WL-1 discrete (rigid): all 16 elements distinguishable after 1 Weisfeiler-Leman refinement
- Fully producible: every element appears as some
a·b - {⊤,⊥,Q,E} generates all 16 elements in ≤4 steps (Lean-verified)
- Selection axiom: η·ρ = 3 = τ (satisfied)
- Y-combinator: Y·ρ = 7 = E, ρ·7 = 7 (fixed point of ρ is E)
- 4 idempotents: {0, 1, 5, 8} = {⊤, ⊥, x5, ρ}
- No associative sub-magma of size ≥ 4
- 8-state counter: INC(13) cycles 9→14→8→15→6→11→12→10→9, τ detects zero state s0=9
- IO roundtrip: GET·(PUT·x) = x on core {2,3,4,5}, with PUT=f(2), GET=g(4)
- Actuality irreducibility: all 14 tester core cells are free (SAT-verified)
s0(η=9) →INC→ s1(14) →INC→ s2(ρ=8) →INC→ s3(SEQ=15) →INC→
s4(Q=6) →INC→ s5(ν=11) →INC→ s6(12) →INC→ s7(Y=10) →INC→ s0(η=9)
Zero test: τ·s0 = ⊤ (accept), τ·sₖ = ⊥ for k≠0 (reject).
INC is element 13 — the only non-absorber with a single dedicated role. All other counter states are double-duty elements that also serve computational/IO roles.
| Operation | Element | Behavior |
|---|---|---|
| PUT | f(2) | Writes data: PUT·x encodes x for x ∈ core |
| GET | g(4) | Reads data: GET·(PUT·x) = x for x ∈ core |
| SEQ | 15 | Sequencer: SEQ·PUT ≠ PUT, SEQ·GET ≠ GET |
The encoders f and g double as PUT and GET respectively. This works because the IO roundtrip constraint only applies on core {2,3,4,5}, which is the same range where Branch dispatch operates.
The maximally-constrained representative at N=16, extracted with all operational constraints simultaneously. Machine-verified in Lean 4 (Kamea/Psi16Full.lean, 83 theorems, all by decide/native_decide).
PSI_16_FULL = [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # 0 ⊤ (top) [absorber]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], # 1 ⊥ (bot) [absorber]
[5, 1, 13, 7, 11, 5, 6, 8, 2, 5, 11, 9, 4, 14, 3, 15], # 2 f [encoder]
[0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1], # 3 τ [tester]
[0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11],# 4 g [inert!]
[0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0], # 5 SEQ [tester]
[15, 0, 5, 9, 3, 15, 14, 14, 2, 12, 8, 14, 12, 4, 12, 8], # 6 Q / SND / s2 [encoder]
[0, 1, 8, 4, 13, 2, 11, 2, 14, 3, 15, 12, 14, 15, 6, 5], # 7 E / INC2 / s7 [encoder]
[12, 1, 13, 7, 11, 5, 12, 11, 4, 12, 5, 14, 15, 7, 11, 12], # 8 ρ / s6 [encoder]
[1, 6, 14, 14, 14, 14, 9, 8, 3, 15, 5, 7, 13, 11, 12, 4], # 9 η / p10 [encoder]
[13, 1, 4, 3, 12, 11, 2, 11, 5, 3, 8, 14, 9, 7, 11, 11], # 10 Y / s4 [encoder]
[14, 1, 9, 10, 11, 13, 12, 7, 5, 6, 8, 2, 14, 12, 10, 4], # 11 PAIR / s3 [encoder]
[0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1], # 12 s0 [tester]
[3, 0, 14, 4, 14, 6, 11, 12, 7, 3, 15, 10, 14, 2, 6, 8], # 13 INC [encoder]
[14, 0, 5, 4, 3, 2, 12, 5, 11, 14, 3, 14, 12, 2, 6, 3], # 14 GET/FST/SWAP/s1 [encoder]
[1, 3, 13, 15, 3, 7, 14, 8, 15, 4, 11, 6, 7, 14, 12, 10], # 15 DEC/PUT/s5 [encoder]
]Properties of Ψ₁₆ᶠ:
- All 29 verification checks pass (axioms, roles, WL-1, generation, producibility, counter, IO, selection, DEC, PAIR/FST/SND, INC2, SWAP)
- WL-1 discrete (rigid): all 16 elements distinguishable after 1 refinement
- Fully producible: every element appears as some
a·b - {⊤,⊥,Q,E} generates all 16 elements in ≤4 steps (Lean-verified)
- Selection axiom: η·ρ = 3 = τ
- Y-combinator: Y·ρ = 5 = SEQ, ρ·5 = 5 (fixed point of ρ is SEQ)
- Only 2 idempotents: {0, 1} = {⊤, ⊥}
- No associative sub-magma of size ≥ 4
- 8-state counter: INC(13) cycles 12→14→6→11→10→15→8→7→12, τ detects zero state s0=12
- Reverse counter: DEC(15) cycles in reverse: 12→7→8→15→10→11→6→14→12
- IO roundtrip: GET·(PUT·x) = x on core {2,3,4,5}, with PUT=15, GET=14
- 2×2 product: PAIR(11) is curried — (PAIR·s0)·s0 = p00, (PAIR·s0)·s1 = p01, etc.
- Projections: FST(14) and SND(6) extract first/second components from pair states
- Sub-counter: INC2(7=E) cycles the first 4 states: s0→s1→s2→s3→s0
- SWAP involution: SWAP(14) permutes core: 2↔5, 3↔4
- Actuality irreducibility: all 14 tester core cells are free (SAT-verified)
s0(12) →INC→ s1(14) →INC→ s2(Q=6) →INC→ s3(11) →INC→
s4(Y=10) →INC→ s5(15) →INC→ s6(ρ=8) →INC→ s7(E=7) →INC→ s0(12)
DEC reverses this cycle exactly. Zero test: τ·s0 = ⊤, τ·sₖ = ⊥ for k≠0.
Pair states encode all combinations of {s0(12), s1(14)}:
| Pair | State | Element | FST | SND |
|---|---|---|---|---|
| (s0,s0) | p00 | 12 (=s0) | s0 | s0 |
| (s0,s1) | p01 | 6 (=Q) | s0 | s1 |
| (s1,s0) | p10 | 9 (=η) | s1 | s0 |
| (s1,s1) | p11 | 11 (=PAIR) | s1 | s1 |
Construction is curried: PAIR·sᵢ returns an intermediate element, then (PAIR·sᵢ)·sⱼ = pᵢⱼ.
WARNING: This is ONE model from the solution space, not THE unique model. 117/144 cells are free.
PSI_12 = [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # 0 ⊤ (top)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], # 1 ⊥ (bot)
[1, 3, 10, 6, 7, 7, 4, 9, 7, 9, 9, 2], # 2 f (encoder)
[0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1], # 3 τ (tester)
[1, 4, 7, 7, 4, 2, 10, 3, 7, 4, 4, 7], # 4 g (encoder)
[4, 1, 3, 7, 2, 10, 11, 5, 6, 8, 9, 9],# 5 encoder
[1, 11, 4, 3, 10, 5, 11, 7, 2, 8, 10, 8],# 6 Q (quote)
[0, 1, 5, 3, 2, 10, 3, 10, 4, 4, 3, 9],# 7 E (eval)
[1, 9, 7, 6, 7, 7, 3, 7, 2, 9, 10, 7], # 8 ρ (branch)
[10, 1, 7, 7, 7, 7, 4, 9, 3, 11, 9, 3],# 9 η (compose)
[9, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9], # 10 Y (inert)
[1, 5, 6, 8, 4, 7, 8, 11, 7, 3, 9, 10],# 11 encoder
]Properties: WL-1 discrete, fully producible, {⊤,⊥,Q,E} generates all 12 in ≤2 steps, 8 single generators, 4 idempotents {0,1,4,7}, η·ρ=3=τ, Y·ρ=9 and ρ·9=9.
The full Ψ₁₆ Cayley table is machine-verified in Lean 4 (Mathlib v4.28.0). All 42 theorems are proved computationally via decide or native_decide. Build time: ~9 seconds.
Verified properties:
| Category | Theorems | Method |
|---|---|---|
| Absorbers (L0) | top_absorbs, bot_absorbs, only_two_absorbers |
decide |
| Extensionality (L3) | ext_rows, ext_cols |
decide |
| Role classification | tau_is_tester, nu_is_tester, exactly_two_testers, y_is_inert, exactly_one_inert |
decide/native_decide |
| Kripke (C) | dichotomy |
native_decide |
| Power-associativity (PA) | power_assoc |
decide |
| Non-associativity | not_associative, not_assoc_witness |
decide |
| QE inverse | qe_roundtrip, eq_roundtrip |
decide |
| E-transparency | e_transparent_top, e_transparent_bot |
decide |
| Branch | branch_true, branch_false, f_g_differ |
decide |
| Compose | compose_def |
decide |
| Y-combinator | y_fixed, y_fixed_value |
decide |
| 8-state counter | inc_s0..inc_s7, zero_test_hit, zero_test_s1..zero_test_s7 |
decide |
| IO | io_roundtrip, seq_put, seq_get |
decide |
| Rigidity | fingerprint_unique, row_injective |
decide |
| Constructibility | fully_producible, generates_all |
decide/native_decide |
| Selection axiom | selection_axiom : psi eta rho = tau |
decide |
| Idempotents | idem_top, idem_bot, idem_x5, idem_rho, exactly_four_idempotents |
decide |
| VV axiom | vv_axiom |
native_decide |
| D axiom | inert_propagation |
native_decide |
The full Ψ₁₆ᶠ Cayley table is machine-verified in Lean 4. All 83 theorems are proved computationally via decide or native_decide. Build time: ~10 seconds.
Verified properties (beyond Ψ₁₆):
| Category | Theorems | Method |
|---|---|---|
| DEC reverse cycle | dec_s0..dec_s7 |
decide |
| PAIR construction | pair_s0_s0, pair_s0_s1, pair_s1_s0, pair_s1_s1 |
decide |
| FST extraction | fst_p00..fst_p11 |
decide |
| SND extraction | snd_p00..snd_p11 |
decide |
| INC2 sub-counter | inc2_s0..inc2_s3 |
decide |
| SWAP involution | swap_2..swap_5, swap_involution |
decide |
| Role classification | exactly_3_testers, g_enc_is_inert, exactly_one_inert |
native_decide |
| Idempotents | exactly_2_idempotents |
decide |
Full theorem list: structural axioms (5) + role classification (6) + Kripke (1) + PA/non-assoc (3) + QE (4) + Branch/Compose/Y/Selection (7) + INC cycle (8) + zero tests (8) + DEC cycle (8) + IO (3) + PAIR (4) + FST (4) + SND (4) + INC2 (4) + SWAP (5) + rigidity (2) + constructibility (2) + idempotents (3) + VV/D (2) + witness (1) = 83 theorems.
| File | Content |
|---|---|
DiscoverableKamea.lean |
Full 66-atom Cayley table + 66 uniqueness theorems |
Delta1.lean |
Core 17-element directed model |
Rigidity.lean |
Automorphism rigidity of Δ₁ |
Psi16.lean |
Ψ₁₆ with selection axiom (42 theorems) |
Psi16Full.lean |
Ψ₁₆ᶠ with all operations (83 theorems) |
- Does the axiom system scale beyond N=12? Yes — all axioms SAT at N=16, including IO and 8-state counter.
- Is the selection axiom η·ρ = τ compatible with counter embedding? Yes — when INC is a separate element (13), not η itself. The conflict arose from double-duty: η=INC forced η·ρ = INC·s4 = s5 ≠ τ.
- Can arithmetic coexist with self-description? Yes — the 8-state counter and IO roundtrip coexist with all structural axioms at N=16.
- Lean verification feasible? Yes — 83 theorems in Psi16Full.lean (130+ total across 4 proof files), all proved computationally in ~10 seconds.
- Can all operations coexist in a single table? Yes — DEC, PAIR/FST/SND, INC2, and SWAP are all simultaneously satisfiable with the full axiom set. Ψ₁₆ᶠ is the proof: one table, every operation, 83 machine-checked theorems.
-
Cell-by-cell freedom at N=16: Run the push/pop analysis on the full N=16 constraint set to determine exactly how many of the 256 cells are fixed vs free.
-
Study the variety: Treat the solution space as an algebraic variety. What is its dimension? What are its irreducible components?
-
Strengthen axioms further: Can we pin more cells?
- Column distinctness (all columns distinct, not just rows)
- Full QE extension (QE inverse on all non-absorbers, not just core)
- Orbit minimality (squaring orbits as short as possible)
- Maximal constructibility ({⊤,⊥,Q,E} generates all in minimal steps)
-
Arithmetic capacity: The 117 free cells at N=12 (and likely more at N=16) could encode arithmetic operations. Can we embed addition/multiplication tables in the free cells while preserving all axioms?
-
N=32 and beyond: Does the double-duty architecture continue to scale? At N=32, could we embed a 16-state counter + richer IO?
The axioms specify a self-describing algebra: one that contains its own quote/eval pair, branch/compose/Y combinators, IO channels, and counter. But self-description is a relational property — constraints pin relationships between cells, not individual cell values. The determination question is: how much of the table does self-description actually force?
Answer so far: ~19% at N=12. The axioms determine the skeleton — roles, absorbers, functional relationships on core — but leave the flesh almost entirely open. The multi-duty architecture of Ψ₁₆ᶠ pushes this further: elements serve up to 4 simultaneous roles (GET/FST/SWAP/s1), DEC reverses INC exactly, PAIR/FST/SND encode a 2×2 product space, and INC2 embeds a 4-cycle sub-counter — all in a single 16×16 table. The algebra is far richer than its axiom count implies.
| File | Purpose |
|---|---|
ds_search/stacking_analysis.py |
All analysis functions (~17k lines) |
ds_search/axiom_explorer.py |
Core encoder: encode_level(), classify_elements(), helpers |
ds_search/substrate_analysis.py |
Earlier substrate/stacking analysis |
Kamea/Psi16.lean |
Lean 4 verification of Ψ₁₆ (42 theorems) |
Kamea/Psi16Full.lean |
Lean 4 verification of Ψ₁₆ᶠ (83 theorems) |
docs/psi_framework_summary.md |
This document |
docs/minimal_model.md |
Earlier minimal model notes |
| Function | What it does |
|---|---|
n16_viability() |
N=16 viability check — 5 phases, all SAT |
extract_psi16() |
Extract Ψ₁₆ without selection axiom (original) |
extract_psi16_selection() |
Extract Ψ₁₆ WITH selection axiom η·ρ=τ |
extract_psi16_full() |
Extract Ψ₁₆ᶠ with ALL operations + Lean generation (canonical) |
tester_branching() |
Path 2 branching — 8 phases, all SAT |
model_space_analysis() |
Enumeration + WL clustering (unreliable for freedom) |
extract_psi() |
Extract N=12 Ψ representative |
etrans_residual_freedom() |
Correct cell-by-cell freedom at N=12 (117 free) |
n8_freedom_analysis() |
Correct cell-by-cell freedom at N=8 (46 free) |
squaring_stability() |
SS axiom test — incompatible with structure |
qe_tester_causality() |
Proves E·⊤=⊤ does NOT entail tester values |
def build_solver():
s, dot = encode_level(8, N, timeout_seconds=600)
add_full_base(s, dot, N) # C + D + PA + VV
add_qe_pair(s, dot, N, Q, E) # QE inverse on core
# + 1-inert, E-trans, Branch, Compose, Y, Selection
# + IO (PUT, GET, SEQ), 8-state counter (INC)
return s, dotCell-by-cell freedom check:
for v in range(N):
s.push()
s.add(dot[i][j] == v)
if s.check() == sat:
sat_vals.append(v)
s.pop()Generated March 2026. Updated March 8 2026 with Ψ₁₆ᶠ (full operations) results — 83 Lean theorems in Psi16Full.lean (130+ total across 4 proof files), all machine-checked. All SAT results produced by Z3 via Python z3-solver.