On a subinterval the germ class of an injective definable function is constant
ProvedMonotonicity_Theorem.exists_germ_class_subintervalLet be an o-minimal structure over a dense linear order without endpoints , let be a definable function of one variable, and let satisfy . Assume is injective on .
Claim. There are with on which one of the four germ patterns of holds uniformly: below-above, above-below, above-above, or below-below.
This is the classification step in the analysis of an injective definable function of one variable. It is a pure consequence of o-minimality, and it does not yet decide which of the four classes occurs.
The argument has three parts. First, the germ dichotomy: a definable subset of the line either contains or misses an interval with endpoint , on each side of , because is a finite union of points and intervals. Second, for each the two definable sets
cover the punctured neighbourhoods of inside , by injectivity; so the germ dichotomy assigns to each side of one of the two comparisons, and falls into exactly one of the four classes. Third, the four classes are definable subsets of the line, since each is defined by a first-order condition on built from the graph of and the order; their union is the infinite set , so one of them is infinite and therefore contains an interval, which may be shrunk to lie inside .
Formalization note. The four patterns are the predicates UniformBelowAbove, UniformAboveBelow, UniformAboveAbove and UniformBelowBelow of the accompanying definitions; each requires the witnessing window to lie inside the interval on which the pattern is asserted.
import Definitions.Def_Monotonicity_Theorem_Extremal_Germs
theorem Monotonicity_Theorem.exists_germ_class_subinterval {R : Type} (D : DenseLinearOrderNoEndpoints R)
(M : OMinimalStructure D) {I B : Set (Power R 1)} (f : DefinableFunction M I B)
(u v : R) (huv : D.lt u v)
(hsub : (openInterval D (Endpoint.finite u) (Endpoint.finite v)).Subset I)
(hinj : forall x (hx : I x), openInterval D (Endpoint.finite u) (Endpoint.finite v) x ->
forall y (hy : I y), openInterval D (Endpoint.finite u) (Endpoint.finite v) y ->
f.toFun (Subtype.mk x hx) = f.toFun (Subtype.mk y hy) -> x = y) :
exists u1 v1 : R, D.lt u1 v1 /\
(openInterval D (Endpoint.finite u1) (Endpoint.finite v1)).Subset
(openInterval D (Endpoint.finite u) (Endpoint.finite v)) /\
(UniformBelowAbove D f u1 v1 \/ UniformAboveBelow D f u1 v1 \/
UniformAboveAbove D f u1 v1 \/ UniformBelowBelow D f u1 v1) := by sorry