feat: add Towers of Hanoi formula prototype (gt-8tmz)

Demonstrates that molecule algebra solves the "million step workflow"
problem that MAKER addressed with distributed voting.

Key insight: structure is mechanical, only leaf execution needs AI.
- The move sequence is 100% deterministic (2^n - 1 moves)
- Each step is trivial ("move disk 3 from A to C")
- No voting needed - formula generates perfect structure

New beads filed:
- gt-8tmz.26: Direct formula-to-wisp (skip proto for huge ephemeral work)
- gt-8tmz.27: Computed range expansion (for-each over expressions)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-23 19:27:20 -08:00
parent c13eb39908
commit 837cad67b8

View File

@@ -0,0 +1,101 @@
# Towers of Hanoi Formula
#
# Demonstrates that molecule algebra solves the "million step workflow" problem.
# LLMs fail on long sequences because errors accumulate (99.9%^1000 ≈ 37% success).
# MAKER used voting to reduce error. We use mechanical structure instead.
#
# Key insight: The move sequence is deterministic. Only execution needs AI.
# And each step is trivial: "move disk X from peg Y to peg Z".
#
# For n disks: 2^n - 1 moves
# 20 disks = 1,048,575 moves (the "million step" problem)
#
# The iterative algorithm (no recursion needed):
# For move k (1-indexed):
# - disk = largest power of 2 dividing k (disk 1 is smallest)
# - direction = computed from disk parity and move number
#
# This formula uses for-each to generate all moves at cook time.
formula: towers-of-hanoi
description: >
Solve Towers of Hanoi for {disks} disks. Generates 2^{disks} - 1 steps,
each a trivial move operation. Demonstrates mechanical structure generation
for arbitrarily long workflows.
version: 1
vars:
disks: "{{disks}}"
source_peg: "A"
target_peg: "C"
auxiliary_peg: "B"
# The magic: for-each over computed move sequence
# Each move is deterministic, computed from move number
generate:
# This is pseudo-syntax for the runtime expansion we'd need
for-each:
var: move_num
range: "1..2^{disks}" # 1 to 2^n - 1
step:
id: "move-{move_num}"
description: >
Move {computed_disk} from {computed_source} to {computed_target}.
This is move {move_num} of {total_moves}.
Simply execute the move - no decision needed.
needs:
- "move-{move_num - 1}" # Sequential dependency
compute:
# Disk to move: position of lowest set bit in move_num
disk: "lowest_set_bit({move_num})"
# Peg calculations based on disk parity and move number
source: "peg_for_disk({disk}, {move_num}, 'source')"
target: "peg_for_disk({disk}, {move_num}, 'target')"
# Alternatively, simpler recursive template for smaller N:
# (This would need the recursive expansion operator)
steps:
- id: setup
description: >
Verify initial state: {disks} disks stacked on peg {source_peg}.
All disks in order (largest on bottom).
- id: solve
description: >
Execute all {total_moves} moves to transfer tower from
{source_peg} to {target_peg}.
needs: [setup]
# This step would be expanded by the generate block above
- id: verify
description: >
Verify final state: all {disks} disks now on peg {target_peg}.
Tower intact, all moves were legal.
needs: [solve]
# For the prototype, let's show a 3-disk example (7 moves):
example_3_disk:
# Move sequence for 3 disks: A→C, A→B, C→B, A→C, B→A, B→C, A→C
steps:
- id: move-1
description: "Move disk 1 from A to C"
- id: move-2
description: "Move disk 2 from A to B"
needs: [move-1]
- id: move-3
description: "Move disk 1 from C to B"
needs: [move-2]
- id: move-4
description: "Move disk 3 from A to C"
needs: [move-3]
- id: move-5
description: "Move disk 1 from B to A"
needs: [move-4]
- id: move-6
description: "Move disk 2 from B to C"
needs: [move-5]
- id: move-7
description: "Move disk 1 from A to C"
needs: [move-6]