Dedekind 0.0.0
A structuralist C++23 Module Library
Loading...
Searching...
No Matches
dedekind::category::IsParallelPair Concept Referenceexport

F and G are a parallel pair of arrows — shared Dom and shared Cod. More...

Concept definition

template<typename F, typename G>
IsArrow<F> && IsArrow<G> && std::same_as<Dom<F>, Dom<G>> &&
std::same_as<Cod<F>, Cod<G>>
A type that knows its own Domain (A) and Codomain (B), objects it maps between: called at the domain'...
Definition morphism.cppm:168
F and G are a parallel pair of arrows — shared Dom and shared Cod.
Definition pullback.cppm:333
typename std::remove_cvref_t< F >::Codomain Cod
Shorthand to look up the Codomain of an Arrow type F.
Definition morphism.cppm:239
typename std::remove_cvref_t< F >::Domain Dom
Shorthand to look up the Domain of an Arrow type F.
Definition morphism.cppm:231

Detailed Description

F and G are a parallel pair of arrows — shared Dom and shared Cod.

The structural precondition shared by an equalizer's input ( IsEqualizer<E, F, G> via the IsSubobject leg above) and a (future) coequalizer's input. Used here as the shape of the kernel pair's two projections π_1, π_2 : KernelPair(F) ⇒ Dom<F> — the input to the image-as-coequalizer reading.

Why not IsCoequalizer here? A coequalizer concept proper would constrain a quotient witness Q (with a regular epi q : Cod<F> → Q satisfying q∘F = q∘G), dual to how IsEqualizer constrains a subobject witness E via IsSubobject. That requires an IsQuotient sister to IsSubobject which the codebase has not yet reified. Naming an IsCoequalizer concept whose body checked only parallel-arrow shape would overpromise (a downstream caller could read the name as a verified coequalizer when only the input shape was checked) — so the structurally-honest shape lives here as IsParallelPair, and the IsCoequalizer name is reserved for the future Q-witnessed concept.

Mathematically, image-as-coequalizer still holds: for an arrow F : A → B with kernel pair π_1, π_2 : P ⇒ A,

Im(F) = coeq(π_1, π_2)

the canonical epi-mono factorisation A → Im(F) → B. The mono side ( Im(F) ↪ B) is what the :image partition pins as IsImageOf<S, F>; the quotient side awaits IsQuotient.

Template Parameters
FThe first arrow F : A → B.
GThe second arrow G : A → B.