########################### ## ## In a terminal category ## ###########################
AddDerivationToCAP( IsLiftable, "Two morphisms with equal targets are mutually liftable in a terminal category",
[ ],
function( cat, morphism1, morphism2 )
## equality of targets is part of the specification of the input and checked by the pre-function
return true;
end : CategoryFilter := IsTerminalCategory );
########################### ## ## In a finite category ## ###########################
##
AddDerivationToCAP( SetOfMorphismsOfFiniteCategory, "SetOfMorphismsOfFiniteCategory using SetOfObjectsOfCategory and MorphismsOfExternalHom",
[ [ SetOfObjectsOfCategory, 1 ],
[ MorphismsOfExternalHom, 4 ] ],
function( C )
local objs;
objs := SetOfObjectsOfCategory( C );
## varying the target (column-index) before varying the source ("row"-index) ## in the for-loops below is enforced by SetOfMorphismsOfFiniteCategory for IsCategoryFromNerveData, ## which in turn is enforced by our convention for ProjectionInFactorOfDirectProduct in SkeletalFinSets, ## which is the "double-reverse" convention of the GAP command Cartesian:
##
AddDerivationToCAP( UniversalMorphismIntoDirectSum, "UniversalMorphismIntoDirectSum using the injections of the direct sum",
[ [ PreCompose, 2 ],
[ InjectionOfCofactorOfDirectSum, 2 ],
[ SumOfMorphisms, 1 ],
[ DirectSum, 1 ] ],
function( cat, diagram, test_object, source )
local nr_components;
nr_components := Length( source );
return SumOfMorphisms( cat,
test_object,
List( [ 1 .. nr_components ], i -> PreCompose( cat, source[ i ], InjectionOfCofactorOfDirectSum( cat, diagram, i ) ) ),
DirectSum( cat, diagram )
);
end : CategoryFilter := IsAdditiveCategory );
##
AddDerivationToCAP( UniversalMorphismIntoDirectSumWithGivenDirectSum, "UniversalMorphismIntoDirectSum using the injections of the direct sum",
[ [ PreCompose, 2 ],
[ InjectionOfCofactorOfDirectSumWithGivenDirectSum, 2 ],
[ SumOfMorphisms, 1 ] ],
function( cat, diagram, test_object, source, direct_sum )
local nr_components;
nr_components := Length( source );
return SumOfMorphisms( cat,
test_object,
List( [ 1 .. nr_components ], i -> PreCompose( cat, source[ i ], InjectionOfCofactorOfDirectSumWithGivenDirectSum( cat, diagram, i, direct_sum ) ) ),
direct_sum
);
##
AddDerivationToCAP( FiberProduct, "FiberProduct as the source of IsomorphismFromFiberProductToEqualizerOfDirectProductDiagram",
[ [ IsomorphismFromFiberProductToEqualizerOfDirectProductDiagram, 1 ] ],
##
AddDerivationToCAP( MorphismFromFiberProductToSink, "MorphismFromFiberProductToSink by composing the first projection with the first morphism in the diagram",
[ [ ProjectionInFactorOfFiberProduct, 1 ],
[ PreCompose, 1 ] ],
##
AddDerivationToCAP( UniversalMorphismIntoEqualizer, "UniversalMorphismIntoEqualizer using the universality of the kernel representation of the equalizer",
[ [ JointPairwiseDifferencesOfMorphismsIntoDirectProduct, 1 ],
[ KernelLift, 1 ],
[ IsomorphismFromKernelOfJointPairwiseDifferencesOfMorphismsIntoDirectProductToEqualizer, 1 ],
[ PreCompose, 1 ] ],
function( cat, A, diagram, test_object, tau )
local joint_pairwise_differences, kernel_lift;
joint_pairwise_differences := JointPairwiseDifferencesOfMorphismsIntoDirectProduct( cat, A, diagram );
kernel_lift := KernelLift( cat, joint_pairwise_differences, test_object, tau );
return PreCompose( cat,
kernel_lift,
IsomorphismFromKernelOfJointPairwiseDifferencesOfMorphismsIntoDirectProductToEqualizer( cat, A, diagram )
);
end );
##
AddDerivationToCAP( ImageEmbedding, "ImageEmbedding as the kernel embedding of the cokernel projection",
[ [ CokernelProjection, 1 ],
[ KernelEmbedding, 1 ],
[ IsomorphismFromImageObjectToKernelOfCokernel, 1 ],
[ PreCompose, 1 ] ],
function( cat, mor )
local image_embedding;
image_embedding := KernelEmbedding( cat, CokernelProjection( cat, mor ) );
return PreCompose( cat, IsomorphismFromImageObjectToKernelOfCokernel( cat, mor ),
image_embedding );
end : CategoryFilter := IsPreAbelianCategory );
##
AddDerivationToCAP( CoastrictionToImage, "CoastrictionToImage using that image embedding can be seen as a kernel",
[ [ ImageEmbedding, 1 ],
[ LiftAlongMonomorphism, 1 ] ],
##
AddDerivationToCAP( CoastrictionToImageWithGivenImageObject, "CoastrictionToImage using that image embedding can be seen as a kernel",
[ [ ImageEmbeddingWithGivenImageObject, 1 ],
[ LiftAlongMonomorphism, 1 ] ],
function( cat, morphism, image )
local image_embedding;
##
AddDerivationToCAP( MorphismFromEqualizerToSink, "MorphismFromEqualizerToSink by composing the embedding with the first morphism in the diagram",
[ [ EmbeddingOfEqualizer, 1 ],
[ PreCompose, 1 ] ],
return LiftAlongMonomorphism( cat,
ImageEmbeddingWithGivenImageObject( cat, alphap, Ip ),
PreCompose( cat, ImageEmbeddingWithGivenImageObject( cat, alpha, I ), nu ) );
end );
##
AddDerivationToCAP( ProjectiveCoverObject, "ProjectiveCoverObject as the source of EpimorphismFromProjectiveCoverObject",
[ [ EpimorphismFromProjectiveCoverObject, 1 ] ],
##
AddDerivationToCAP( IsBijectiveObject, "IsBijectiveObject by checking if the object is both projective and injective",
[ [ IsProjective, 1 ],
[ IsInjective, 1 ] ],
function( cat, object )
return IsProjective( cat, object ) and IsInjective( cat, object );
end );
##
AddDerivationToCAP( IsProjective, "IsProjective by checking if the object is a retract of some projective object",
[ [ EpimorphismFromSomeProjectiveObject, 1 ],
[ IsSplitEpimorphism, 1 ] ],
##
AddDerivationToCAP( IsAutomorphism, "IsAutomorphism by checking IsEndomorphism and IsIsomorphism",
[ [ IsEndomorphism, 1 ],
[ IsIsomorphism, 1 ] ],
function( cat, morphism )
return IsEndomorphism( cat, morphism ) and IsIsomorphism( cat, morphism );
end );
##
AddDerivationToCAP( IsZeroForMorphisms, "IsZeroForMorphisms by deciding whether the given morphism is congruent to the zero morphism",
[ [ ZeroMorphism, 1 ],
[ IsCongruentForMorphisms, 1 ] ],
##
AddDerivationToCAP( IsWellDefinedForMorphismsWithGivenSourceAndRange, "checking that source and range coincide with the given ones and then checking well-definedness as usual",
[ [ IsEqualForObjects, 2 ],
[ IsWellDefinedForMorphisms, 1 ] ],
function( cat, source, morphism, range )
# Mathematically, we would first like to check if `morphism` has the expected source and range. # However, `IsEqualForObjects` expects well-defined objects, so we first have to check if source and range # of `morphism` are well-defined. We do this via `IsWellDefinedForMorphisms`, which checks well-definedness of # source and range via a redirect function.
return IsWellDefinedForMorphisms( cat, morphism ) and
IsEqualForObjects( cat, Source( morphism ), source ) and
IsEqualForObjects( cat, Range( morphism ), range );
##
AddDerivationToCAP( IsIdempotent, "IsIdempotent by comparing the square of the morphism with itself",
[ [ IsCongruentForMorphisms, 1 ],
[ PreCompose, 1 ] ],
##
AddDerivationToCAP( IsIsomorphism, "IsIsomorphism by deciding if it is a mono and an epi",
[ [ IsMonomorphism, 1 ],
[ IsEpimorphism, 1 ] ],
function( cat, morphism )
return IsMonomorphism( cat, morphism ) and IsEpimorphism( cat, morphism );
end : CategoryFilter := IsAbelianCategory );
##
AddDerivationToCAP( IsIsomorphism, "IsIsomorphism by deciding if it is a split mono and a split epi",
[ [ IsSplitMonomorphism, 1 ],
[ IsSplitEpimorphism, 1 ] ],
function( cat, morphism )
return IsSplitMonomorphism( cat, morphism ) and IsSplitEpimorphism( cat, morphism );
end );
##
AddDerivationToCAP( IsIsomorphism, "IsIsomorphism by deciding if it is a split mono and an epi",
[ [ IsSplitMonomorphism, 1 ],
[ IsEpimorphism, 1 ] ],
function( cat, morphism )
return IsSplitMonomorphism( cat, morphism ) and IsEpimorphism( cat, morphism );
end );
##
AddDerivationToCAP( IsSplitMonomorphism, "IsSplitMonomorphism by using IsColiftable",
[ [ IsColiftable, 1 ],
[ IdentityMorphism, 1 ] ],
########################### ## ## Methods returning a morphism where the source and range can directly be read of from the input ## ###########################
##
AddDerivationToCAP( ZeroMorphism, "Zero morphism by composition of morphism into and from zero object",
[ [ PreCompose, 1 ],
[ UniversalMorphismIntoZeroObject, 1 ],
[ UniversalMorphismFromZeroObject, 1 ] ],
##
AddDerivationToCAP( SubtractionForMorphisms, "SubtractionForMorphisms(mor1, mor2) as the sum of mor1 and the additive inverse of mor2",
[ [ AdditionForMorphisms, 1 ],
[ AdditiveInverseForMorphisms, 1 ] ],
##
AddDerivationToCAP( RandomMorphismByInteger, "RandomMorphismByInteger using RandomObjectByInteger and RandomMorphismWithFixedSourceByInteger",
[ [ RandomObjectByInteger, 1 ],
[ RandomMorphismWithFixedSourceByInteger, 1 ] ],
function( cat, n )
return RandomMorphismWithFixedSourceByInteger( cat, RandomObjectByInteger( cat, n ), 1 + Log2Int( n ) );
end );
##
AddDerivationToCAP( RandomMorphismByInteger, "RandomMorphismByInteger using RandomObjectByInteger and RandomMorphismWithFixedRangeByInteger",
[ [ RandomObjectByInteger, 1 ],
[ RandomMorphismWithFixedRangeByInteger, 1 ] ],
function( cat, n )
return RandomMorphismWithFixedRangeByInteger( cat, RandomObjectByInteger( cat, n ), 1 + Log2Int( n ) );
end );
##
AddDerivationToCAP( RandomMorphismWithFixedSourceByInteger, "RandomMorphismWithFixedSourceByInteger using RandomObjectByInteger and RandomMorphismWithFixedSourceAndRangeByInteger",
[ [ RandomObjectByInteger, 1 ],
[ RandomMorphismWithFixedSourceAndRangeByInteger, 1 ] ],
function( cat, S, n )
return RandomMorphismWithFixedSourceAndRangeByInteger( cat, S, RandomObjectByInteger( cat, n ), 1 + Log2Int( n ) );
end : CategoryFilter := IsAbCategory );
##
AddDerivationToCAP( RandomMorphismWithFixedRangeByInteger, "RandomMorphismWithFixedRangeByInteger using RandomObjectByInteger and RandomMorphismWithFixedSourceAndRangeByInteger",
[ [ RandomObjectByInteger, 1 ],
[ RandomMorphismWithFixedSourceAndRangeByInteger, 1 ] ],
function( cat, R, n )
return RandomMorphismWithFixedSourceAndRangeByInteger( cat, RandomObjectByInteger( cat, n ), R, 1 + Log2Int( n ) );
end : CategoryFilter := IsAbCategory );
##
AddDerivationToCAP( RandomMorphismByInteger, "RandomMorphismByInteger using RandomObjectByInteger and RandomMorphismWithFixedSourceAndRangeByInteger",
[ [ RandomObjectByInteger, 2 ],
[ RandomMorphismWithFixedSourceAndRangeByInteger, 1 ] ],
function( cat, n )
return RandomMorphismWithFixedSourceAndRangeByInteger( cat, RandomObjectByInteger( cat, n ), RandomObjectByInteger( cat, n ), 1 + Log2Int( n ) );
end : CategoryFilter := IsAbCategory );
##
AddDerivationToCAP( RandomMorphismByList, "RandomMorphismByList using RandomObjectByList and RandomMorphismWithFixedSourceByList",
[ [ RandomObjectByList, 1 ],
[ RandomMorphismWithFixedSourceByList, 1 ] ],
function( cat, L )
if Length( L ) <> 2 or not ForAll( L, IsList ) then
Error( "the list passed to 'RandomMorphismByList' in ", Name( cat ), " must be a list consisting of two lists!\n" ); fi;
##
AddDerivationToCAP( RandomMorphismByList, "RandomMorphismByList using RandomObjectByList and RandomMorphismWithFixedRangeByList",
[ [ RandomObjectByList, 1 ],
[ RandomMorphismWithFixedRangeByList, 1 ] ],
function( cat, L )
if Length( L ) <> 2 or not ForAll( L, IsList ) then
Error( "the list passed to 'RandomMorphismByList' in ", Name( cat ), " must be a list consisting of two lists!\n" ); fi;
##
AddDerivationToCAP( RandomMorphismWithFixedSourceByList, "RandomMorphismWithFixedSourceByList using RandomObjectByList and RandomMorphismWithFixedSourceAndRangeByList",
[ [ RandomObjectByList, 1 ],
[ RandomMorphismWithFixedSourceAndRangeByList, 1 ] ],
function( cat, S, L )
if Length( L ) <> 2 or not ForAll( L, IsList ) then
Error( "the list passed to 'RandomMorphismWithFixedSourceByList' in ", Name( cat ), " must be a list consisting of two lists!\n" ); fi;
##
AddDerivationToCAP( RandomMorphismWithFixedRangeByList, "RandomMorphismWithFixedRangeByList using RandomObjectByList and RandomMorphismWithFixedSourceAndRangeByList",
[ [ RandomObjectByList, 1 ],
[ RandomMorphismWithFixedSourceAndRangeByList, 1 ] ],
function( cat, R, L )
if Length( L ) <> 2 or not ForAll( L, IsList ) then
Error( "the list passed to 'RandomMorphismWithFixedRangeByList' in ", Name( cat ), " must be a list consisting of two lists!\n" ); fi;
##
AddDerivationToCAP( RandomMorphismByList, "RandomMorphismByList using RandomObjectByList and RandomMorphismWithFixedSourceAndRangeByList",
[ [ RandomObjectByList, 2 ],
[ RandomMorphismWithFixedSourceAndRangeByList, 1 ] ],
function( cat, L )
if Length( L ) <> 3 or not ForAll( L, IsList ) then
Error( "the list passed to 'RandomMorphismByList' in ", Name( cat ), " must be a list consisting of three lists!\n" ); fi;
##
AddDerivationToCAP( LiftAlongMonomorphism, "LiftAlongMonomorphism by inverting the kernel lift from the source to the kernel of the cokernel of a given monomorphism",
[ [ CokernelProjection, 1 ],
[ KernelLift, 2 ],
[ PreCompose, 1 ],
[ InverseForMorphisms, 1 ] ],
function( cat, monomorphism, test_morphism )
local cokernel_proj, kernel_lift_from_source_of_monomorphism, kernel_lift_from_source_of_test_morphism;
##
AddDerivationToCAP( ComponentOfMorphismIntoDirectProduct, "ComponentOfMorphismIntoDirectProduct by composing with the direct product projection",
[ [ ProjectionInFactorOfDirectProduct, 1 ],
[ PreCompose, 1 ] ],
function( cat, alpha, factors, nr )
return PreCompose( cat, alpha, ProjectionInFactorOfDirectProduct( cat, factors, nr ) );
end );
##
AddDerivationToCAP( ComponentOfMorphismIntoDirectSum, "ComponentOfMorphismIntoDirectSum by composing with the direct sum projection",
[ [ ProjectionInFactorOfDirectSum, 1 ],
[ PreCompose, 1 ] ],
function( cat, alpha, summands, nr )
return PreCompose( cat, alpha, ProjectionInFactorOfDirectSum( cat, summands, nr ) );
end );
##
AddDerivationToCAP( MorphismBetweenDirectSumsWithGivenDirectSums, "MorphismBetweenDirectSumsWithGivenDirectSums using universal morphisms of direct sums (without support for empty limits)",
[ [ ZeroMorphism, 1 ],
[ UniversalMorphismIntoDirectSumWithGivenDirectSum, 2 ],
[ UniversalMorphismFromDirectSumWithGivenDirectSum, 1 ] ],
function( cat, S, diagram_S, morphism_matrix, diagram_T, T )
local test_diagram_product, test_diagram_coproduct;
if morphism_matrix = [ ] or morphism_matrix[1] = [ ] then
return ZeroMorphism( cat, S, T ); fi;
return UniversalMorphismFromDirectSumWithGivenDirectSum( cat, diagram_S, T, test_diagram_coproduct, S );
end : CategoryFilter := cat -> not ( IsBound( cat!.supports_empty_limits ) and cat!.supports_empty_limits = true ) );
##
AddDerivationToCAP( MorphismBetweenDirectSumsWithGivenDirectSums, "MorphismBetweenDirectSumsWithGivenDirectSums using universal morphisms of direct sums (with support for empty limits)",
[ [ UniversalMorphismIntoDirectSumWithGivenDirectSum, 2 ],
[ UniversalMorphismFromDirectSumWithGivenDirectSum, 1 ] ],
function( cat, S, diagram_S, morphism_matrix, diagram_T, T )
local test_diagram_product, test_diagram_coproduct;
########################### ## ## Methods returning a morphism with source or range constructed within the method! ## If there is a method available which only constructs this source or range, ## one has to be sure that this source is equal to that construction (by IsEqualForObjects) ## ###########################
end : CategoryFilter := cat -> not ( IsBound( cat!.supports_empty_limits ) and cat!.supports_empty_limits = true ) );
##
AddDerivationToCAP( JointPairwiseDifferencesOfMorphismsIntoDirectProduct, "JointPairwiseDifferencesOfMorphismsIntoDirectProduct using the operations defining this morphism (with support for empty limits)",
[ [ UniversalMorphismIntoDirectProduct, 2 ],
[ SubtractionForMorphisms, 1 ] ],
function( cat, A, diagram )
local number_of_morphisms, ranges, mor1, mor2;
end : CategoryFilter := cat -> not ( IsBound( cat!.supports_empty_limits ) and cat!.supports_empty_limits = true ) );
##
AddDerivationToCAP( JointPairwiseDifferencesOfMorphismsFromCoproduct, "JointPairwiseDifferencesOfMorphismsFromCoproduct using the operations defining this morphism (with support for empty limits)",
[ [ UniversalMorphismFromCoproduct, 2 ],
[ SubtractionForMorphisms, 1 ] ],
function( cat, A, diagram )
local number_of_morphisms, sources, mor1, mor2;
end : CategoryFilter := cat -> IsBound( cat!.supports_empty_limits ) and cat!.supports_empty_limits = true );
##
AddDerivationToCAP( EmbeddingOfEqualizer, "EmbeddingOfEqualizer using the kernel embedding of JointPairwiseDifferencesOfMorphismsIntoDirectProduct",
[ [ KernelEmbedding, 1 ],
[ JointPairwiseDifferencesOfMorphismsIntoDirectProduct, 1 ],
[ PreCompose, 1 ],
[ IsomorphismFromEqualizerToKernelOfJointPairwiseDifferencesOfMorphismsIntoDirectProduct, 1 ] ],
function( cat, A, diagram )
local kernel_of_pairwise_differences;
kernel_of_pairwise_differences := KernelEmbedding( cat, JointPairwiseDifferencesOfMorphismsIntoDirectProduct( cat, A, diagram ) );
return PreCompose( cat, IsomorphismFromEqualizerToKernelOfJointPairwiseDifferencesOfMorphismsIntoDirectProduct( cat, A, diagram ),
kernel_of_pairwise_differences );
end );
##
AddDerivationToCAP( IsomorphismFromZeroObjectToTerminalObject, "IsomorphismFromZeroObjectToTerminalObject as the unique morphism from zero object to terminal object",
[ [ UniversalMorphismIntoTerminalObject, 1 ],
[ ZeroObject, 1 ] ],
##
AddDerivationToCAP( IsomorphismFromZeroObjectToTerminalObject, "IsomorphismFromZeroObjectToTerminalObject using the universal property of the zero object",
[ [ UniversalMorphismFromZeroObject, 1 ],
[ TerminalObject, 1 ] ],
##
AddDerivationToCAP( IsomorphismFromTerminalObjectToZeroObject, "IsomorphismFromTerminalObjectToZeroObject using the universal property of the zero object",
[ [ UniversalMorphismIntoZeroObject, 1 ],
[ TerminalObject, 1 ] ],
##
AddDerivationToCAP( IsomorphismFromDirectSumToDirectProduct, "IsomorphismFromDirectSumToDirectProduct using direct sum projections and universal property of direct product",
[ [ ProjectionInFactorOfDirectSum, 2 ],
[ DirectSum, 1 ],
[ UniversalMorphismIntoDirectProduct, 1 ] ],
function( cat, diagram )
local source;
source := List( [ 1 .. Length( diagram ) ], i -> ProjectionInFactorOfDirectSum( cat, diagram, i ) );
## B -β→ C ←α- A, ℓ•β = α ⇔ ν(ℓ)•H(A,β) = ν(α) ##
AddDerivationToCAP( Lift, "Derive Lift using the homomorphism structure and Lift in the range of the homomorphism structure",
[ [ IdentityMorphism, 1 ],
[ InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure, 1 ],
[ HomomorphismStructureOnMorphisms, 1 ],
[ InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism, 1 ],
[ Lift, 1, RangeCategoryOfHomomorphismStructure ] ],
function( cat, alpha, beta )
local range_cat, a, b;
##
AddDerivationToCAP( IsLiftable, "Derive IsLiftable using the homomorphism structure and Liftable in the range of the homomorphism structure",
[ [ IdentityMorphism, 1 ],
[ InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure, 1 ],
[ HomomorphismStructureOnMorphisms, 1 ],
[ IsLiftable, 1, RangeCategoryOfHomomorphismStructure ] ],
function( cat, alpha, beta )
local range_cat, a, b;
## B ←β- C -α→ A, α•ℓ = β ⇔ ν(ℓ)•H(α,B) = ν(β) ##
AddDerivationToCAP( Colift, "Derive Colift using the homomorphism structure and Lift in the range of the homomorphism structure",
[ [ IdentityMorphism, 1 ],
[ InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure, 1 ],
[ HomomorphismStructureOnMorphisms, 1 ],
[ InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism, 1 ],
[ Lift, 1, RangeCategoryOfHomomorphismStructure ] ],
function( cat, alpha, beta )
local range_cat, b, a;
##
AddDerivationToCAP( IsColiftable, "Derive IsColiftable using the homomorphism structure and IsLiftable in the range of the homomorphism structure",
[ [ IdentityMorphism, 1 ],
[ InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure, 1 ],
[ HomomorphismStructureOnMorphisms, 1 ],
[ IsLiftable, 1, RangeCategoryOfHomomorphismStructure ] ],
function( cat, alpha, beta )
local range_cat, b, a;
########################### ## ## Methods returning a nonnegative integer or infinity ## ###########################
##
AddDerivationToCAP( ProjectiveDimension, "ProjectiveDimension by iteratively testing whether the syzygy object is projective",
[ [ IsProjective, 2 ],
[ KernelObject, 2 ],
[ EpimorphismFromSomeProjectiveObject, 2 ] ],
function( cat, obj )
local dim, syzygy_obj;
dim := 0;
syzygy_obj := obj;
while not IsProjective( cat, syzygy_obj ) do
syzygy_obj := KernelObject( cat, EpimorphismFromSomeProjectiveObject( cat, syzygy_obj ) );
dim := dim + 1;
od;
return dim;
end : CategoryFilter := cat -> HasIsLocallyOfFiniteProjectiveDimension( cat ) and IsLocallyOfFiniteProjectiveDimension( cat ) and HasIsAbelianCategory( cat ) and IsAbelianCategory( cat ) );
##
AddDerivationToCAP( InjectiveDimension, "InjectiveDimension by iteratively testing whether the cosyzygy object is injective",
[ [ IsInjective, 2 ],
[ CokernelObject, 2 ],
[ MonomorphismIntoSomeInjectiveObject, 2 ] ],
function( cat, obj )
local dim, cosyzygy_obj;
dim := 0;
cosyzygy_obj := obj;
while not IsInjective( cat, cosyzygy_obj ) do
cosyzygy_obj := CokernelObject( cat, MonomorphismIntoSomeInjectiveObject( cat, cosyzygy_obj ) );
dim := dim + 1;
od;
return dim;
end : CategoryFilter := cat -> HasIsLocallyOfFiniteInjectiveDimension( cat ) and IsLocallyOfFiniteInjectiveDimension( cat ) and HasIsAbelianCategory( cat ) and IsAbelianCategory( cat ) );
########################### ## ## Methods returning an object ## ###########################
##
AddDerivationToCAP( KernelObject, "KernelObject as the source of KernelEmbedding",
[ [ KernelEmbedding, 1 ] ],
function( cat, mor )
return Source( KernelEmbedding( cat, mor ) );
end );
##
AddDerivationToCAP( Coproduct, "Coproduct as the range of the first injection",
[ [ InjectionOfCofactorOfCoproduct, 1 ] ],
end : CategoryFilter := cat -> not ( IsBound( cat!.supports_empty_limits ) and cat!.supports_empty_limits = true ) );
##
AddDerivationToCAP( DirectProduct, "DirectProduct as the source of IsomorphismFromDirectProductToDirectSum",
[ [ IsomorphismFromDirectProductToDirectSum, 1 ] ],
##
AddDerivationToCAP( TerminalObject, "TerminalObject as the source of IsomorphismFromTerminalObjectToZeroObject",
[ [ IsomorphismFromTerminalObjectToZeroObject, 1 ] ],
##
AddDerivationToCAP( TerminalObject, "TerminalObject as the range of IsomorphismFromZeroObjectToTerminalObject",
[ [ IsomorphismFromZeroObjectToTerminalObject, 1 ] ],
##
AddDerivationToCAP( ImageObject, "ImageObject as the source of ImageEmbedding",
[ [ ImageEmbedding, 1 ] ],
function( cat, mor )
return Source( ImageEmbedding( cat, mor ) );
end );
##
AddDerivationToCAP( ImageObject, "ImageObject as the source of IsomorphismFromImageObjectToKernelOfCokernel",
[ [ IsomorphismFromImageObjectToKernelOfCokernel, 1 ] ],
##
AddDerivationToCAP( ImageObject, "ImageObject as the range of IsomorphismFromKernelOfCokernelToImageObject",
[ [ IsomorphismFromKernelOfCokernelToImageObject, 1 ] ],
##
AddDerivationToCAP( SomeProjectiveObject, "SomeProjectiveObject as the source of EpimorphismFromSomeProjectiveObject",
[ [ EpimorphismFromSomeProjectiveObject, 1 ] ],
##
AddDerivationToCAP( Equalizer, "Equalizer as the source of EmbeddingOfEqualizer",
[ [ EmbeddingOfEqualizer, 1 ] ],
function( cat, A, diagram )
return Source( EmbeddingOfEqualizer( cat, A, diagram ) );
end );
##
AddDerivationToCAP( HomologyObject, "HomologyObject as the source of IsomorphismFromHomologyObjectToItsConstructionAsAnImageObject",
[ [ IsomorphismFromHomologyObjectToItsConstructionAsAnImageObject, 1 ] ],
function ( cat, left_coefficients, right_coefficients, right_side )
local range_cat, m, n, distinguished_object, interpretations, nu, H_B_C, H_A_D, list, H;
##
AddFinalDerivationBundle( "IsomorphismFromInitialObjectToZeroObject as the identity of the zero object",
[ [ ZeroObject, 1 ],
[ IdentityMorphism, 1 ] ],
[ IsomorphismFromInitialObjectToZeroObject,
IsomorphismFromZeroObjectToInitialObject,
InitialObject,
UniversalMorphismFromInitialObject ## NOTE: the combination of AddZeroObject and AddUniversalMorphismFromInitialObjectWithGivenInitialObject ## is okay because only having UniversalMorphismFromInitialObjectWithGivenInitialObject, you cannot ## deduce an InitialObject # UniversalMorphismFromInitialObjectWithGivenInitialObject
],
[
IsomorphismFromInitialObjectToZeroObject,
[ [ ZeroObject, 1 ],
[ IdentityMorphism, 1 ] ], function( cat )
##
AddFinalDerivationBundle( "IsomorphismFromTerminalObjectToZeroObject as the identity of the zero object",
[ [ ZeroObject, 1 ],
[ IdentityMorphism, 1 ] ],
[ IsomorphismFromTerminalObjectToZeroObject,
IsomorphismFromZeroObjectToTerminalObject,
TerminalObject,
UniversalMorphismIntoTerminalObject ## NOTE: the combination of AddZeroObject and AddUniversalMorphismIntoTerminalObjectWithGivenTerminalObject ## is okay because only having UniversalMorphismIntoTerminalObjectWithGivenTerminalObject, you cannot ## deduce a TerminalObject # UniversalMorphismIntoTerminalObjectWithGivenTerminalObject
],
[
IsomorphismFromTerminalObjectToZeroObject,
[ [ ZeroObject, 1 ],
[ IdentityMorphism, 1 ] ], function( cat )
if Length( L ) <> 1 or not IsInt( L[1] ) then
Error( "the list passed to 'RandomObjectByList' in ", Name( cat ), " must consist of only one integer!\n" ); fi;
return RandomObjectByInteger( cat, L[1] );
end
],
[
RandomMorphismWithFixedSourceAndRangeByList,
[ [ RandomMorphismWithFixedSourceAndRangeByInteger, 1 ] ], function( cat, S, R, L )
if Length( L ) <> 1 or not IsInt( L[1] ) then
Error( "the list passed to 'RandomMorphismWithFixedSourceAndRangeByList' in ", Name( cat ), " must consist of only one integer!\n" ); fi;
end
],
[
RandomMorphismWithFixedSourceByList,
[ [ RandomMorphismWithFixedSourceByInteger, 1 ] ], function( cat, S, L )
if Length( L ) <> 1 or not IsInt( L[1] ) then
Error( "the list passed to 'RandomMorphismWithFixedSourceByList' in ", Name( cat ), " must consist of only one integer!\n" ); fi;
end
],
[
RandomMorphismWithFixedRangeByList,
[ [ RandomMorphismWithFixedRangeByInteger, 1 ] ], function( cat, R, L )
if Length( L ) <> 1 or not IsInt( L[1] ) then
Error( "the list passed to 'RandomMorphismWithFixedRangeByList' in ", Name( cat ), " must consist of only one integer!\n" ); fi;
end
],
[
RandomMorphismByList,
[ [ RandomMorphismByInteger, 1 ] ], function( cat, L )
if Length( L ) <> 1 or not IsInt( L[1] ) then
Error( "the list passed to 'RandomMorphismByList' in ", Name( cat ), " must consist of only one integer!\n" ); fi;
if not ( HasIsLinearCategoryOverCommutativeRingWithFinitelyGeneratedFreeExternalHoms( cat ) and IsLinearCategoryOverCommutativeRingWithFinitelyGeneratedFreeExternalHoms( cat ) ) then
return false;
fi;
if not HasRangeCategoryOfHomomorphismStructure( cat ) then
if not ( HasIsLinearCategoryOverCommutativeRingWithFinitelyGeneratedFreeExternalHoms( range_cat ) and IsLinearCategoryOverCommutativeRingWithFinitelyGeneratedFreeExternalHoms( range_cat ) ) then
return false;
fi;
if not IsIdenticalObj( CommutativeRingOfLinearCategory( cat ), CommutativeRingOfLinearCategory( range_cat ) ) then
end
] : CategoryFilter := cat -> IsBound( cat!.supports_empty_limits ) and cat!.supports_empty_limits = true );
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.428Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.