Uproot Hackenbush #
Uproot Hackenbush is played on the same positions as Hackenbush (a graph with a ground vertex, blue/red/green edges, no green edge touching the ground). Besides the usual move of cutting an edge of your own colour or a green edge, a player may uproot: delete a ground edge of the opponent's colour, provided the position has at least two ground edges. Everything disconnected from the ground falls away as usual.
Uproot is a sacrifice: it spends a move to remove one of the opponent's
obligations. The proviso guarantees an uproot never empties the position;
without it a single red ground edge would force Left to move to 0 and lose.
Since the proviso reads the whole position, a disjunctive sum of two
positions is not a position, so the class of positions is not closed under
addition and the stride result is proved by GameForm.hasStride_of_options
rather than via ordinal sums.
Under misère play the strides of a position are its ground counts, exactly
as in Hackenbush (hasStride_groundCount), so uprooting never changes an
outcome (misereOutcome_eq_hackenbush) and the misère quotient is ℤ. Two
bare blue ground edges form {1 | 1}: the player with no obligations is
forced to uproot, lowering the opponent's stride, which is why the stride
definition compares the best move against the opponent's stride candidate.
The ground edges of a position, of either colour.
Equations
- hack.groundEdgeFinset = {e ∈ hack.edgeFinset | hack.ground ∈ e}
Instances For
Player p may delete e: it is not of the opponent's colour, or it is a
ground edge and at least two ground edges exist.
Equations
- Hackenbush.Uproot.CanRemove hack p e = (hack.coloring e ≠ Hackenbush.Color.ofPlayer (-p) ∨ hack.ground ∈ e ∧ 2 ≤ hack.groundEdgeFinset.card)
Instances For
Some player may delete any edge.
Moves in Uproot Hackenbush.
Equations
- Hackenbush.Uproot.moves p hack = {hack' : Hackenbush V | ∃ e ∈ hack.graph.edgeSet, Hackenbush.Uproot.CanRemove hack p e ∧ hack' = hack.remove e}
Instances For
Equations
- GameGraph.uprootHackenbush = { moves := Hackenbush.Uproot.moves }
Instances For
Convert an Uproot Hackenbush position to a GameForm.
Equations
- Hackenbush.Uproot.toGameForm hack = GameGraph.toForm hack
Instances For
The game form is zero iff the graph has no edges.
A move by a player with no ground edges never empties the position.
Stride theory #
When p has no ground edges, the position is solved for p.
When groundCount p ≥ 1, the position is not solved for p.
The p-stride of an Uproot Hackenbush position equals the number of
p-coloured ground edges, exactly as in Hackenbush.
Uprooting never changes an outcome.
Uproot Hackenbush as a ruleset. This is a different Ruleset structure on
the same position type as Hackenbush, so it is not an instance.
Equations
- Hackenbush.Uproot.ruleset = { toGameForm := Hackenbush.Uproot.toGameForm, moves_toGameForm := ⋯ }
Instances For
The game forms of Uproot Hackenbush positions.
Equations
- Hackenbush.Uproot.Forms V g = ∃ (hack : Hackenbush V), g = Hackenbush.Uproot.toGameForm hack