|
Dedekind 0.0.0
A structuralist C++23 Module Library
|
Involutive endofunctor concept — an endomap F : T → T with F² ≅ Id.
More...
Involutive endofunctor concept — an endomap F : T → T with F² ≅ Id.
An involutive endofunctor on a category C is a functor F : C → C whose square is naturally isomorphic to the identity functor. In thin / lattice categories (where the category structure is reduced to a carrier T plus a relation), this collapses to an endomap on T satisfying F(F(x)) = x for all x ∈ T.
Used downstream by the row-7 IsBooleanLatticeCategory (#698 Slice 7), where the complement is the canonical involution. Examples:
std::logical_not<bool> on bool: !!x = x.std::bit_not<T> on integral T: ~~x = x.:sets::Complement on a Boolean subobject lattice Sub: !!S ≡ S (the bona-fide involution from #683). Pragmatic placement: this concept lives inline in :lattice per #698 Q2. When a second consumer arrives (e.g. dual categories, opposite functors, monad-shaped opportunities), the natural extraction target is a new partition :involution or — if the consumer is monad-shaped — :monad. Until then the lightweight inline location avoids partition-graph churn for a single consumer.
Strictly: involution is not a monad. A monad (T, η, μ) has μ : T² → T; an involution has F² ≅ Id (the iteration goes back to identity, not to the functor itself). The shared shape is "endofunctor + property of its second iteration".
A callable F is an involutive endofunctor on T — invocable T → T with F² ≅ Id. This is exactly :involution's IsInvolution under the lattice-complement reading (used by IsBooleanLatticeCategory, #698 Slice 7); it reuses that concept rather than re-stating the shape + is_involutive_v certificate.