PD-codes #
A PD-code records finite combinatorial crossing data for a link. The halfEdge permutation lists
the four half-edges at each crossing, while the perfect matching edgePair joins the two
half-edges at the ends of each arc. Opposite slots form the two local strands, one of which is
selected by overPair. Crossing-free components are recorded separately.
OrientedPDCode decorates this data with compatible directions on the arcs and crossing-free
components. FramedOrientedPDCode further assigns an integer framing to every component. The
forgetful maps between these three presentation layers let results use only the data they need.
This is a code-level presentation: PDCode neither imposes planarity nor provides a geometric
realization, so these must be supplied separately. Keeping the code finite and explicit avoids
choosing a privileged geometric embedding.
The PD-code encoding adapts M. Mastin, Links and Planar Diagram Codes, Definitions 2--3,
which develops the Bar-Natan/KnotTheory PD convention. Mastin lists, at each crossing, the labels of
the four incident arcs counterclockwise from the incoming under-edge. Here halfEdge labels
half-edges rather than arcs, the four slots of a crossing are read counterclockwise from any
starting slot, the over-strand is recorded by the separate bit overPair, and crossing-free
components are counted separately. The diagram and crossing-sign conventions
follow W. B. R. Lickorish, An Introduction to Knot Theory, GTM 175, Chapter 1. The framing
convention follows R. Gompf and A. Stipsicz, 4-Manifolds and Kirby Calculus, GSM 20, Section 4.5,
especially Proposition 4.5.8.
Main definitions #
TauCeti.PDCode: an unoriented PD-code withncrossings.TauCeti.OrientedPDCode: an orientation decoration of a PD-code.TauCeti.FramedOrientedPDCode: a framing decoration of an oriented PD-code.TauCeti.PDCode.halfEdgeSuccEquiv: the half-edge positions of a code with one crossing more.TauCeti.PDCode.mirrorandTauCeti.PDCode.relabel: reflection and relabelling along equivalences of the finite index types.TauCeti.PDCode.reconnect: reconnect the arcs ending at two half-edges, joining them.TauCeti.PDCode.slotSmoothing: the two smoothings of the four slots at a crossing.TauCeti.PDCode.kink: the one-crossing kink diagram, andTauCeti.OrientedPDCode.positiveKink, its orientation with a positive crossing.TauCeti.OrientedPDCode.reverse: reversal of every component orientation.TauCeti.OrientedPDCode.crossingSign: the sign derived from the local oriented crossing data.TauCeti.OrientedPDCode.writhe: the sum of the crossing signs.
Main results #
TauCeti.OrientedPDCode.crossingSign_eq_one_iffandcrossingSign_eq_neg_one_iffcharacterize the two possible crossing signs.TauCeti.PDCode.mirror_mirrorandTauCeti.PDCode.relabel_relabelgive the basic operation laws.TauCeti.OrientedPDCode.unlinkEquivclassifies zero-crossing oriented PD-codes.
The standard equivalence between crossing-slot pairs and the 4 * n half-edge positions.
Equations
Instances For
The half-edge positions of a code with one crossing more: the 4 * n positions of the first
n crossings, followed by the four slots of the new last crossing.
Equations
Instances For
A slot of one of the first n crossings keeps its half-edge position when a crossing is
added last.
The slots of the last crossing occupy the last four half-edge positions.
A half-edge position of the first n crossings keeps its value when a crossing is added.
The slots of the added crossing follow the 4 * n positions of the first n crossings.
The slot opposite a given slot in the cyclic order at a crossing.
Equations
Instances For
The opposite crossing slot is obtained by adding two cyclically.
The value of the opposite crossing slot.
The opposite-slot permutation swaps slots 0, 2 and slots 1, 3.
Exactly one of a slot and its opposite slot is one of the last two slots 2, 3.
Taking the opposite crossing slot twice returns to the original slot.
The two smoothings of the four slots at a crossing, indexed by an over-pair indicator.
slotSmoothing false pairs slot 0 with slot 3 and slot 1 with slot 2, and
slotSmoothing true pairs slot 0 with slot 1 and slot 2 with slot 3: in both cases each
slot of the pair indicated is joined to the slot preceding it in the counterclockwise order.
Applied to D.overPair i it is therefore the A-smoothing at crossing i, the one turning left
off the over-strand, and applied to !D.overPair i the B-smoothing.
Equations
- TauCeti.PDCode.slotSmoothing b = if b = true then Equiv.swap 0 1 * Equiv.swap 2 3 else Equiv.swap 0 3 * Equiv.swap 1 2
Instances For
The true smoothing pairs slots 0-1 and 2-3.
The false smoothing pairs slots 0-3 and 1-2.
A local smoothing is an involution of the four slots.
A local smoothing moves every slot: it pairs the four slots off into two arcs.
The opposite crossing slot is different from the original slot.
A finite unoriented PD-code with n crossings.
The 4 * n half-edges are grouped into four slots for each crossing by halfEdge, listed
counterclockwise around the crossing. The perfect matching edgePair joins the two half-edges at
the ends of each arc. Slots 0 and 2 form one local strand, while slots 1 and 3 form the
other. crossinglessComponentCount counts circle components which meet no crossing.
overPair i = false selects the 0-2 strand as over, while true selects the 1-3 strand.
- halfEdge : Equiv.Perm (Fin (4 * n))
The half-edge labels occupying the four slots of each crossing.
- edgePair : PerfectMatching (Fin (4 * n))
The perfect matching pairing the two half-edges at the ends of each arc.
- crossinglessComponentCount : ℕ
The number of circle components which meet no crossing.
Which of the two opposite-slot strands is over at each crossing.
Instances For
An oriented PD-code, consisting of an unoriented code and compatible component directions.
- halfEdge : Equiv.Perm (Fin (4 * n))
- edgePair : PerfectMatching (Fin (4 * n))
Whether an arc points away from its incident crossing (
true) or toward it (false).The direction on an arc reverses at its paired half-edge.
- orientation_oppositeCrossingSlot (i : Fin n) (slot : Fin 4) : self.orientation (self.halfEdge ((PDCode.crossingSlotEquiv n) (i, PDCode.oppositeCrossingSlot slot))) = !self.orientation (self.halfEdge ((PDCode.crossingSlotEquiv n) (i, slot)))
The orientation reverses between the opposite slots belonging to each local strand.
The orientations of the circle components which meet no crossing, one entry per component. For such a circle,
trueandfalsesimply label its two orientations, whichTauCeti.OrientedPDCode.reverseexchanges.The orientation multiset has one entry per crossing-free component of the underlying code.
Instances For
A framed oriented PD-code.
On a component meeting a crossing, framing is an integer constant along arc pairings and local
strands. For crossing-free components, crossinglessFramings keeps each orientation paired with
its framing integer. These integers measure the chosen framing relative to the Seifert (0-)
framing. The diagram's blackboard framing instead has coefficient equal to the component writhe.
- halfEdge : Equiv.Perm (Fin (4 * n))
- edgePair : PerfectMatching (Fin (4 * n))
- orientation : Fin (4 * n) → Bool
- orientation_oppositeCrossingSlot (i : Fin n) (slot : Fin 4) : self.orientation (self.halfEdge ((PDCode.crossingSlotEquiv n) (i, PDCode.oppositeCrossingSlot slot))) = !self.orientation (self.halfEdge ((PDCode.crossingSlotEquiv n) (i, slot)))
The Seifert-relative framing coefficient of the component through each half-edge.
Framing is constant along an arc.
- framing_oppositeCrossingSlot (i : Fin n) (slot : Fin 4) : self.framing (self.halfEdge ((PDCode.crossingSlotEquiv n) (i, PDCode.oppositeCrossingSlot slot))) = self.framing (self.halfEdge ((PDCode.crossingSlotEquiv n) (i, slot)))
Framing is constant along a local strand through a crossing.
The orientation and Seifert-relative framing coefficient of each crossing-free component.
- map_fst_crossinglessFramings : Multiset.map Prod.fst self.crossinglessFramings = self.crossinglessComponents
Forgetting framings recovers the oriented crossing-free components.
Instances For
Let D' be a code with one crossing more than D, whose first n crossings keep the
half-edges of D and whose last crossing takes the four new half-edge positions. A permutation of
the half-edges of D' that acts at each crossing i by the local permutation f i of its slots
is the permutation of the half-edges of D acting at each crossing i by f i.castSucc,
together with f (Fin.last n) on the four new slots.
Opposite slots belong to the same over- or under-strand.
Reflect a diagram by swapping the over- and under-strands.
Equations
Instances For
Reflection preserves the number of crossing-free components.
Reflection fixes every PD-code without crossings.
Reconnecting two arcs. Cut the arc of D ending at the half-edge p and the arc ending
at q, and join p to q and the other end D.edgePair.val p of the first arc to the other end
D.edgePair.val q of the second (TauCeti.PerfectMatching.reconnect). The crossings, their
over-strands and the crossing-free circles are unchanged. This is how a smoothing of a crossing
added by TauCeti.PDCode.insertCrossing reconnects the cut arcs. The two arcs are distinct when
q ≠ p and q ≠ D.edgePair.val p; when q = D.edgePair.val p both choices name the same arc and
the code is left unchanged.
Equations
Instances For
Reconnecting arcs keeps the crossing-free circles.
The arcs of the reconnected code are the old arcs conjugated by the transposition of
D.edgePair.val p with q.
The equivalence of half-edge positions induced by an equivalence of crossing names. It changes the crossing coordinate and preserves the slot coordinate.
Equations
- TauCeti.PDCode.crossingBlockEquiv cross = (TauCeti.PDCode.crossingSlotEquiv n).symm.trans ((cross.prodCongr (Equiv.refl (Fin 4))).trans (TauCeti.PDCode.crossingSlotEquiv m))
Instances For
A crossing-block equivalence changes the crossing coordinate and preserves its slot.
The inverse of a crossing-block equivalence is induced by the inverse crossing equivalence.
The identity equivalence of crossing names induces the identity equivalence of half-edges.
Crossing-block equivalences preserve composition.
Relabel the half-edges and crossings of a code along equivalences of their index types: the
half-edge h becomes half h and the crossing j becomes cross j. Slots are kept, so the
half-edge in slot s of crossing cross j is half of the half-edge in slot s of crossing j;
arcs join the images of the half-edges they joined, the over-strand choice at cross j is the one
at j, and the number of crossing-free components is unchanged. The half-edge equivalence need
not be the one induced by the crossing equivalence.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The half-edge permutation of a relabelled code is
half ∘ D.halfEdge ∘ (crossingBlockEquiv cross).symm: the half-edge in slot s of crossing
cross j is half of the half-edge of D in slot s of crossing j.
Relabelling by identity equivalences does nothing.
The one-crossing knot diagram: a single kink. Its single crossing has the slot pair 1-3
as its over-strand, and its two arcs join slot 0 to slot 1 and slot 2 to slot 3, so the
strand doubles back on itself, as in the first Reidemeister move.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The kink numbers its half-edges by their crossing slots.
The kink has no crossing-free component.
The two arcs of the kink join each slot of the over-pair to the slot preceding it.
The orientation reverses between two opposite slots s and t = s + 2 of a crossing.
The sign of crossing i:1 if the crossing is right-handed and -1 if it is left-handed,
as in Lickorish, Chapter 1. The slots are read counterclockwise in the oriented plane and
orientation is true at the half-edges where the strands leave the crossing. The crossing is
right-handed when a counterclockwise quarter turn takes the direction of the over-strand to that
of the under-strand; in terms of the code, the sign is 1 exactly when overPair i records
whether the orientations at slots 0 and 1 differ.
Equations
- D.crossingSign i = if (D.orientation (D.crossing i 0) ^^ D.orientation (D.crossing i 1)) = D.overPair i then 1 else -1
Instances For
The defining equation for an oriented crossing sign.
A crossing is positive exactly when its orientation parity agrees with its over-strand.
A crossing is negative exactly when its orientation parity disagrees with its over-strand.
Every crossing sign is either positive or negative.
The writhe of an oriented code is the sum of its crossing signs.
Equations
- D.writhe = ∑ i : Fin n, D.crossingSign i
Instances For
Expand the writhe as the sum of the crossing signs.
Reverse every component orientation while preserving the underlying unoriented code.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Forgetting orientation after reversal leaves the underlying code unchanged.
Reversal complements the direction at every half-edge.
Reversal complements the orientations of all crossing-free components.
Reversing every component orientation preserves each crossing sign.
Reversing every component orientation twice gives the original code.
Reflect an oriented diagram, preserving all component orientations.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Forgetting orientation after reflection gives reflection of the underlying code.
Reflection preserves the orientation of every arc.
Reflection preserves the oriented crossing-free components.
Reflection reverses the sign of every crossing.
Reflecting an oriented PD-code twice gives the original code.
Relabelling by identity equivalences does nothing.
Reflection negates the writhe.
Reversing every component orientation preserves the writhe.
Reflection and orientation reversal commute.
Reflect a framed oriented diagram, negating its Seifert-relative framing coefficients.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Forgetting framing after reflection gives reflection of the underlying oriented code.
Reflection negates the Seifert-relative framing coefficient at every half-edge.
Reflection preserves orientation and negates framing on every crossing-free component.
Reflecting a framed oriented PD-code twice gives the original code.
Relabel half-edges and crossings along equivalences of their finite index types while transporting the framing function.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Relabelling by identity equivalences does nothing to a framed oriented code.
Consecutive framed relabellings compose their half-edge and crossing equivalences.
Reverse every component orientation of a framed code, preserving all framing integers.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Forgetting framing after reversal gives reversal of the underlying oriented code.
Reversal preserves the framing at every half-edge.
Reversal complements only the orientation in each crossing-free framing pair.
Reversing every component orientation twice gives the original framed code.
Reflection and orientation reversal commute.
A zero-crossing oriented PD-code consisting of crossing-free circles with the specified orientations. Multiplicity records distinct components without imposing an ordering on them.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The unlink constructor retains exactly its component-orientation multiset.
Every zero-crossing oriented PD-code is its canonical crossing-free unlink code.
Multisets of orientations are equivalent to zero-crossing oriented PD-codes.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The inverse of unlinkEquiv reads off the orientations of the crossing-free components.
The empty oriented PD-code.
Instances For
The empty diagram has no crossing-free components.
A crossing-free oriented unknot with the specified choice of orientation.
Equations
- TauCeti.OrientedPDCode.unknot orientation = TauCeti.OrientedPDCode.unlink {orientation}
Instances For
The oriented unknot retains its specified component orientation.
Distinct orientation choices give distinct crossing-free circle presentations.
Reflection fixes every zero-crossing oriented PD-code.
The kink TauCeti.PDCode.kink, oriented so that its crossing is positive.
This concrete code is a semantic witness that the presentation permits a genuine positive crossing, not only crossing-free links.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The underlying PD-code of positiveKink is the kink.
The arcs of positiveKink point away from the crossing exactly at slots 1 and 2.
The positive kink has no crossing-free components.
The crossing of positiveKink has positive sign.