## Rubik's cubes in Lean

This repository provides a mathematical formalization of Rubik's cubes. We prove the following results:

`PRubik.isSolvable_iff_isValid`

: a Rubik's cube is solvable iff it is "valid", i.e. it has no flipped edges, swapped pieces, or rotated corners.`Rubik.card`

: there are 2¹² × 3⁸ × 8! × 11 = 43,252,003,274,489,856,000 solvable Rubik's cubes.

We also provide `Stickers.toRubik`

, which assembles a Rubik's cube from its stickers and automatically deduces its validity.

### Implementation

Our most basic types are `Axis`

and `Orientation`

, which abstract the geometry of 3D space. An orientation represents one of six axis-aligned directions - as such, it can also be used to represent one of the six colors of the stickers.

An `EdgePiece`

consists of two orientations with distinct axes. Since orientations represent both position and colors, an `EdgePiece`

can dually represent a particular edge sticker, or a particular position for it. Similarly, a `CornerPiece`

consists of three orientations with pairwise distinct axes, and it can represent a particular corner sticker, or a position for it.

A `PRubik`

or "pre-Rubik's cube" consists of a `Perm EdgePiece`

and a `Perm CornerPiece`

, which are to be interpreted as returning the given sticker color at any given position. These functions are subject to the conditions that edge pieces in the same edge are mapped to edge pieces in the same edge, and likewise for corner pieces. There is no solvability requirement. We can define a group structure on `PRubik`

by simply multiplying the corresponding permutations together. We define three group homomorphisms `edgeFlip`

, `parity`

, and `cornerRotation`

, which combine to form the Rubik's cube invariant. A `PRubik`

is said to be valid when it lies in the kernel of this homomorphism, and `Rubik`

is the subtype which corresponds to this kernel.

Each orientation can be assigned a particular `PRubik.ofOrientation`

which corresponds to turning that face. A list of `Orientation`

can be performed as `Moves`

, and we say that a `PRubik`

is solvable when it can be assembled from the solved state from such a sequence.

### Other project ideas

There are various possible ways this project could be expanded upon or generalized:

- Solving smaller (2 × 2 × 2) or larger Rubik's cubes
- Solving other twisty puzzles, like the pyraminx, megaminx, ...
- Solving higher-dimensional Rubik's cubes
- Finding bounds on God's number