CC-DIR-INVOLUTIONproof (Kani)
Statement. Directions come in opposite pairs, so adjacency is symmetric.
In plain terms. Every direction has an opposite: you can always step back the way you came.
Every normative claim in checkers-core, as a machine-checked law: formula, precise statement, plain-language meaning, and the evidence that establishes it. Generated from the link-time law registry by checkers-spec-gen.
| Evidence | Laws |
|---|---|
| proof (Kani) | 11 |
| exhaustive | 17 |
| property test | 15 |
| total | 43 |
Every chapter's prose and every law come from checkers-core; the page is generated, never edited.
Every playable hole is identified by an axial hex coordinate $(q,r) \in \mathbb{Z}^2$, with the third cube coordinate implicit as $s = -q-r$.
Six directions connect adjacent holes:
$$D = {(1,0),\ (1,-1),\ (0,-1),\ (-1,0),\ (-1,1),\ (0,1)}$$
Two holes $u, v$ are adjacent exactly when $v - u \in D$. The listing above is in rotational order, so consecutive directions are $60^\circ$ apart. Only the set matters to the rules; the order is fixed so that direction indices are stable.
In the implementation, directions are an enumeration rather than a collection of vectors, which makes "there are exactly six directions" a structural fact: no seventh direction is representable.
CC-DIR-INVOLUTIONproof (Kani)
Statement. Directions come in opposite pairs, so adjacency is symmetric.
In plain terms. Every direction has an opposite: you can always step back the way you came.
The board's centre is a hexagon of radius four:
$$H_4 = {(q,r) \in \mathbb{Z}^2 : |q| \le 4,\ |r| \le 4,\ |q+r| \le 4}$$
It contains $1 + 6(1+2+3+4) = 61$ holes.
All three constraints are required. Dropping the bounds on $q$ and $r$ leaves $|q+r| \le 4$, which describes an unbounded diagonal strip rather than a hexagon.
CC-GEO-NONVACUOUSproof (Kani)
Statement. The hexagon, each camp, and the board are inhabited with their stated sizes.
In plain terms. The regions are real: 61 middle holes, 10 per camp, 121 altogether.
Six triangular camps of ten holes each surround the hexagon. Camp $C_0$ is seated flush against the hexagon's $q = 4$ edge:
$$C_0 = {(q,r) \in \mathbb{Z}^2 : 5 \le q \le 8,\ -4 \le r \le -(q-4)}$$
Its columns hold $4, 3, 2, 1$ holes, decreasing outward to a single apex at $(8,-4)$. The triangle therefore points away from the centre, and its four-hole base lies against the hexagon.
The orientation is the whole content of this chapter, and it is easy to get wrong. The inward-pointing variant
$$C_0^{\text{bad}} = {(q,r) : 5 \le q \le 8,\ -q+5 \le r \le 0}$$
also has ten holes per camp and also yields a 121-hole board, so every cardinality check passes. But it meets the hexagon at the single hole $(5,0)$ instead of along a four-hole edge, leaving the six camps dangling from the hexagon's corners. It is not a six-pointed star.
Cardinality alone cannot detect this. The distinguishing property is contact with the hexagon: a correct camp has four holes adjacent to $H_4$, contributing eight camp-to-hexagon adjacent pairs, whereas the degenerate one has a single contact hole and a single adjacent pair.
CC-GEO-BASE-CAMPexhaustive
Statement. Camp 0 occupies columns q=5..8 with 4,3,2,1 holes, apex outward at (8,-4).
In plain terms. The home camp fills four columns of 4, 3, 2 and 1 holes, pointing outward.
CC-GEO-CONTACTexhaustive
Statement. Each camp's four-hole base sits flush against a hexagon edge, giving eight contact pairs.
In plain terms. Each camp hugs the middle along exactly eight neighbouring pairs of holes.
CC-GEO-INWARD-BADproof (Kani)
Statement. The inward-pointing camp variant touches the hexagon at one hole, so it is not a star.
In plain terms. The wrong camp shape touches the middle at just one hole, and that is how you catch it.
CC-GEO-INWARD-CONTACTexhaustive
Statement. The inward camp has one hexagon contact pair, against eight for a correct camp.
In plain terms. A proper camp meets the middle at four holes; the wrong shape meets it at one.
The remaining camps are rotations of $C_0$. A $60^\circ$ rotation in axial coordinates is
$$R(q,r) = (-r,\ q+r)$$
and $C_i = R^i(C_0)$ for $i = 0, \ldots, 5$.
$R$ has order six, and $R^3 = -\mathrm{id}$. The second fact is the important one: it means the camp three positions away is the point reflection of the original,
$$C_{(i+3) \bmod 6} = -C_i = {-x : x \in C_i}$$
which is why a player's target is camp $i+3$ — it is geometrically opposite, directly across the centre.
Whether $R$ reads as clockwise or counter-clockwise depends on the rendering convention and is not fixed here. Nothing in the rules depends on the choice, only on $R$ having order six and the camps being indexed consistently.
Note that $R$ sends $(1,0) \mapsto (0,1)$, stepping backwards through the direction order of chapter 1. That is harmless but worth knowing when comparing indices.
CC-GEO-OPPOSITEproof (Kani)
Statement. A player's target camp is the point reflection of their start.
In plain terms. The camp across the centre is the mirror image of your own camp.
CC-GEO-ROT-EXACTproof (Kani)
Statement. The rotation has order exactly six: no smaller power is the identity.
In plain terms. Six turns bring every hole home, and no smaller number ever does.
CC-GEO-ROT-NEGproof (Kani)
Statement. Three rotations equal point reflection, which is why camp i+3 is opposite camp i.
In plain terms. Turn three times and every hole lands on the hole directly opposite the centre.
CC-GEO-ROT-ORDERproof (Kani)
Statement. The 60-degree rotation has order six.
In plain terms. Turn the whole board six times and every hole is back where it started.
CC-GEO-ROT-STEPproof (Kani)
Statement. Rotation maps each direction to its neighbour in the cycle.
In plain terms. One turn rotates each direction onto its neighbour around the cycle.
The board is the disjoint union of the hexagon and the six camps:
$$V = H_4 \mathbin{\dot\cup} C_0 \mathbin{\dot\cup} \cdots \mathbin{\dot\cup} C_5,\qquad |V| = 61 + 6 \cdot 10 = 121$$
A correct construction satisfies more than its cardinality. Each camp must meet the hexagon in exactly eight adjacent pairs; the board graph must be connected; and the whole board must be centrally symmetric, $V = -V$.
A useful end-to-end check is that all six players have the same number of legal moves in the initial position — fourteen on the standard board. This follows from six-fold symmetry, so it fails loudly if a camp is misplaced.
Rendering the construction is the fastest way to catch a mistake:
5
5 5
5 5 5
5 5 5 5
4 4 4 4 . . . . . 0 0 0 0
4 4 4 . . . . . . 0 0 0
4 4 . . . . . . . 0 0
4 . . . . . . . . 0
. . . . . . . . .
3 . . . . . . . . 1
3 3 . . . . . . . 1 1
3 3 3 . . . . . . 1 1 1
3 3 3 3 . . . . . 1 1 1 1
2 2 2 2
2 2 2
2 2
2
Each row $r$ is drawn at horizontal offset $2q + r$. Opposite camps sit diametrically across the centre, as chapter 4 requires.
CC-GEO-CAMP-OFexhaustive
Statement. Camp lookup agrees with camp membership on every hole.
In plain terms. Asking which camp a hole is in always agrees with the camp definitions.
CC-GEO-CARDINALITYexhaustive
Statement. Hexagon of 61 holes plus six camps of 10 gives 121 holes.
In plain terms. The board has 121 holes: 61 in the middle and 10 in each of the six camps.
CC-GEO-DISJOINTproof (Kani)
Statement. The hexagon and the six camps are pairwise disjoint, so every hole is covered once.
In plain terms. Every hole belongs to exactly one region: the middle, or one camp.
CC-GEO-SYMMETRYproof (Kani)
Statement. The board is symmetric under point reflection through centre.
In plain terms. For every hole there is a matching hole straight across the centre.
Six players each own ten indistinguishable pieces. A position is an occupancy function
$$s : V \rightarrow P \cup {\varnothing},\qquad P = {0,\ldots,5}$$
with every hole holding at most one piece. Player $i$ starts with all ten pieces in camp $C_i$ and every other hole empty, so a valid position always has 60 occupied and 61 empty holes.
Player $i$'s target is the opposite camp, $O_i = C_{(i+3) \bmod 6}$.
CC-POS-INITIALexhaustive
Statement. Initially each player fills their own camp and the hexagon is empty.
In plain terms. At the start every camp is full of its own pieces and the middle is empty.
CC-POS-OCCUPANCYproperty test
Statement. Sixty holes are occupied and sixty-one empty, totalling 121.
In plain terms. Sixty holes are occupied, sixty-one are empty, and together they are the whole board.
CC-POS-PIECESproperty test
Statement. Every player owns exactly ten pieces in every position.
In plain terms. Every player always owns exactly ten pieces.
CC-POS-TARGETexhaustive
Statement. A player's target is the opposite camp, distinct from their start, and the pairing is mutual.
In plain terms. Your goal is the camp directly across the centre from where you start.
A turn moves exactly one piece belonging to the active player, and is either one adjacent step or a sequence of jumps — never a mixture.
A piece at $x$ may step to $y$ exactly when
$$s(x) = i \ \land\ y - x \in D \ \land\ s(y) = \varnothing$$
that is, the destination is adjacent and empty. The piece vacates $x$ and occupies $y$; nothing else changes.
CC-STEP-DISPLACEproperty test
Statement. A step moves to an adjacent hole, never further and never onto a piece.
In plain terms. A step moves exactly one hole and lands on an empty one.
CC-STEP-LEGALproperty test
Statement. Generated steps are exactly the adjacent, on-board, empty destinations.
In plain terms. You may step to any adjacent empty hole.
A piece at $x$ may jump in direction $d$ to $x + 2d$ exactly when the intervening hole is occupied and the landing hole is an empty board hole:
$$x+d \in V \ \land\ s(x+d) \neq \varnothing \ \land\ x+2d \in V \ \land\ s(x+2d) = \varnothing$$
The jumped piece is never captured or removed, and may belong to any player — legality depends only on the hole being occupied, not on who occupies it. The only occupancy changes are that $x$ becomes empty and $x+2d$ becomes the mover's.
Since $d \neq 0$, a jump displaces by $2d \neq 0$ and so can never land on its own origin. The jumped hole is exactly the midpoint of the hop.
CC-JUMP-ANY-OWNERexhaustive
Statement. A piece may be jumped regardless of which player owns it.
In plain terms. You may jump over anyone's piece, yours or theirs.
CC-JUMP-DISPLACEMENTproof (Kani)
Statement. A hop moves by twice a direction; the jumped hole is exactly the midpoint.
In plain terms. A jump lands exactly two holes away, with the jumped hole in the middle.
CC-JUMP-LEGALproperty test
Statement. A jump needs an occupied hole to cross and an empty hole to land on.
In plain terms. You may jump only over an occupied hole and only land on an empty one.
CC-JUMP-NO-CAPTUREproperty test
Statement. Jumping leaves the crossed piece in place and removes nothing.
In plain terms. Jumping never removes the piece you jumped over.
A turn may chain arbitrarily many jumps, all performed by the same piece, changing direction freely between hops. The player may stop after any jump; continuing is optional.
Legality is evaluated against the position produced by the preceding jumps. That statement is true but routinely over-read, so it is worth being precise about what does and does not depend on the evolving position.
Because a turn moves only one piece and jumps never capture, the occupancy of every other hole is fixed for the whole turn. Writing $\Omega$ for the occupied holes excluding the moving piece, a jump from the piece's current hole $x$ is legal exactly when
$$x+d \in \Omega \ \land\ x+2d \in V \setminus \Omega$$
Only $x$, $d$, and the fixed set $\Omega$ appear. Within a single turn, therefore, occupancy is a function of the moving piece's position, and the available jumps depend on that position alone. The moving piece can never block itself, since it is excluded from $\Omega$.
The consequence is practical: the set of reachable destinations is the forward closure of a directed graph fixed once per turn, so a breadth-first search over positions, with a single visited set, computes it exactly and always terminates.
It is tempting to conclude instead that the search must be keyed on the pair (position, board state), on the grounds that the board changes after each hop. That is a mistake. Within a turn the state is determined by the position, so such a key can never distinguish two visits that the position alone would not — while making the search appear to need unbounded state. A search keyed that way does not terminate.
Jump sequences genuinely may revisit holes, including the starting hole: with a blocker adjacent, a piece can hop out and straight back. The space of jump paths is therefore infinite, and any procedure enumerating paths needs an explicit guard — forbidding repeats within the current path is the natural choice. The space of destinations is finite regardless, which is all move generation requires. A turn is conventionally required to end somewhere other than where it began, since ending at the origin is indistinguishable from not moving.
CC-JUMP-CLOSUREproperty test
Statement. Breadth-first search over positions yields exactly the routes' destinations.
In plain terms. Everything reachable by any chain of jumps is found by exploring one jump at a time.
CC-JUMP-OMEGAproperty test
Statement. The other pieces never move during a turn, so available jumps depend only on position.
In plain terms. During your turn the other pieces stand still, so what you can reach depends only on where you are.
CC-JUMP-REVISITexhaustive
Statement. A piece can jump out and back, so unguarded route enumeration does not terminate.
In plain terms. You can jump out and straight back, so one turn may visit the same hole twice.
CC-TURN-HOP-CLOSUREproperty test
Statement. Chaining single hops reaches exactly the destinations the closure allows.
In plain terms. Taking one jump at a time reaches exactly the places a whole chain would.
CC-TURN-HOP-ONEproperty test
Statement. Every single-hop destination lies exactly two holes away in one direction.
In plain terms. Every offered hop is a single jump, never two chained together.
CC-TURN-NO-NULL-MOVEexhaustive
Statement. A staged turn whose piece is back at its origin cannot be committed.
In plain terms. A turn that ends where it began cannot be confirmed.
A move is identified by its kind, origin, and destination — not by the route taken. Distinct jump routes to the same hole produce the same resulting position, so they are the same move; counting them separately inflates move counts and any search built on them.
A route may still be recorded for animation or notation, but it must be excluded from equality and hashing.
The complete legal move set for player $i$ is the adjacent steps from each of their pieces, together with one jump move per reachable destination.
CC-MOVE-DEDUPproperty test
Statement. Move generation yields one move per reachable destination, with no duplicates.
In plain terms. There is exactly one move per destination you can reach.
CC-MOVE-IDENTITYexhaustive
Statement. Two routes to the same hole are the same move, so routes are not part of identity.
In plain terms. A move is its start and its end; the path taken does not matter.
CC-MOVE-ONBOARDproperty test
Statement. Every generated move starts on one of the player's pieces and ends on the board.
In plain terms. Every move starts on your own piece and ends on an empty board hole.
CC-TURN-STAGED-LEGALproperty test
Statement. Any sequence of legal single hops commits to a move the rules already allow.
In plain terms. Any staged turn you can click together is a move the rules already allow.
Applying a move vacates the origin and occupies the destination. For a jump sequence, no intermediate hole is modified and nothing is captured, so
$$s'(x) = \varnothing,\qquad s'(y) = i,\qquad s'(z) = s(z)\ \ \forall z \notin {x,y}$$
Replaying a route hole-by-hole and applying this net effect therefore agree, which is what justifies identifying moves by destination rather than by route.
CC-APPLY-NETproperty test
Statement. Replaying a route hole-by-hole gives the same position as applying the net effect.
In plain terms. Replaying a route hole by hole ends exactly where the move says.
Turns proceed cyclically through the six players.
The rules do not guarantee the active player has a legal move. The situation is reachable: if a player's ten pieces fill a camp, opponents can occupy that camp's frontier holes and the holes beyond them, leaving no step and no jump available. Such a player still holds all ten pieces, so this is neither a win nor a loss.
This specification resolves it by passing: a player with no legal move forfeits the turn and play continues. If all six players pass in succession the position cannot change, and the game is a draw.
One consequence is that the active player is not simply the turn number modulo six, since passing advances the player without consuming a turn in that sense. Implementations should track the active player as explicit state rather than deriving it.
Rule sets differ here. Passing is the least intrusive convention; others forbid the blocking configuration outright, or oblige the blocking player to move aside.
CC-TURN-BLOCKEDexhaustive
Statement. A player can have no legal move yet all ten pieces, which is neither a win nor a loss.
In plain terms. A player can hold all ten pieces and still have no move, which is neither a win nor a loss.
CC-TURN-CYCLEexhaustive
Statement. Turn order cycles through all six players and returns.
In plain terms. Turns go around the table in order and return to the start.
CC-TURN-PASSexhaustive
Statement. A player with no move passes; when every player has passed in a row, the game is a draw.
In plain terms. A stuck player passes, and a draw needs every player to pass in a row.
CC-TURN-PASS-RESETexhaustive
Statement. A played move resets the pass counter, so a draw needs six passes after it.
In plain terms. A played move resets the pass count, so a draw needs six passes in a row.
Player $i$ wins by occupying every hole of the opposite camp:
$$\forall x \in C_{(i+3) \bmod 6}:\ s(x) = i$$
Since the target camp has ten holes and the player has exactly ten pieces, this is equivalent to all of their pieces having arrived. The game ends at the first position satisfying this for some player.
CC-WIN-CONDITIONexhaustive
Statement. A player wins exactly when every hole of the opposite camp holds one of their pieces.
In plain terms. You win by filling the opposite camp with all ten of your pieces.
Every completed move preserves the following. Each player owns exactly ten pieces; exactly 60 holes are occupied and 61 empty; every hole holds at most one piece. No move creates, destroys, or transfers ownership of a piece — jumping is not capture.
CC-INV-PRESERVEDproperty test
Statement. Every legal move preserves each player's piece count and total occupancy.
In plain terms. No move ever creates, destroys, or hands over a piece.
Two points are deliberately left open, and an implementation must choose explicitly rather than letting the choice emerge from its geometry code.
Camp restrictions. This specification uses the unrestricted convention: camp membership imposes no additional movement constraint, so a piece may enter, leave, or move within any camp subject only to the ordinary rules. Some rule sets restrict occupation of an opponent's camp. Such a restriction belongs in a separate legality predicate, not embedded in the movement rules.
Blocked players. See chapter 12. This specification passes; other conventions exist.
CC-VAR-CAMP-FREEexhaustive
Statement. Under the unrestricted convention a piece may enter, leave, or cross any camp.
In plain terms. Camps add no extra rules: any piece may enter, leave, or cross any camp.