Two points cut a Jordan curve into two arcs #
Two distinct points of a Jordan curve cut it into two arcs between them, which cover the
curve and meet in exactly those two points. This is the converse of
IsJordanCurve.of_two_arcs, and the harder direction.
The whole argument is carried by the loop's parameters; the circle never appears. Pull the
two points back to parameters s and t short of the finish — parameter_before_finish,
which replaces a parameter at the finish by the start, the only use the closing condition gets
— and order them, say s < t. Then the two pieces are what the loop makes of the parameters
between s and t and of the parameters outside them:
- the middle piece
f '' Icc s tis a subarc, produced bySubarc.lean'sisArcBetween_subarc, whose injectivity hypothesis is confined to the traversed interval and so survives a loop; - the outside piece
f '' Icc 0 s ∪ f '' Icc t 1is two end intervals glued where the loop closes up, produced byConcatenate.lean'sIsArcBetween.concatenate.
That asymmetry — one subarc and one concatenation — is inherent to a parameter interval with
a seam in it, and is not worth fighting. It costs one case split, at s = 0, where the front
interval degenerates to a point that the back piece already carries at its far end.
Both halves of the conclusion are then facts about intervals of reals. Covering is the
three-way split of [0,1] around two parameters, which is the linearity of the order and
nothing else. Meeting is injectivity off the finish, applied on each of the three pieces; the
one case that needs the loop rather than an arc is an outside parameter at the finish, which
carries the same point as the start and so lands back on s.
Blueprint #
lem:jordan-circle— "any two distinct points ofCdivide it into two simple arcs having exactly those points in common".IsJordanCurve.two_arcsis that clause, proved directly from the parametrisation instead of through the model curve, so it does not wait on the loop-to-circle bridge.IsLoop.two_arcs_at_parameters— the parameter-level form the clause is assembled from.
Parameters short of the finish #
A loop is injective on [0, 1) only, so every statement below has to keep its parameters
away from 1. These two lemmas are the interface to that: one says injectivity holds as soon
as neither parameter is the finish, the other says the finish can always be avoided.
Two parameters short of the finish carrying the same point are equal. This is IsLoop.injOn
with the half-open interval spelled as "in [0,1] and not 1", which is the form every use
below produces.
Every point of the curve has a parameter short of the finish. A parameter at the finish is replaced by the start, which carries the same point. This is the only use the closing condition gets.
The three pieces of parameters #
Two parameters s < t cut [0, 1] into the middle interval [s, t] and the two end
intervals [0, s] and [t, 1]. Each piece needs the loop to be injective on its own
parameters. On the middle and the front that is injectivity off the finish, since neither
contains it; the back piece does contain the finish, and there the extra argument is that
the only other parameter carrying f 1 is the start, which lies strictly before t.
Injectivity on the middle piece: no parameter of [s, t] is the finish, because t is
not.
On the back piece the finish is the only parameter carrying f 1. A second one would be
the start, by injectivity off the finish and the closing condition — but the start lies
strictly before t.
Injectivity on the back piece. Unlike the other two this piece contains the finish, so
injectivity off the finish is not enough on its own; back_at_finish supplies the rest.
The three pieces are arcs #
The middle piece is an arc between the two cut points.
The front piece is an arc from the start to the first cut point.
The back piece is an arc from the second cut point to the finish.
The outside piece #
The parameters outside [s, t] are two intervals, glued at the point where the loop closes
up: walk from t to the finish, then from the start to s. When s is the start the front
interval degenerates to a single parameter, and the outside is the back piece alone — its far
end already carries the point the front piece would have contributed.
The back and front pieces meet only where the loop closes up. A point on both comes from a
parameter at or past t and from one at or before s; two distinct parameters short of the
finish cannot carry the same point, and t ≤ s is false, so the back parameter is the
finish.
The outside piece is an arc between the two cut points.
Covering, and where the pieces meet #
The parameter interval splits three ways around any two of its points. Linearity of the order, and nothing else — the split does not even need the two points ordered, since when they are not the middle interval is empty and the two end intervals already overlap.
The loop's images of the middle and of the outside cover the curve.
The two pieces meet in exactly the two cut points.
Three cases, one for each way an outside parameter can be placed. The one that matters is the
outside parameter being the finish: it carries the same point as the start, so the middle
parameter is the start, which forces s to be it. That case is why the argument needs a loop
rather than an arc.
The two arcs, at chosen parameters #
Two parameters short of the finish cut the loop's image into two arcs between the points they carry, which cover it and meet in exactly those two points.
The pieces are named by the parameters, not chosen: the first is the middle interval's image, the second the outside's.
The theorem #
Two distinct points of a Jordan curve cut it into two arcs between them, which cover the curve and meet in exactly those two points.
The parameters carrying the two points come in one order or the other, and the conclusion is symmetric in the two pieces, so the second case is the first with the roles exchanged: the union and the intersection commute, and the unordered pair does too.
This is the exact converse of IsJordanCurve.of_two_arcs: that theorem's hypotheses are two
arcs between the same two points meeting only there, which is what the two pieces produced
here are — see IsJordanCurve.two_arcs_of_two_arcs.
The composition check: the two arcs IsJordanCurve.two_arcs produces are exactly what
IsJordanCurve.of_two_arcs consumes, and glue back to the curve one started from.