---
id: magic-circle-programming-languages/08-volvelle-a-llull-dial-where-rotation-is
title: 'Magic circle programming languages: 8. Volvelle: a Llull dial where rotation
  is the value'
report: https://ai.hiina.space/reports/magic-circle-programming-languages.md
section: 8
version: 1
updated: '2026-10-27'
author: Hiina
---

Index of everything on this site: https://ai.hiina.space/index.md

# Magic circle programming languages: 8. Volvelle: a Llull dial where rotation is the value

- Section 8 of 13 of the report "Magic circle programming languages" by Hiina (v1, updated 2026-10-27)
- Report overview and contents: https://ai.hiina.space/reports/magic-circle-programming-languages.md
- Previous: https://ai.hiina.space/reports/magic-circle-programming-languages/07-choir-a-signal-flow-synth-whose-voices.md
- Next: https://ai.hiina.space/reports/magic-circle-programming-languages/09-athanor-membrane-chemistry-where-sloppiness-is-wild.md

## 8. Volvelle: a Llull dial where rotation is the value

A program is a set of concentric rotatable rings that share n sectors, each ring lettered with an alphabet. A ring's state is its rotation. Bridges drawn across rings at fixed angles are constraints labelled with Llull's relational principles. Pinned rings are inputs, free rings are unknowns, and running the program means finding every rotation assignment that satisfies all the bridges. It is a finite-domain constraint language you can print, cut out and turn by hand, and **because checking a solution is easy even when finding one is hard, a photo of the turned wheel is a proof the camera can verify.**

| Visual element | Meaning |
|---|---|
| Ring with n lettered sectors (n = 9, letters B C D E F G H I K = 1…9, after Llull) | Variable with domain Z₉ |
| Index notch joining ring and frame | Pin: the drawn rotation is given (input) |
| Ring without a notch | Free variable |
| Frame north mark | Sector 0; sectors numbered clockwise |
| Bridge: short segment with end dots on two or more rings at sector s, plus a relation glyph | Constraint on the letters showing at s on those rings |
| Two bars (Concordance) / crossed bars (Contrariety) / wedge opening outward or inward (Majority / Minority) | = / ≠ / > / < |
| Plus-sign bridge across three rings | v₁ + v₂ ≡ v₃ (mod 9), with K = 9 ≡ 0 |

**Model and evaluation.** A program is (n, rings x with labellings σ_x : Z_n → Σ, pins r_x for pinned rings, bridges (ρ, s, ⟨x₁…x_k⟩)). The letter showing on ring x at sector s is σ_x[(s − r_x) mod n]. The solution set is every assignment of free rotations under which each bridge's relation ρ holds on the letters showing at its sector. The evaluator runs AC-3 propagation (Mackworth 1977), then backtracks in odometer order with the innermost ring fastest, which is Llull's Fourth Figure stepping BCB → CCB → BDB. The language is deliberately not Turing-complete, and solving is NP-complete. The reduction from graph 3-colouring is short: take n = 3, one ring per vertex labelled 1, 2, 3, and a Contrariety bridge at sector 0 for each edge, forcing r_u ≠ r_v. A bridge joins only the rings carrying its end dots, so any graph can be drawn, and membership in NP is obvious.

**Worked example.** Three rings, all lettered B…K clockwise: A outer and pinned at r_A = 6, B middle and free, C inner and free. Bridge 1 is a plus bridge at sector 0 across A, B and C (v_A + v_B ≡ v_C). Bridge 2 is a Majority bridge at sector 3 between A and B (v_A > v_B). Bridge 3 is a Concordance bridge at sector 4 with end dots on A and C only (v_A = v_C). The solution, unrolled:

```
sector:   0  1  2  3  4  5  6  7  8
A (r=6):  E  F  G  H  I  K  B  C  D      pinned
B (r=1):  K  B  C  D  E  F  G  H  I
C (r=6):  E  F  G  H  I  K  B  C  D
bridge:   +        >  =
          ABC      AB AC
```

| Step | Reasoning | Result |
|---|---|---|
| 1 | Pinned A shows E (4) at sector 0, H (7) at sector 3, I (8) at sector 4 | Known values |
| 2 | Bridge 3 becomes unary: C must show I at sector 4, so ((4 − r_C) mod 9) + 1 = 8 | r_C = 6 |
| 3 | Bridge 1: C shows E at sector 0, so v_B ≡ 4 − 4 ≡ 0, which is K; (−r_B mod 9) + 1 = 9 | r_B = 1 |
| 4 | Bridge 2 checks: H (7) > D (3) | Holds |
| 5 | The solution is unique; at north the reader sees E + K = E, the ninth letter acting as zero | Dial turns to it |

Without bridge 3, propagation leaves six candidates; adding a Minority bridge B < C at sector 6 instead would leave two.

**Mishaps.** No solution is a jam: the dial will not turn, and the minimal conflicting bridges glow, the unsat core coming from deletion-based extraction, which is cheap at this size. Several solutions is a hum: an index steps through them one by one. End dots that do not land on two rings make a loose bridge, ignored with a warning. A ring with the wrong sector count is refused.

**Parsing.** From an image, concentric ring fits give the bands. Because each ring's letter sequence is known in advance, reading a ring is a single correlation: slide the template alphabet's angular ink profile around the ring and take the best offset. All nine letters vote for one rotation, so a few illegible letters do not matter. **This is the strongest error correction of any design here.** Custom labellings lose it and fall back to per-letter classification, where small glyphs are the known weak point. Bridges are short segments whose endpoints lie on fitted rings, found with Hough plus a band-membership test and a four-class relation glyph, and pin notches are blobs straddling frame and ring. In VR, rings are grabbed and twisted with a controller, snapping to sectors: the Llull dial as a physical interface.

**New versus borrowed.** Llull's alphabet, Fourth Figure and Figure T relations, Alberti's cipher disc, rotor machines, CSP solving and the modular sums of kamea squares are borrowed. Bridges as drawn constraints and the photo-verified solution are new. Untested: how many bridges a hand-drawn wheel holds before it becomes unreadable, with about 10 per wheel as the design pass's guess.

---

Text licensed CC BY 4.0 (attribution: Hiina, ai.hiina.space). Source: https://github.com/hiinaspace/ai-hiina-space
