# SPDX-License-Identifier: GPL-2.0-or-later
# CAP: Categories, Algorithms, Programming
#
# Implementations
#
BindGlobal( "CAP_INTERNAL_CORE_METHOD_NAME_RECORD" , rec(
ObjectConstructor := rec(
filter_list := [ "category" , "object_datum" ],
return_type := "object" ,
compatible_with_congruence_of_morphisms := false,
),
ObjectDatum := rec(
filter_list := [ "category" , "object" ],
return_type := "object_datum" ,
),
MorphismConstructor := rec(
filter_list := [ "category" , "object" , "morphism_datum" , "object" ],
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismDatum := rec(
filter_list := [ "category" , "morphism" ],
return_type := "morphism_datum" ,
compatible_with_congruence_of_morphisms := false,
),
SetOfObjectsOfCategory := rec(
filter_list := [ "category" ],
return_type := "list_of_objects" ,
dual_operation := "SetOfObjectsOfCategory" ,
),
SetOfMorphismsOfFiniteCategory := rec(
filter_list := [ "category" ],
return_type := "list_of_morphisms" ,
dual_operation := "SetOfMorphismsOfFiniteCategory" ,
),
LiftAlongMonomorphism := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "iota" , "tau" ],
output_source_getter_string := "Source( tau )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Source( iota )" ,
output_range_getter_preconditions := [ ],
pre_function := function ( cat , iota, tau )
if not IsEqualForObjects( cat , Range( iota ), Range( tau ) ) then
return [ false, "the two morphisms must have equal ranges" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_operation := "ColiftAlongEpimorphism" ,
compatible_with_congruence_of_morphisms := true,
),
IsLiftableAlongMonomorphism := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
pre_function := function ( cat , iota, tau )
if not IsEqualForObjects( cat , Range( iota ), Range( tau ) ) then
return [ false, "the two morphisms must have equal ranges" ];
fi ;
return [ true ];
end ,
return_type := "bool" ,
dual_operation := "IsColiftableAlongEpimorphism" ,
compatible_with_congruence_of_morphisms := true,
),
ColiftAlongEpimorphism := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "epsilon" , "tau" ],
output_source_getter_string := "Range( epsilon )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( tau )" ,
output_range_getter_preconditions := [ ],
pre_function := function ( cat , epsilon, tau )
if not IsEqualForObjects( cat , Source( epsilon ), Source( tau ) ) then
return [ false, "the two morphisms must have equal sources" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_operation := "LiftAlongMonomorphism" ,
compatible_with_congruence_of_morphisms := true,
),
IsColiftableAlongEpimorphism := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
pre_function := function ( cat , epsilon, tau )
if not IsEqualForObjects( cat , Source( epsilon ), Source( tau ) ) then
return [ false, "the two morphisms must have equal sources" ];
fi ;
return [ true ];
end ,
return_type := "bool" ,
dual_operation := "IsLiftableAlongMonomorphism" ,
compatible_with_congruence_of_morphisms := true,
),
Lift := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Source( beta )" ,
output_range_getter_preconditions := [ ],
pre_function := function ( cat , iota, tau )
if not IsEqualForObjects( cat , Range( iota ), Range( tau ) ) then
return [ false, "the two morphisms must have equal ranges" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_operation := "Colift" ,
dual_arguments_reversed := true,
is_merely_set_theoretic := true,
compatible_with_congruence_of_morphisms := false,
),
IsLiftable := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
pre_function := "Lift" ,
return_type := "bool" ,
dual_operation := "IsColiftable" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
Colift := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
output_source_getter_string := "Range( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( beta )" ,
output_range_getter_preconditions := [ ],
pre_function := function ( cat , epsilon, tau )
if not IsEqualForObjects( cat , Source( epsilon ), Source( tau ) ) then
return [ false, "the two morphisms must have equal sources" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_operation := "Lift" ,
dual_arguments_reversed := true,
is_merely_set_theoretic := true,
compatible_with_congruence_of_morphisms := false,
),
IsColiftable := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
pre_function := "Colift" ,
return_type := "bool" ,
dual_operation := "IsLiftable" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
ProjectiveLift := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Source( beta )" ,
output_range_getter_preconditions := [ ],
pre_function := function ( cat , iota, tau )
if not IsEqualForObjects( cat , Range( iota ), Range( tau ) ) then
return [ false, "the two morphisms must have equal ranges" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_arguments_reversed := true,
dual_operation := "InjectiveColift" ,
compatible_with_congruence_of_morphisms := false,
),
InjectiveColift := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
output_source_getter_string := "Range( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( beta )" ,
output_range_getter_preconditions := [ ],
pre_function := function ( cat , epsilon, tau )
if not IsEqualForObjects( cat , Source( epsilon ), Source( tau ) ) then
return [ false, "the two morphisms must have equal sources" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_arguments_reversed := true,
dual_operation := "ProjectiveLift" ,
compatible_with_congruence_of_morphisms := false,
),
IdentityMorphism := rec(
filter_list := [ "category" , "object" ],
input_arguments_names := [ "cat" , "a" ],
output_source_getter_string := "a" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "a" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "IdentityMorphism" ),
InverseForMorphisms := rec(
# Type check for IsIsomorphism
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "Range( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Source( alpha )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "InverseForMorphisms" ,
compatible_with_congruence_of_morphisms := true,
),
PreInverseForMorphisms := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "Range( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Source( alpha )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "PostInverseForMorphisms" ,
is_merely_set_theoretic := true
),
PostInverseForMorphisms := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "Range( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Source( alpha )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "PreInverseForMorphisms" ,
is_merely_set_theoretic := true
),
KernelObject := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
return_type := "object" ,
dual_operation := "CokernelObject" ,
compatible_with_congruence_of_morphisms := false,
functorial := "KernelObjectFunctorial" ,
),
KernelEmbedding := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_range_getter_string := "Source( alpha )" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "CokernelProjection" ,
compatible_with_congruence_of_morphisms := false,
),
KernelEmbeddingWithGivenKernelObject := rec(
filter_list := [ "category" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Source( alpha )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "CokernelProjectionWithGivenCokernelObject" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromKernelObjectToSink := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
dual_operation := "MorphismFromSourceToCokernelObject" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromKernelObjectToSinkWithGivenKernelObject := rec(
filter_list := [ "category" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
dual_operation := "MorphismFromSourceToCokernelObjectWithGivenCokernelObject" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
KernelLift := rec(
filter_list := [ "category" , "morphism" , "object" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "T" , "tau" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "CokernelColift" ,
compatible_with_congruence_of_morphisms := false,
),
KernelLiftWithGivenKernelObject := rec(
filter_list := [ "category" , "morphism" , "object" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "T" , "tau" , "P" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "CokernelColiftWithGivenCokernelObject" ,
compatible_with_congruence_of_morphisms := false,
),
CokernelObject := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
return_type := "object" ,
dual_operation := "KernelObject" ,
compatible_with_congruence_of_morphisms := false,
functorial := "CokernelObjectFunctorial" ,
),
CokernelProjection := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "Range( alpha )" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "KernelEmbedding" ,
compatible_with_congruence_of_morphisms := false,
),
CokernelProjectionWithGivenCokernelObject := rec(
filter_list := [ "category" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "P" ],
output_source_getter_string := "Range( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "KernelEmbeddingWithGivenKernelObject" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromSourceToCokernelObject := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
dual_operation := "MorphismFromKernelObjectToSink" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromSourceToCokernelObjectWithGivenCokernelObject := rec(
filter_list := [ "category" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "P" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
dual_operation := "MorphismFromKernelObjectToSinkWithGivenKernelObject" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
CokernelColift := rec(
filter_list := [ "category" , "morphism" , "object" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "T" , "tau" ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "KernelLift" ,
compatible_with_congruence_of_morphisms := false,
),
CokernelColiftWithGivenCokernelObject := rec(
filter_list := [ "category" , "morphism" , "object" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "T" , "tau" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "KernelLiftWithGivenKernelObject" ,
compatible_with_congruence_of_morphisms := false,
),
PreCompose := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( beta )" ,
output_range_getter_preconditions := [ ],
pre_function := function ( cat , mor_left, mor_right )
if not IsEqualForObjects( cat , Range( mor_left ), Source( mor_right ) ) then
return [ false, "morphisms not composable" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_operation := "PostCompose" ,
compatible_with_congruence_of_morphisms := true,
),
SumOfMorphisms := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "source" , "list_of_morphisms" , "range" ],
pre_function := function ( cat , source, list_of_morphisms, range )
local m;
for m in list_of_morphisms do
if not IsEqualForObjects( cat , source, Source( m ) ) or not IsEqualForObjects( cat , range, Range( m ) ) then
return [ false, "some of the morphisms are not compatible with the provided source and range objects" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
output_source_getter_string := "source" ,
output_range_getter_string := "range" ,
dual_operation := "SumOfMorphisms" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := true,
),
LinearCombinationOfMorphisms := rec(
filter_list := [ "category" , "object" , "list_of_elements_of_commutative_ring_of_linear_structure" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "source" , "list_of_ring_elements" , "list_of_morphisms" , "range" ],
pre_function := function ( cat , source, list_of_ring_elements, list_of_morphisms, range )
local m;
if not Length( list_of_ring_elements ) = Length( list_of_morphisms ) then
return [ false, "the length of the lists of coefficients and morphisms must be the same" ];
fi ;
for m in list_of_morphisms do
if not IsEqualForObjects( cat , source, Source( m ) ) or not IsEqualForObjects( cat , range, Range( m ) ) then
return [ false, "some of the morphisms are not compatible with the provided source and range objects" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
output_source_getter_string := "source" ,
output_range_getter_string := "range" ,
dual_operation := "LinearCombinationOfMorphisms" ,
dual_preprocessor_func := function ( arg )
local list;
list := CAP_INTERNAL_OPPOSITE_RECURSIVE( arg );
return NTuple( 5 , list[1 ], list[5 ], list[3 ], list[4 ], list[2 ] );
end ,
compatible_with_congruence_of_morphisms := true,
),
PreComposeList := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "source" , "list_of_morphisms" , "range" ],
pre_function := function ( cat , source, list_of_morphisms, range )
local i;
if IsEmpty( list_of_morphisms ) then
if not IsEqualForObjects( cat , source, range ) then
return [ false, "the given source and range are not equal while the given list of morphisms to compose is empty" ];
fi ;
else
if not IsEqualForObjects( cat , source, Source( First( list_of_morphisms ) ) ) then
return [ false, "the given source is not equal to the source of the first morphism" ];
elif not IsEqualForObjects( cat , range, Range( Last( list_of_morphisms ) ) ) then
return [ false, "the given range is not equal to the range of the last morphism" ];
fi ;
fi ;
for i in [ 1 .. Length( list_of_morphisms ) - 1 ] do
if not IsEqualForObjects( cat , Range( list_of_morphisms[i] ), Source( list_of_morphisms[i + 1 ] ) ) then
return [ false, "morphisms not composable" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
output_source_getter_string := "source" ,
output_range_getter_string := "range" ,
dual_operation := "PostComposeList" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := true,
),
PostCompose := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "beta" , "alpha" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( beta )" ,
output_range_getter_preconditions := [ ],
pre_function := function ( cat , mor_right, mor_left )
if not IsEqualForObjects( cat , Range( mor_left ), Source( mor_right ) ) then
return [ false, "morphisms not composable" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_operation := "PreCompose" ,
compatible_with_congruence_of_morphisms := true,
),
PostComposeList := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "source" , "list_of_morphisms" , "range" ],
pre_function := function ( cat , source, list_of_morphisms, range )
local i;
if IsEmpty( list_of_morphisms ) then
if not IsEqualForObjects( cat , source, range ) then
return [ false, "the given source and range are not equal while the given list of morphisms to compose is empty" ];
fi ;
else
if not IsEqualForObjects( cat , source, Source( Last( list_of_morphisms ) ) ) then
return [ false, "the given source is not equal to the source of the last morphism" ];
elif not IsEqualForObjects( cat , range, Range( First( list_of_morphisms ) ) ) then
return [ false, "the given range is not equal to the range of the first morphism" ];
fi ;
fi ;
for i in [ 1 .. Length( list_of_morphisms ) - 1 ] do
if not IsEqualForObjects( cat , Range( list_of_morphisms[i + 1 ] ), Source( list_of_morphisms[i] ) ) then
return [ false, "morphisms not composable" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
output_source_getter_string := "source" ,
output_range_getter_string := "range" ,
dual_operation := "PreComposeList" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := true,
),
ZeroObject := rec(
filter_list := [ "category" ],
input_arguments_names := [ "cat" ],
return_type := "object" ,
dual_operation := "ZeroObject" ,
functorial := "ZeroObjectFunctorial" ,
),
ZeroObjectFunctorial := rec(
filter_list := [ "category" ],
input_arguments_names := [ "cat" ],
return_type := "morphism" ,
output_source_getter_string := "ZeroObject( cat )" ,
output_source_getter_preconditions := [ [ "ZeroObject" , 1 ] ],
output_range_getter_string := "ZeroObject( cat )" ,
output_range_getter_preconditions := [ [ "ZeroObject" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "ZeroObjectFunctorial" ,
dual_arguments_reversed := true
),
ZeroObjectFunctorialWithGivenZeroObjects := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "P" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "ZeroObjectFunctorialWithGivenZeroObjects" ,
dual_arguments_reversed := true
),
UniversalMorphismFromZeroObject := rec(
filter_list := [ "category" , "object" ],
input_arguments_names := [ "cat" , "T" ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "UniversalMorphismIntoZeroObject" ),
UniversalMorphismFromZeroObjectWithGivenZeroObject := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "T" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "UniversalMorphismIntoZeroObjectWithGivenZeroObject" ),
UniversalMorphismIntoZeroObject := rec(
filter_list := [ "category" , "object" ],
input_arguments_names := [ "cat" , "T" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "UniversalMorphismFromZeroObject" ),
UniversalMorphismIntoZeroObjectWithGivenZeroObject := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "T" , "P" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "UniversalMorphismFromZeroObjectWithGivenZeroObject" ),
IsomorphismFromZeroObjectToInitialObject := rec(
filter_list := [ "category" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromTerminalObjectToZeroObject" ,
),
IsomorphismFromInitialObjectToZeroObject := rec(
filter_list := [ "category" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromZeroObjectToTerminalObject" ,
),
IsomorphismFromZeroObjectToTerminalObject := rec(
filter_list := [ "category" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromInitialObjectToZeroObject" ,
),
IsomorphismFromTerminalObjectToZeroObject := rec(
filter_list := [ "category" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromZeroObjectToInitialObject" ,
),
ZeroMorphism := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "a" , "b" ],
output_source_getter_string := "a" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "b" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_arguments_reversed := true,
dual_operation := "ZeroMorphism" ),
DirectSum := rec(
filter_list := [ "category" , "list_of_objects" ],
input_arguments_names := [ "cat" , "objects" ],
return_type := "object" ,
dual_operation := "DirectSum" ,
functorial := "DirectSumFunctorial" ,
),
ProjectionInFactorOfDirectSum := rec(
filter_list := [ "category" , "list_of_objects" , "integer" ],
input_arguments_names := [ "cat" , "objects" , "k" ],
output_range_getter_string := "objects[k]" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "InjectionOfCofactorOfDirectSum" ),
ProjectionInFactorOfDirectSumWithGivenDirectSum := rec(
filter_list := [ "category" , "list_of_objects" , "integer" , "object" ],
input_arguments_names := [ "cat" , "objects" , "k" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "objects[k]" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "InjectionOfCofactorOfDirectSumWithGivenDirectSum" ),
UniversalMorphismIntoDirectSum := rec(
filter_list := [ "category" , "list_of_objects" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "objects" , "T" , "tau" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
dual_operation := "UniversalMorphismFromDirectSum" ,
pre_function := function ( cat , diagram, test_object, source )
local current_morphism;
for current_morphism in source do
if not IsEqualForObjects( cat , Source( current_morphism ), test_object ) then
return [ false, "sources of morphisms must be equal to the test object in given source diagram" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
UniversalMorphismIntoDirectSumWithGivenDirectSum := rec(
filter_list := [ "category" , "list_of_objects" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "objects" , "T" , "tau" , "P" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
dual_operation := "UniversalMorphismFromDirectSumWithGivenDirectSum" ,
pre_function := function ( cat , diagram, test_object, source, direct_sum )
local current_morphism;
for current_morphism in source do
if not IsEqualForObjects( cat , Source( current_morphism ), test_object ) then
return [ false, "sources of morphisms must be equal to the test object in given source diagram" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
InjectionOfCofactorOfDirectSum := rec(
filter_list := [ "category" , "list_of_objects" , "integer" ],
input_arguments_names := [ "cat" , "objects" , "k" ],
output_source_getter_string := "objects[k]" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "ProjectionInFactorOfDirectSum" ),
InjectionOfCofactorOfDirectSumWithGivenDirectSum := rec(
filter_list := [ "category" , "list_of_objects" , "integer" , "object" ],
input_arguments_names := [ "cat" , "objects" , "k" , "P" ],
output_source_getter_string := "objects[k]" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "ProjectionInFactorOfDirectSumWithGivenDirectSum" ),
UniversalMorphismFromDirectSum := rec(
filter_list := [ "category" , "list_of_objects" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "objects" , "T" , "tau" ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
dual_operation := "UniversalMorphismIntoDirectSum" ,
pre_function := function ( cat , diagram, test_object, sink )
local current_morphism;
for current_morphism in sink do
if not IsEqualForObjects( cat , Range( current_morphism ), test_object ) then
return [ false, "ranges of morphisms must be equal to the test object in given sink diagram" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
UniversalMorphismFromDirectSumWithGivenDirectSum := rec(
filter_list := [ "category" , "list_of_objects" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "objects" , "T" , "tau" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
dual_operation := "UniversalMorphismIntoDirectSumWithGivenDirectSum" ,
pre_function := function ( cat , diagram, test_object, sink, direct_sum )
local current_morphism;
for current_morphism in sink do
if not IsEqualForObjects( cat , Range( current_morphism ), test_object ) then
return [ false, "ranges of morphisms must be equal to the test object in given sink diagram" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
TerminalObject := rec(
filter_list := [ "category" ],
input_arguments_names := [ "cat" ],
return_type := "object" ,
dual_operation := "InitialObject" ,
functorial := "TerminalObjectFunctorial" ,
),
UniversalMorphismIntoTerminalObject := rec(
filter_list := [ "category" , "object" ],
input_arguments_names := [ "cat" , "T" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "UniversalMorphismFromInitialObject" ),
UniversalMorphismIntoTerminalObjectWithGivenTerminalObject := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "T" , "P" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "UniversalMorphismFromInitialObjectWithGivenInitialObject" ),
InitialObject := rec(
filter_list := [ "category" ],
input_arguments_names := [ "cat" ],
return_type := "object" ,
dual_operation := "TerminalObject" ,
functorial := "InitialObjectFunctorial" ,
),
UniversalMorphismFromInitialObject := rec(
filter_list := [ "category" , "object" ],
input_arguments_names := [ "cat" , "T" ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "UniversalMorphismIntoTerminalObject" ),
UniversalMorphismFromInitialObjectWithGivenInitialObject := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "T" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "UniversalMorphismIntoTerminalObjectWithGivenTerminalObject" ),
DirectProduct := rec(
filter_list := [ "category" , "list_of_objects" ],
input_arguments_names := [ "cat" , "objects" ],
return_type := "object" ,
dual_operation := "Coproduct" ,
functorial := "DirectProductFunctorial" ,
),
ProjectionInFactorOfDirectProduct := rec(
filter_list := [ "category" , "list_of_objects" , "integer" ],
input_arguments_names := [ "cat" , "objects" , "k" ],
output_range_getter_string := "objects[k]" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "InjectionOfCofactorOfCoproduct" ),
ProjectionInFactorOfDirectProductWithGivenDirectProduct := rec(
filter_list := [ "category" , "list_of_objects" , "integer" , "object" ],
input_arguments_names := [ "cat" , "objects" , "k" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "objects[k]" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "InjectionOfCofactorOfCoproductWithGivenCoproduct" ),
UniversalMorphismIntoDirectProduct := rec(
filter_list := [ "category" , "list_of_objects" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "objects" , "T" , "tau" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
dual_operation := "UniversalMorphismFromCoproduct" ,
pre_function := function ( cat , diagram, test_object, source )
local current_morphism;
for current_morphism in source do
if not IsEqualForObjects( cat , Source( current_morphism ), test_object ) then
return [ false, "sources of morphisms must be equal to the test object in given source diagram" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
UniversalMorphismIntoDirectProductWithGivenDirectProduct := rec(
filter_list := [ "category" , "list_of_objects" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "objects" , "T" , "tau" , "P" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
dual_operation := "UniversalMorphismFromCoproductWithGivenCoproduct" ,
pre_function := function ( cat , diagram, test_object, source, direct_product )
local current_morphism;
for current_morphism in source do
if not IsEqualForObjects( cat , Source( current_morphism ), test_object ) then
return [ false, "sources of morphisms must be equal to the test object in given source diagram" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
ComponentOfMorphismIntoDirectProduct := rec(
filter_list := [ "category" , "morphism" , "list_of_objects" , "integer" ],
input_arguments_names := [ "cat" , "alpha" , "P" , "i" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P[i]" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "ComponentOfMorphismFromCoproduct" ),
IsCongruentForMorphisms := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
dual_operation := "IsCongruentForMorphisms" ,
pre_function := function ( cat , morphism_1, morphism_2 )
if not IsEqualForObjects( cat , Source( morphism_1 ), Source( morphism_2 ) ) then
return [ false, "sources are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( morphism_1 ), Range( morphism_2 ) ) then
return [ false, "ranges are not equal" ];
fi ;
return [ true ];
end ,
redirect_function := function ( cat , morphism_1, morphism_2 )
if IsIdenticalObj( morphism_1, morphism_2 ) then
return [ true, true ];
else
return [ false ];
fi ;
end ,
post_function := function ( cat , morphism_1, morphism_2, return_value )
if cat !.predicate_logic_propagation_for_morphisms and
cat !.predicate_logic and return_value = true then
INSTALL_TODO_LIST_FOR_EQUAL_MORPHISMS( morphism_1, morphism_2 );
fi ;
end ,
return_type := "bool" ,
compatible_with_congruence_of_morphisms := true,
),
IsEqualForMorphisms := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
dual_operation := "IsEqualForMorphisms" ,
pre_function := function ( cat , morphism_1, morphism_2 )
if not IsEqualForObjects( cat , Source( morphism_1 ), Source( morphism_2 ) ) then
return [ false, "sources are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( morphism_1 ), Range( morphism_2 ) ) then
return [ false, "ranges are not equal" ];
fi ;
return [ true ];
end ,
redirect_function := function ( cat , morphism_1, morphism_2 )
if IsIdenticalObj( morphism_1, morphism_2 ) then
return [ true, true ];
else
return [ false ];
fi ;
end ,
return_type := "bool" ,
compatible_with_congruence_of_morphisms := false,
),
IsEqualForMorphismsOnMor := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
dual_operation := "IsEqualForMorphismsOnMor" ,
redirect_function := function ( cat , morphism_1, morphism_2 )
if IsIdenticalObj( morphism_1, morphism_2 ) then
return [ true, true ];
else
return [ false ];
fi ;
end ,
return_type := "bool" ,
compatible_with_congruence_of_morphisms := false,
),
IsEqualForObjects := rec(
filter_list := [ "category" , "object" , "object" ],
dual_operation := "IsEqualForObjects" ,
redirect_function := function ( cat , object_1, object_2 )
if IsIdenticalObj( object_1, object_2 ) then
return [ true, true ];
else
return [ false ];
fi ;
end ,
post_function := function ( cat , object_1, object_2, return_value )
if cat !.predicate_logic_propagation_for_objects and
cat !.predicate_logic and return_value = true and not IsIdenticalObj( object_1, object_2 ) then
INSTALL_TODO_LIST_FOR_EQUAL_OBJECTS( object_1, object_2 );
fi ;
end ,
return_type := "bool" ),
IsEqualForCacheForObjects := rec(
filter_list := [ "category" , "object" , "object" ],
dual_operation := "IsEqualForCacheForObjects" ,
return_type := "bool" ),
IsEqualForCacheForMorphisms := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
dual_operation := "IsEqualForCacheForMorphisms" ,
return_type := "bool" ,
compatible_with_congruence_of_morphisms := false,
),
IsIsomorphicForObjects := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "object_1" , "object_2" ],
return_type := "bool" ,
dual_operation := "IsIsomorphicForObjects" ,
# The witness SomeIsomorphismBetweenObjects needs reversed arguments.
# This shows that reversing the arguments is the correct dualization,
# even if the relation is symmetric.
dual_arguments_reversed := true,
redirect_function := function ( cat , object_1, object_2 )
# As any CAP operation, IsIsomorphicForObjects must be compatible with IsEqualForObjects.
# This implies that IsIsomorphicForObjects must be coarser than IsEqualForObjects:
# One can see this by first choosing object_2 := object_1 and the varying one argument with regard to IsEqualForObjects.
if IsEqualForObjects( object_1, object_2 ) then
return [ true, true ];
else
return [ false ];
fi ;
end ,
),
SomeIsomorphismBetweenObjects := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "object_1" , "object_2" ],
return_type := "morphism" ,
output_source_getter_string := "object_1" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "object_2" ,
output_range_getter_preconditions := [ ],
dual_operation := "SomeIsomorphismBetweenObjects" ,
dual_arguments_reversed := true,
),
IsZeroForMorphisms := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsZeroForMorphisms" ,
is_reflected_by_faithful_functor := true,
compatible_with_congruence_of_morphisms := true,
),
AdditionForMorphisms := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
dual_operation := "AdditionForMorphisms" ,
pre_function := function ( cat , morphism_1, morphism_2 )
if not IsEqualForObjects( cat , Source( morphism_1 ), Source( morphism_2 ) ) then
return [ false, "sources are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( morphism_1 ), Range( morphism_2 ) ) then
return [ false, "ranges are not equal" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
SubtractionForMorphisms := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
dual_operation := "SubtractionForMorphisms" ,
pre_function := function ( cat , morphism_1, morphism_2 )
if not IsEqualForObjects( cat , Source( morphism_1 ), Source( morphism_2 ) ) then
return [ false, "sources are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( morphism_1 ), Range( morphism_2 ) ) then
return [ false, "ranges are not equal" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
MultiplyWithElementOfCommutativeRingForMorphisms := rec(
filter_list := [ "category" , "element_of_commutative_ring_of_linear_structure" , "morphism" ],
input_arguments_names := [ "cat" , "r" , "alpha" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
pre_function := function ( cat , r, morphism )
if not r in CommutativeRingOfLinearCategory( cat ) then
return [ false, "the first argument is not an element of the ring of the category of the morphism" ];
fi ;
return [ true ];
end ,
dual_operation := "MultiplyWithElementOfCommutativeRingForMorphisms" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
AdditiveInverseForMorphisms := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
dual_operation := "AdditiveInverseForMorphisms" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
Coproduct := rec(
filter_list := [ "category" , "list_of_objects" ],
input_arguments_names := [ "cat" , "objects" ],
return_type := "object" ,
dual_operation := "DirectProduct" ,
functorial := "CoproductFunctorial" ,
),
InjectionOfCofactorOfCoproduct := rec(
filter_list := [ "category" , "list_of_objects" , "integer" ],
input_arguments_names := [ "cat" , "objects" , "k" ],
output_source_getter_string := "objects[k]" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "ProjectionInFactorOfDirectProduct" ),
InjectionOfCofactorOfCoproductWithGivenCoproduct := rec(
filter_list := [ "category" , "list_of_objects" , "integer" , "object" ],
input_arguments_names := [ "cat" , "objects" , "k" , "P" ],
output_source_getter_string := "objects[k]" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "ProjectionInFactorOfDirectProductWithGivenDirectProduct" ),
UniversalMorphismFromCoproduct := rec(
filter_list := [ "category" , "list_of_objects" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "objects" , "T" , "tau" ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
dual_operation := "UniversalMorphismIntoDirectProduct" ,
pre_function := function ( cat , diagram, test_object, sink )
local current_morphism;
for current_morphism in sink do
if not IsEqualForObjects( cat , Range( current_morphism ), test_object ) then
return [ false, "ranges of morphisms must be equal to the test object in given sink diagram" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
UniversalMorphismFromCoproductWithGivenCoproduct := rec(
filter_list := [ "category" , "list_of_objects" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "objects" , "T" , "tau" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
dual_operation := "UniversalMorphismIntoDirectProductWithGivenDirectProduct" ,
pre_function := function ( cat , diagram, test_object, sink, coproduct )
local current_morphism;
for current_morphism in sink do
if not IsEqualForObjects( cat , Range( current_morphism ), test_object ) then
return [ false, "ranges of morphisms must be equal to the test object in given sink diagram" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := true,
),
ComponentOfMorphismFromCoproduct := rec(
filter_list := [ "category" , "morphism" , "list_of_objects" , "integer" ],
input_arguments_names := [ "cat" , "alpha" , "I" , "i" ],
output_source_getter_string := "I[i]" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "ComponentOfMorphismIntoDirectProduct" ),
IsEqualAsSubobjects := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsEqualAsFactorobjects" ,
compatible_with_congruence_of_morphisms := true,
),
IsEqualAsFactorobjects := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsEqualAsSubobjects" ,
compatible_with_congruence_of_morphisms := true,
),
IsDominating := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
dual_operation := "IsCodominating" ,
pre_function := function ( cat , sub1, sub2 )
if not IsEqualForObjects( cat , Range( sub1 ), Range( sub2 ) ) then
return [ false, "subobjects of different objects are not comparable by dominates" ];
fi ;
return [ true ];
end ,
return_type := "bool" ,
compatible_with_congruence_of_morphisms := true,
),
IsCodominating := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
dual_operation := "IsDominating" ,
pre_function := function ( cat , factor1, factor2 )
if not IsEqualForObjects( cat , Source( factor1 ), Source( factor2 ) ) then
return [ false, "factors of different objects are not comparable by codominates" ];
fi ;
return [ true ];
end ,
return_type := "bool" ,
compatible_with_congruence_of_morphisms := true,
),
Equalizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" ],
return_type := "object" ,
dual_operation := "Coequalizer" ,
pre_function := function ( cat , cobase, diagram )
local base, current_morphism;
if IsEmpty( diagram ) then
return [ true ];
fi ;
for current_morphism in diagram{[ 1 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), cobase ) then
return [ false, "the given morphisms of the equalizer diagram must have equal sources" ];
fi ;
od;
base := Range( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), base ) then
return [ false, "the given morphisms of the equalizer diagram must have equal ranges" ];
fi ;
od;
return [ true ];
end ,
compatible_with_congruence_of_morphisms := false,
functorial := "EqualizerFunctorial" ,
),
EmbeddingOfEqualizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
return_type := "morphism" ,
input_arguments_names := [ "cat" , "Y" , "morphisms" ],
output_range_getter_string := "Y" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
dual_operation := "ProjectionOntoCoequalizer" ,
pre_function := "Equalizer" ,
compatible_with_congruence_of_morphisms := false,
),
EmbeddingOfEqualizerWithGivenEqualizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" ],
return_type := "morphism" ,
input_arguments_names := [ "cat" , "Y" , "morphisms" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Y" ,
output_range_getter_preconditions := [ ],
dual_operation := "ProjectionOntoCoequalizerWithGivenCoequalizer" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromEqualizerToSink := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" ],
output_range_getter_string := "Range( morphisms[1] )" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
dual_operation := "MorphismFromSourceToCoequalizer" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromEqualizerToSinkWithGivenEqualizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( morphisms[1] )" ,
output_range_getter_preconditions := [ ],
dual_operation := "MorphismFromSourceToCoequalizerWithGivenCoequalizer" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
UniversalMorphismIntoEqualizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" , "morphism" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" , "T" , "tau" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "UniversalMorphismFromCoequalizer" ,
pre_function := function ( cat , cobase, diagram, test_object, tau )
local base, current_morphism, current_morphism_position;
if IsEmpty( diagram ) then
return [ true ];
fi ;
for current_morphism in diagram{[ 1 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), cobase ) then
return [ false, "the given morphisms of the equalizer diagram must have equal sources" ];
fi ;
od;
base := Range( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), base ) then
return [ false, "the given morphisms of the equalizer diagram must have equal ranges" ];
fi ;
od;
for current_morphism_position in [ 1 .. Length( diagram ) ] do
if not IsEqualForObjects( cat , Source( diagram[ current_morphism_position ] ), Range( tau ) ) then
return [ false, Concatenation( "in diagram position " , String( current_morphism_position ), ": source and range are not equal" ) ];
fi ;
od;
return [ true ];
end ,
compatible_with_congruence_of_morphisms := false,
),
UniversalMorphismIntoEqualizerWithGivenEqualizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" , "T" , "tau" , "P" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "UniversalMorphismFromCoequalizerWithGivenCoequalizer" ,
compatible_with_congruence_of_morphisms := false,
),
IsomorphismFromEqualizerToKernelOfJointPairwiseDifferencesOfMorphismsIntoDirectProduct := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "A" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromCokernelOfJointPairwiseDifferencesOfMorphismsFromCoproductToCoequalizer" ,
),
IsomorphismFromKernelOfJointPairwiseDifferencesOfMorphismsIntoDirectProductToEqualizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "A" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromCoequalizerToCokernelOfJointPairwiseDifferencesOfMorphismsFromCoproduct" ,
),
FiberProduct := rec(
filter_list := [ "category" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" ],
dual_operation := "Pushout" ,
pre_function := function ( cat , diagram )
local base, current_morphism;
if IsEmpty( diagram ) then
return [ true ];
fi ;
base := Range( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), base ) then
return [ false, "the given morphisms of the fiber product diagram must have equal ranges" ];
fi ;
od;
return [ true ];
end ,
return_type := "object" ,
compatible_with_congruence_of_morphisms := false,
functorial := "FiberProductFunctorial" ,
),
ProjectionInFactorOfFiberProduct := rec(
filter_list := [ "category" , "list_of_morphisms" , "integer" ],
input_arguments_names := [ "cat" , "morphisms" , "k" ],
output_range_getter_string := "Source( morphisms[k] )" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
dual_operation := "InjectionOfCofactorOfPushout" ,
pre_function := function ( cat , diagram, projection_number )
local base, current_morphism;
if projection_number < 1 or projection_number > Length( diagram ) then
return[ false, Concatenation( "there does not exist a " , String( projection_number ), "th projection" ) ];
fi ;
base := Range( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), base ) then
return [ false, "the given morphisms of the fiber product diagram must have equal ranges" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
ProjectionInFactorOfFiberProductWithGivenFiberProduct := rec(
filter_list := [ "category" , "list_of_morphisms" , "integer" , "object" ],
input_arguments_names := [ "cat" , "morphisms" , "k" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Source( morphisms[k] )" ,
output_range_getter_preconditions := [ ],
dual_operation := "InjectionOfCofactorOfPushoutWithGivenPushout" ,
pre_function := function ( cat , diagram, projection_number, pullback )
local base, current_morphism;
if projection_number < 1 or projection_number > Length( diagram ) then
return[ false, Concatenation( "there does not exist a " , String( projection_number ), "th projection" ) ];
fi ;
base := Range( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), base ) then
return [ false, "the given morphisms of the fiber product diagram must have equal ranges" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromFiberProductToSink := rec(
filter_list := [ "category" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" ],
output_range_getter_string := "Range( morphisms[1] )" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
dual_operation := "MorphismFromSourceToPushout" ,
pre_function := function ( cat , diagram )
local base, current_morphism;
base := Range( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), base ) then
return [ false, "the given morphisms of the fiber product diagram must have equal ranges" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromFiberProductToSinkWithGivenFiberProduct := rec(
filter_list := [ "category" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "morphisms" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( morphisms[1] )" ,
output_range_getter_preconditions := [ ],
dual_operation := "MorphismFromSourceToPushoutWithGivenPushout" ,
pre_function := function ( cat , diagram, pullback )
local base, current_morphism;
base := Range( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), base ) then
return [ false, "the given morphisms of the fiber product diagram must have equal ranges" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
UniversalMorphismIntoFiberProduct := rec(
filter_list := [ "category" , "list_of_morphisms" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" , "T" , "tau" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
dual_operation := "UniversalMorphismFromPushout" ,
pre_function := function ( cat , diagram, test_object, source )
local base, current_morphism, current_morphism_position;
if Length( diagram ) <> Length( source ) then
return [ false, "fiber product diagram and test diagram must have equal length" ];
fi ;
if IsEmpty( diagram ) then
return [ true ];
fi ;
base := Range( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), base ) then
return [ false, "the given morphisms of the fiber product diagram must have equal ranges" ];
fi ;
od;
for current_morphism in source do
if not IsEqualForObjects( cat , Source( current_morphism ), test_object ) then
return [ false, "the given morphisms of the test source do not have sources equal to the test object" ];
fi ;
od;
for current_morphism_position in [ 1 .. Length( diagram ) ] do
if not IsEqualForObjects( cat , Source( diagram[ current_morphism_position ] ), Range( source[ current_morphism_position ] ) ) then
return [ false, Concatenation( "in diagram position " , String( current_morphism_position ), ": source and range are not equal" ) ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
UniversalMorphismIntoFiberProductWithGivenFiberProduct := rec(
filter_list := [ "category" , "list_of_morphisms" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "morphisms" , "T" , "tau" , "P" ],
output_source_getter_string := "T" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
dual_operation := "UniversalMorphismFromPushoutWithGivenPushout" ,
pre_function := function ( cat , diagram, test_object, source, pullback )
local base, current_morphism, current_morphism_position;
if Length( diagram ) <> Length( source ) then
return [ false, "fiber product diagram and test diagram must have equal length" ];
fi ;
if IsEmpty( diagram ) then
return [ true ];
fi ;
base := Range( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), base ) then
return [ false, "the given morphisms of the fiber product diagram must have equal ranges" ];
fi ;
od;
for current_morphism in source do
if not IsEqualForObjects( cat , Source( current_morphism ), test_object ) then
return [ false, "the given morphisms of the test source do not have sources equal to the test object" ];
fi ;
od;
for current_morphism_position in [ 1 .. Length( diagram ) ] do
if not IsEqualForObjects( cat , Source( diagram[ current_morphism_position ] ), Range( source[ current_morphism_position ] ) ) then
return [ false, Concatenation( "in diagram position " , String( current_morphism_position ), ": source and range are not equal" ) ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
Coequalizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" ],
return_type := "object" ,
dual_operation := "Equalizer" ,
pre_function := function ( cat , cobase, diagram )
local base, current_morphism;
if IsEmpty( diagram ) then
return [ true ];
fi ;
base := Source( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), base ) then
return [ false, "the given morphisms of the coequalizer diagram must have equal sources" ];
fi ;
od;
for current_morphism in diagram{[ 1 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), cobase ) then
return [ false, "the given morphisms of the coequalizer diagram must have equal ranges" ];
fi ;
od;
return [ true ];
end ,
compatible_with_congruence_of_morphisms := false,
functorial := "CoequalizerFunctorial" ,
),
ProjectionOntoCoequalizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
return_type := "morphism" ,
input_arguments_names := [ "cat" , "Y" , "morphisms" ],
output_source_getter_string := "Y" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
dual_operation := "EmbeddingOfEqualizer" ,
pre_function := "Coequalizer" ,
compatible_with_congruence_of_morphisms := false,
),
ProjectionOntoCoequalizerWithGivenCoequalizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" ],
return_type := "morphism" ,
input_arguments_names := [ "cat" , "Y" , "morphisms" , "P" ],
output_source_getter_string := "Y" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
dual_operation := "EmbeddingOfEqualizerWithGivenEqualizer" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromSourceToCoequalizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" ],
output_source_getter_string := "Source( morphisms[1] )" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
dual_operation := "MorphismFromEqualizerToSink" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromSourceToCoequalizerWithGivenCoequalizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" , "P" ],
output_source_getter_string := "Source( morphisms[1] )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
dual_operation := "MorphismFromEqualizerToSinkWithGivenEqualizer" ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
UniversalMorphismFromCoequalizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" , "morphism" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" , "T" , "tau" ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "UniversalMorphismIntoEqualizer" ,
pre_function := function ( cat , cobase, diagram, test_object, tau )
local base, current_morphism, current_morphism_position;
if IsEmpty( diagram ) then
return [ true ];
fi ;
base := Source( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), base ) then
return [ false, "the given morphisms of the coequalizer diagram must have equal sources" ];
fi ;
od;
for current_morphism in diagram{[ 1 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Range( current_morphism ), cobase ) then
return [ false, "the given morphisms of the coequalizer diagram must have equal ranges" ];
fi ;
od;
for current_morphism_position in [ 1 .. Length( diagram ) ] do
if not IsEqualForObjects( cat , Range( diagram[ current_morphism_position ] ), Source( tau ) ) then
return [ false, Concatenation( "in diagram position " , String( current_morphism_position ), ": range and source are not equal" ) ];
fi ;
od;
return [ true ];
end ,
compatible_with_congruence_of_morphisms := false,
),
UniversalMorphismFromCoequalizerWithGivenCoequalizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "object" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "Y" , "morphisms" , "T" , "tau" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "UniversalMorphismIntoEqualizerWithGivenEqualizer" ,
compatible_with_congruence_of_morphisms := false,
),
IsomorphismFromCoequalizerToCokernelOfJointPairwiseDifferencesOfMorphismsFromCoproduct := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "A" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromKernelOfJointPairwiseDifferencesOfMorphismsIntoDirectProductToEqualizer" ,
),
IsomorphismFromCokernelOfJointPairwiseDifferencesOfMorphismsFromCoproductToCoequalizer := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "A" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromEqualizerToKernelOfJointPairwiseDifferencesOfMorphismsIntoDirectProduct" ,
),
Pushout := rec(
filter_list := [ "category" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" ],
dual_operation := "FiberProduct" ,
pre_function := function ( cat , diagram )
local cobase, current_morphism;
if IsEmpty( diagram ) then
return [ true ];
fi ;
cobase := Source( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), cobase ) then
return [ false, "the given morphisms of the pushout diagram must have equal sources" ];
fi ;
od;
return [ true ];
end ,
return_type := "object" ,
compatible_with_congruence_of_morphisms := false,
functorial := "PushoutFunctorial" ,
),
InjectionOfCofactorOfPushout := rec(
filter_list := [ "category" , "list_of_morphisms" , "integer" ],
input_arguments_names := [ "cat" , "morphisms" , "k" ],
output_source_getter_string := "Range( morphisms[k] )" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
dual_operation := "ProjectionInFactorOfFiberProduct" ,
pre_function := function ( cat , diagram, injection_number )
local cobase, current_morphism;
if injection_number < 1 or injection_number > Length( diagram ) then
return[ false, Concatenation( "there does not exist a " , String( injection_number ), "th injection" ) ];
fi ;
cobase := Source( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), cobase ) then
return [ false, "the given morphisms of the pushout diagram must have equal sources" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
InjectionOfCofactorOfPushoutWithGivenPushout := rec(
filter_list := [ "category" , "list_of_morphisms" , "integer" , "object" ],
input_arguments_names := [ "cat" , "morphisms" , "k" , "P" ],
output_source_getter_string := "Range( morphisms[k] )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
dual_operation := "ProjectionInFactorOfFiberProductWithGivenFiberProduct" ,
pre_function := function ( cat , diagram, injection_number, pushout )
local cobase, current_morphism;
if injection_number < 1 or injection_number > Length( diagram ) then
return[ false, Concatenation( "there does not exist a " , String( injection_number ), "th injection" ) ];
fi ;
cobase := Source( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), cobase ) then
return [ false, "the given morphisms of the pushout diagram must have equal sources" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromSourceToPushout := rec(
filter_list := [ "category" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" ],
output_source_getter_string := "Source( morphisms[1] )" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
dual_operation := "MorphismFromFiberProductToSink" ,
pre_function := function ( cat , diagram )
local cobase, current_morphism;
cobase := Source( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), cobase ) then
return [ false, "the given morphisms of the pushout diagram must have equal sources" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
MorphismFromSourceToPushoutWithGivenPushout := rec(
filter_list := [ "category" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "morphisms" , "P" ],
output_source_getter_string := "Source( morphisms[1] )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "P" ,
output_range_getter_preconditions := [ ],
dual_operation := "MorphismFromFiberProductToSinkWithGivenFiberProduct" ,
pre_function := function ( cat , diagram, pushout )
local cobase, current_morphism;
cobase := Source( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), cobase ) then
return [ false, "the given morphisms of the pushout diagram must have equal sources" ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
UniversalMorphismFromPushout := rec(
filter_list := [ "category" , "list_of_morphisms" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" , "T" , "tau" ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
dual_operation := "UniversalMorphismIntoFiberProduct" ,
pre_function := function ( cat , diagram, test_object, sink )
local cobase, current_morphism, current_morphism_position;
if Length( diagram ) <> Length( sink ) then
return [ false, "pushout diagram and test diagram must have equal length" ];
fi ;
if IsEmpty( diagram ) then
return [ true ];
fi ;
cobase := Source( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), cobase ) then
return [ false, "the given morphisms of the fiber pushout must have equal sources" ];
fi ;
od;
for current_morphism in sink do
if not IsEqualForObjects( cat , Range( current_morphism ), test_object ) then
return [ false, "the given morphisms of the test sink do not have ranges equal to the test object" ];
fi ;
od;
for current_morphism_position in [ 1 .. Length( diagram ) ] do
if not IsEqualForObjects( cat , Range( diagram[ current_morphism_position ] ), Source( sink[ current_morphism_position ] ) ) then
return [ false, Concatenation( "in diagram position " , String( current_morphism_position ), ": source and range are not equal" ) ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
UniversalMorphismFromPushoutWithGivenPushout := rec(
filter_list := [ "category" , "list_of_morphisms" , "object" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "morphisms" , "T" , "tau" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
dual_operation := "UniversalMorphismIntoFiberProductWithGivenFiberProduct" ,
pre_function := function ( cat , diagram, test_object, sink, pushout )
local cobase, current_morphism, current_morphism_position;
if Length( diagram ) <> Length( sink ) then
return [ false, "pushout diagram and test diagram must have equal length" ];
fi ;
if IsEmpty( diagram ) then
return [ true ];
fi ;
cobase := Source( diagram[1 ] );
for current_morphism in diagram{[ 2 .. Length( diagram ) ]} do
if not IsEqualForObjects( cat , Source( current_morphism ), cobase ) then
return [ false, "the given morphisms of the fiber pushout must have equal sources" ];
fi ;
od;
for current_morphism in sink do
if not IsEqualForObjects( cat , Range( current_morphism ), test_object ) then
return [ false, "the given morphisms of the test sink do not have ranges equal to the test object" ];
fi ;
od;
for current_morphism_position in [ 1 .. Length( diagram ) ] do
if not IsEqualForObjects( cat , Range( diagram[ current_morphism_position ] ), Source( sink[ current_morphism_position ] ) ) then
return [ false, Concatenation( "in diagram position " , String( current_morphism_position ), ": source and range are not equal" ) ];
fi ;
od;
return [ true ];
end ,
return_type := "morphism" ,
compatible_with_congruence_of_morphisms := false,
),
ImageObject := rec(
filter_list := [ "category" , "morphism" ],
return_type := "object" ,
dual_operation := "CoimageObject" ,
functorial := "ImageObjectFunctorial" ,
),
ImageEmbedding := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "CoimageProjection" ),
ImageEmbeddingWithGivenImageObject := rec(
filter_list := [ "category" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "I" ],
output_source_getter_string := "I" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "CoimageProjectionWithGivenCoimageObject" ),
CoimageObject := rec(
filter_list := [ "category" , "morphism" ],
return_type := "object" ,
dual_operation := "ImageObject" ,
functorial := "CoimageObjectFunctorial" ,
),
CoimageProjection := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "ImageEmbedding" ),
CoimageProjectionWithGivenCoimageObject := rec(
filter_list := [ "category" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "C" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "C" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "ImageEmbeddingWithGivenImageObject" ),
AstrictionToCoimage := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "CoastrictionToImage" ),
AstrictionToCoimageWithGivenCoimageObject := rec(
filter_list := [ "category" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "C" ],
output_source_getter_string := "C" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "CoastrictionToImageWithGivenImageObject" ),
UniversalMorphismIntoCoimage := rec(
filter_list := [ "category" , "morphism" , "pair_of_morphisms" ],
input_arguments_names := [ "cat" , "alpha" , "tau" ],
output_source_getter_string := "Range( tau[1] )" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
dual_preprocessor_func := function ( cat , alpha, tau )
return Triple( OppositeCategory( cat ), Opposite( alpha ), Pair( Opposite( tau[2 ] ), Opposite( tau[1 ] ) ) );
end ,
pre_function := function ( cat , morphism, test_factorization )
if not IsEqualForObjects( cat , Source( morphism ), Source( test_factorization[ 1 ] ) ) then
return [ false, "source of morphism and test factorization are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( morphism ), Range( test_factorization[ 2 ] ) ) then
return [ false, "range of morphism and test factorization are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( test_factorization[ 1 ] ), Source( test_factorization[ 2 ] ) ) then
return [ false, "source and range of test factorization are not equal" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_operation := "UniversalMorphismFromImage" ),
UniversalMorphismIntoCoimageWithGivenCoimageObject := rec(
filter_list := [ "category" , "morphism" , "pair_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "tau" , "C" ],
output_source_getter_string := "Range( tau[1] )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "C" ,
output_range_getter_preconditions := [ ],
dual_preprocessor_func := function ( cat , alpha, tau, C )
return NTuple( 4 , OppositeCategory( cat ), Opposite( alpha ), Pair( Opposite( tau[2 ] ), Opposite( tau[1 ] ) ), Opposite( C ) );
end ,
pre_function := function ( cat , morphism, test_factorization, image )
if not IsEqualForObjects( cat , Source( morphism ), Source( test_factorization[ 1 ] ) ) then
return [ false, "source of morphism and test factorization are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( morphism ), Range( test_factorization[ 2 ] ) ) then
return [ false, "range of morphism and test factorization are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( test_factorization[ 1 ] ), Source( test_factorization[ 2 ] ) ) then
return [ false, "source and range of test factorization are not equal" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ,
dual_operation := "UniversalMorphismFromImageWithGivenImageObject" ),
MorphismFromCoimageToImage := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "CoimageObject( cat, alpha )" ,
output_source_getter_preconditions := [ [ "CoimageObject" , 1 ] ],
output_range_getter_string := "ImageObject( cat, alpha )" ,
output_range_getter_preconditions := [ [ "ImageObject" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "MorphismFromCoimageToImage" ,
return_type := "morphism" ),
MorphismFromCoimageToImageWithGivenObjects := rec(
filter_list := [ "category" , "object" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "C" , "alpha" , "I" ],
output_source_getter_string := "C" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "I" ,
output_range_getter_preconditions := [ ],
dual_operation := "MorphismFromCoimageToImageWithGivenObjects" ,
dual_arguments_reversed := true,
return_type := "morphism" ),
InverseOfMorphismFromCoimageToImage := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "ImageObject( cat, alpha )" ,
output_source_getter_preconditions := [ [ "ImageObject" , 1 ] ],
output_range_getter_string := "CoimageObject( cat, alpha )" ,
output_range_getter_preconditions := [ [ "CoimageObject" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "InverseOfMorphismFromCoimageToImage" ,
return_type := "morphism" ),
InverseOfMorphismFromCoimageToImageWithGivenObjects := rec(
filter_list := [ "category" , "object" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "I" , "alpha" , "C" ],
output_source_getter_string := "I" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "C" ,
output_range_getter_preconditions := [ ],
dual_operation := "InverseOfMorphismFromCoimageToImageWithGivenObjects" ,
dual_arguments_reversed := true,
return_type := "morphism" ),
IsWellDefinedForMorphisms := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
dual_operation := "IsWellDefinedForMorphisms" ,
redirect_function := function ( cat , morphism )
local source, range;
source := Source( morphism );
range := Range( morphism );
if not ( IsWellDefinedForObjects( cat , source ) and IsWellDefinedForObjects( cat , range ) ) then
return [ true, false ];
else
return [ false ];
fi ;
end ,
return_type := "bool" ),
IsWellDefinedForMorphismsWithGivenSourceAndRange := rec(
filter_list := [ "category" , "object" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "source" , "alpha" , "range" ],
return_type := "bool" ,
dual_operation := "IsWellDefinedForMorphismsWithGivenSourceAndRange" ,
dual_arguments_reversed := true,
),
IsWellDefinedForObjects := rec(
filter_list := [ "category" , "object" ],
dual_operation := "IsWellDefinedForObjects" ,
return_type := "bool" ),
IsZeroForObjects := rec(
filter_list := [ "category" , "object" ],
return_type := "bool" ,
dual_operation := "IsZeroForObjects" ,
),
IsMonomorphism := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsEpimorphism" ,
is_reflected_by_faithful_functor := true,
),
IsEpimorphism := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsMonomorphism" ,
is_reflected_by_faithful_functor := true,
),
IsIsomorphism := rec(
filter_list := [ "category" , "morphism" ],
dual_operation := "IsIsomorphism" ,
return_type := "bool" ,
),
IsEndomorphism := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsEndomorphism" ,
),
IsAutomorphism := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsAutomorphism" ,
),
IsOne := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsOne" ,
pre_function := function ( cat , morphism )
if not IsEqualForObjects( cat , Source( morphism ), Range( morphism ) ) then
return [ false, "source and range of the given morphism are not equal" ];
fi ;
return [ true ];
end ,
),
IsSplitMonomorphism := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsSplitEpimorphism" ,
),
IsSplitEpimorphism := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsSplitMonomorphism" ,
),
IsIdempotent := rec(
pre_function := function ( cat , morphism )
# do not use IsEndomorphism( morphism ) here because you don't know if
# the user has given an own IsEndomorphism function
if not IsEqualForObjects( cat , Source( morphism ), Range( morphism ) ) then
return [ false, "the given morphism has to be an endomorphism" ];
fi ;
return [ true ];
end ,
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsIdempotent" ,
),
IsBijectiveObject := rec(
filter_list := [ "category" , "object" ],
return_type := "bool" ,
dual_operation := "IsBijectiveObject" ,
),
IsProjective := rec(
filter_list := [ "category" , "object" ],
return_type := "bool" ,
dual_operation := "IsInjective" ,
),
IsInjective := rec(
filter_list := [ "category" , "object" ],
return_type := "bool" ,
dual_operation := "IsProjective" ,
),
IsTerminal := rec(
filter_list := [ "category" , "object" ],
return_type := "bool" ,
dual_operation := "IsInitial" ,
),
IsInitial := rec(
filter_list := [ "category" , "object" ],
return_type := "bool" ,
dual_operation := "IsTerminal" ,
),
IsEqualToIdentityMorphism := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsEqualToIdentityMorphism" ,
),
IsEqualToZeroMorphism := rec(
filter_list := [ "category" , "morphism" ],
return_type := "bool" ,
dual_operation := "IsEqualToZeroMorphism" ,
),
CoastrictionToImage := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "AstrictionToCoimage" ),
CoastrictionToImageWithGivenImageObject := rec(
filter_list := [ "category" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "I" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "I" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "AstrictionToCoimageWithGivenCoimageObject" ),
UniversalMorphismFromImage := rec(
filter_list := [ "category" , "morphism" , "pair_of_morphisms" ],
input_arguments_names := [ "cat" , "alpha" , "tau" ],
output_range_getter_string := "Range( tau[1] )" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
dual_operation := "UniversalMorphismIntoCoimage" ,
dual_preprocessor_func := function ( cat , alpha, tau )
return Triple( OppositeCategory( cat ), Opposite( alpha ), Pair( Opposite( tau[2 ] ), Opposite( tau[1 ] ) ) );
end ,
pre_function := function ( cat , morphism, test_factorization )
if not IsEqualForObjects( cat , Source( morphism ), Source( test_factorization[ 1 ] ) ) then
return [ false, "source of morphism and test factorization are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( morphism ), Range( test_factorization[ 2 ] ) ) then
return [ false, "range of morphism and test factorization are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( test_factorization[ 1 ] ), Source( test_factorization[ 2 ] ) ) then
return [ false, "source and range of test factorization are not equal" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ),
UniversalMorphismFromImageWithGivenImageObject := rec(
filter_list := [ "category" , "morphism" , "pair_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "alpha" , "tau" , "I" ],
output_source_getter_string := "I" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( tau[1] )" ,
output_range_getter_preconditions := [ ],
dual_operation := "UniversalMorphismIntoCoimageWithGivenCoimageObject" ,
dual_preprocessor_func := function ( cat , alpha, tau, I )
return NTuple( 4 , OppositeCategory( cat ), Opposite( alpha ), Pair( Opposite( tau[2 ] ), Opposite( tau[1 ] ) ), Opposite( I ) );
end ,
pre_function := function ( cat , morphism, test_factorization, image )
if not IsEqualForObjects( cat , Source( morphism ), Source( test_factorization[ 1 ] ) ) then
return [ false, "source of morphism and test factorization are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( morphism ), Range( test_factorization[ 2 ] ) ) then
return [ false, "range of morphism and test factorization are not equal" ];
fi ;
if not IsEqualForObjects( cat , Range( test_factorization[ 1 ] ), Source( test_factorization[ 2 ] ) ) then
return [ false, "source and range of test factorization are not equal" ];
fi ;
return [ true ];
end ,
return_type := "morphism" ),
KernelObjectFunctorial := rec(
filter_list := [ "category" , "morphism" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "mu" , "alphap" ],
return_type := "morphism" ,
output_source_getter_string := "KernelObject( cat, alpha )" ,
output_source_getter_preconditions := [ [ "KernelObject" , 1 ] ],
output_range_getter_string := "KernelObject( cat, alphap )" ,
output_range_getter_preconditions := [ [ "KernelObject" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "CokernelObjectFunctorial" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
KernelObjectFunctorialWithGivenKernelObjects := rec(
filter_list := [ "category" , "object" , "morphism" , "morphism" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "P" , "alpha" , "mu" , "alphap" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "CokernelObjectFunctorialWithGivenCokernelObjects" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
CokernelObjectFunctorial := rec(
filter_list := [ "category" , "morphism" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "mu" , "alphap" ],
return_type := "morphism" ,
output_source_getter_string := "CokernelObject( cat, alpha )" ,
output_source_getter_preconditions := [ [ "CokernelObject" , 1 ] ],
output_range_getter_string := "CokernelObject( cat, alphap )" ,
output_range_getter_preconditions := [ [ "CokernelObject" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "KernelObjectFunctorial" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
CokernelObjectFunctorialWithGivenCokernelObjects := rec(
filter_list := [ "category" , "object" , "morphism" , "morphism" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "P" , "alpha" , "mu" , "alphap" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "KernelObjectFunctorialWithGivenKernelObjects" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
TerminalObjectFunctorial := rec(
filter_list := [ "category" ],
input_arguments_names := [ "cat" ],
return_type := "morphism" ,
output_source_getter_string := "TerminalObject( cat )" ,
output_source_getter_preconditions := [ [ "TerminalObject" , 1 ] ],
output_range_getter_string := "TerminalObject( cat )" ,
output_range_getter_preconditions := [ [ "TerminalObject" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "InitialObjectFunctorial" ,
dual_arguments_reversed := true,
),
TerminalObjectFunctorialWithGivenTerminalObjects := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "P" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "InitialObjectFunctorialWithGivenInitialObjects" ,
dual_arguments_reversed := true,
),
InitialObjectFunctorial := rec(
filter_list := [ "category" ],
input_arguments_names := [ "cat" ],
return_type := "morphism" ,
output_source_getter_string := "InitialObject( cat )" ,
output_source_getter_preconditions := [ [ "InitialObject" , 1 ] ],
output_range_getter_string := "InitialObject( cat )" ,
output_range_getter_preconditions := [ [ "InitialObject" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "TerminalObjectFunctorial" ,
dual_arguments_reversed := true,
),
InitialObjectFunctorialWithGivenInitialObjects := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "P" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "TerminalObjectFunctorialWithGivenTerminalObjects" ,
dual_arguments_reversed := true,
),
DirectProductFunctorial := rec(
filter_list := [ "category" , "list_of_objects" , "list_of_morphisms" , "list_of_objects" ],
input_arguments_names := [ "cat" , "objects" , "L" , "objectsp" ],
return_type := "morphism" ,
output_source_getter_string := "DirectProduct( cat, objects )" ,
output_source_getter_preconditions := [ [ "DirectProduct" , 1 ] ],
output_range_getter_string := "DirectProduct( cat, objectsp )" ,
output_range_getter_preconditions := [ [ "DirectProduct" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "CoproductFunctorial" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := true,
),
DirectProductFunctorialWithGivenDirectProducts := rec(
filter_list := [ "category" , "object" , "list_of_objects" , "list_of_morphisms" , "list_of_objects" , "object" ],
input_arguments_names := [ "cat" , "P" , "objects" , "L" , "objectsp" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "CoproductFunctorialWithGivenCoproducts" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := true,
),
CoproductFunctorial := rec(
filter_list := [ "category" , "list_of_objects" , "list_of_morphisms" , "list_of_objects" ],
input_arguments_names := [ "cat" , "objects" , "L" , "objectsp" ],
return_type := "morphism" ,
output_source_getter_string := "Coproduct( cat, objects )" ,
output_source_getter_preconditions := [ [ "Coproduct" , 1 ] ],
output_range_getter_string := "Coproduct( cat, objectsp )" ,
output_range_getter_preconditions := [ [ "Coproduct" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "DirectProductFunctorial" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := true,
),
CoproductFunctorialWithGivenCoproducts := rec(
filter_list := [ "category" , "object" , "list_of_objects" , "list_of_morphisms" , "list_of_objects" , "object" ],
input_arguments_names := [ "cat" , "P" , "objects" , "L" , "objectsp" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "DirectProductFunctorialWithGivenDirectProducts" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := true,
),
DirectSumFunctorial := rec(
filter_list := [ "category" , "list_of_objects" , "list_of_morphisms" , "list_of_objects" ],
input_arguments_names := [ "cat" , "objects" , "L" , "objectsp" ],
return_type := "morphism" ,
output_source_getter_string := "DirectSum( cat, objects )" ,
output_source_getter_preconditions := [ [ "DirectSum" , 1 ] ],
output_range_getter_string := "DirectSum( cat, objectsp )" ,
output_range_getter_preconditions := [ [ "DirectSum" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "DirectSumFunctorial" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := true,
),
DirectSumFunctorialWithGivenDirectSums := rec(
filter_list := [ "category" , "object" , "list_of_objects" , "list_of_morphisms" , "list_of_objects" , "object" ],
input_arguments_names := [ "cat" , "P" , "objects" , "L" , "objectsp" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "DirectSumFunctorialWithGivenDirectSums" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := true,
),
EqualizerFunctorial := rec(
filter_list := [ "category" , "list_of_morphisms" , "morphism" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" , "mu" , "morphismsp" ],
return_type := "morphism" ,
output_source_getter_string := "Equalizer( cat, Source( mu ), morphisms )" ,
output_source_getter_preconditions := [ [ "Equalizer" , 1 ] ],
output_range_getter_string := "Equalizer( cat, Range( mu ), morphismsp )" ,
output_range_getter_preconditions := [ [ "Equalizer" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "CoequalizerFunctorial" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
EqualizerFunctorialWithGivenEqualizers := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "morphism" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "P" , "morphisms" , "mu" , "morphismsp" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "CoequalizerFunctorialWithGivenCoequalizers" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
CoequalizerFunctorial := rec(
filter_list := [ "category" , "list_of_morphisms" , "morphism" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" , "mu" , "morphismsp" ],
return_type := "morphism" ,
output_source_getter_string := "Coequalizer( cat, Source( mu ), morphisms )" ,
output_source_getter_preconditions := [ [ "Coequalizer" , 1 ] ],
output_range_getter_string := "Coequalizer( cat, Range( mu ), morphismsp )" ,
output_range_getter_preconditions := [ [ "Coequalizer" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "EqualizerFunctorial" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
CoequalizerFunctorialWithGivenCoequalizers := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "morphism" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "P" , "morphisms" , "mu" , "morphismsp" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "EqualizerFunctorialWithGivenEqualizers" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
FiberProductFunctorial := rec(
filter_list := [ "category" , "list_of_morphisms" , "list_of_morphisms" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" , "L" , "morphismsp" ],
return_type := "morphism" ,
output_source_getter_string := "FiberProduct( cat, morphisms )" ,
output_source_getter_preconditions := [ [ "FiberProduct" , 1 ] ],
output_range_getter_string := "FiberProduct( cat, morphismsp )" ,
output_range_getter_preconditions := [ [ "FiberProduct" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "PushoutFunctorial" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
FiberProductFunctorialWithGivenFiberProducts := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "list_of_morphisms" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "P" , "morphisms" , "L" , "morphismsp" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "PushoutFunctorialWithGivenPushouts" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
PushoutFunctorial := rec(
filter_list := [ "category" , "list_of_morphisms" , "list_of_morphisms" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "morphisms" , "L" , "morphismsp" ],
return_type := "morphism" ,
output_source_getter_string := "Pushout( cat, morphisms )" ,
output_source_getter_preconditions := [ [ "Pushout" , 1 ] ],
output_range_getter_string := "Pushout( cat, morphismsp )" ,
output_range_getter_preconditions := [ [ "Pushout" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "FiberProductFunctorial" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
PushoutFunctorialWithGivenPushouts := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" , "list_of_morphisms" , "list_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "P" , "morphisms" , "L" , "morphismsp" , "Pp" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Pp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "FiberProductFunctorialWithGivenFiberProducts" ,
dual_arguments_reversed := true,
compatible_with_congruence_of_morphisms := false,
),
ImageObjectFunctorial := rec(
filter_list := [ "category" , "morphism" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "nu" , "alphap" ],
return_type := "morphism" ,
output_source_getter_string := "ImageObject( cat, alpha )" ,
output_source_getter_preconditions := [ [ "ImageObject" , 1 ] ],
output_range_getter_string := "ImageObject( cat, alphap )" ,
output_range_getter_preconditions := [ [ "ImageObject" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "CoimageObjectFunctorial" ,
dual_arguments_reversed := true,
),
ImageObjectFunctorialWithGivenImageObjects := rec(
filter_list := [ "category" , "object" , "morphism" , "morphism" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "I" , "alpha" , "nu" , "alphap" , "Ip" ],
output_source_getter_string := "I" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Ip" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "CoimageObjectFunctorialWithGivenCoimageObjects" ,
dual_arguments_reversed := true,
),
CoimageObjectFunctorial := rec(
filter_list := [ "category" , "morphism" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "mu" , "alphap" ],
return_type := "morphism" ,
output_source_getter_string := "CoimageObject( cat, alpha )" ,
output_source_getter_preconditions := [ [ "CoimageObject" , 1 ] ],
output_range_getter_string := "CoimageObject( cat, alphap )" ,
output_range_getter_preconditions := [ [ "CoimageObject" , 1 ] ],
with_given_object_position := "both" ,
dual_operation := "ImageObjectFunctorial" ,
dual_arguments_reversed := true,
),
CoimageObjectFunctorialWithGivenCoimageObjects := rec(
filter_list := [ "category" , "object" , "morphism" , "morphism" , "morphism" , "object" ],
input_arguments_names := [ "cat" , "C" , "alpha" , "mu" , "alphap" , "Cp" ],
output_source_getter_string := "C" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Cp" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "ImageObjectFunctorialWithGivenImageObjects" ,
dual_arguments_reversed := true,
),
HorizontalPreCompose := rec(
filter_list := [ "category" , "twocell" , "twocell" ],
dual_operation := "HorizontalPostCompose" ,
pre_function := function ( cat , twocell_1, twocell_2 )
if not IsEqualForObjects( cat , Range( Source( twocell_1 ) ), Source( Source( twocell_2 ) ) ) then
return [ false, "2-cells are not horizontally composable" ];
fi ;
return [ true ];
end ,
return_type := "twocell" ),
HorizontalPostCompose := rec(
filter_list := [ "category" , "twocell" , "twocell" ],
dual_operation := "HorizontalPreCompose" ,
pre_function := function ( cat , twocell_2, twocell_1 )
if not IsEqualForObjects( cat , Range( Source( twocell_1 ) ), Source( Source( twocell_2 ) ) ) then
return [ false, "2-cells are not horizontally composable" ];
fi ;
return [ true ];
end ,
return_type := "twocell" ),
VerticalPreCompose := rec(
filter_list := [ "category" , "twocell" , "twocell" ],
dual_operation := "VerticalPostCompose" ,
pre_function := function ( cat , twocell_1, twocell_2 )
if not IsEqualForMorphisms( Range( twocell_1 ), Source( twocell_2 ) ) then
return [ false, "2-cells are not vertically composable" ];
fi ;
return [ true ];
end ,
return_type := "twocell" ),
VerticalPostCompose := rec(
filter_list := [ "category" , "twocell" , "twocell" ],
dual_operation := "VerticalPreCompose" ,
pre_function := function ( cat , twocell_2, twocell_1 )
if not IsEqualForMorphisms( Range( twocell_1 ), Source( twocell_2 ) ) then
return [ false, "2-cells are not vertically composable" ];
fi ;
return [ true ];
end ,
return_type := "twocell" ),
IdentityTwoCell := rec(
filter_list := [ "category" , "morphism" ],
dual_operation := "IdentityTwoCell" ,
return_type := "twocell" ),
IsWellDefinedForTwoCells := rec(
filter_list := [ "category" , "twocell" ],
dual_operation := "IsWellDefinedForTwoCells" ,
redirect_function := function ( cat , twocell )
if not( IsWellDefined( Source( twocell ) ) and IsWellDefined( Range( twocell ) ) ) then
return [ true, false ];
fi ;
return [ false ];
end ,
return_type := "bool" ),
JointPairwiseDifferencesOfMorphismsIntoDirectProduct := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "A" , "D" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "JointPairwiseDifferencesOfMorphismsFromCoproduct" ,
),
IsomorphismFromFiberProductToEqualizerOfDirectProductDiagram := rec(
filter_list := [ "category" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromCoequalizerOfCoproductDiagramToPushout" ,
),
IsomorphismFromEqualizerOfDirectProductDiagramToFiberProduct := rec(
filter_list := [ "category" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromPushoutToCoequalizerOfCoproductDiagram" ,
),
IsomorphismFromPushoutToCoequalizerOfCoproductDiagram := rec(
filter_list := [ "category" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromEqualizerOfDirectProductDiagramToFiberProduct" ,
),
IsomorphismFromCoequalizerOfCoproductDiagramToPushout := rec(
filter_list := [ "category" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromFiberProductToEqualizerOfDirectProductDiagram" ,
),
IsomorphismFromImageObjectToKernelOfCokernel := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromCokernelOfKernelToCoimage" ,
),
IsomorphismFromKernelOfCokernelToImageObject := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromCoimageToCokernelOfKernel" ,
),
IsomorphismFromCoimageToCokernelOfKernel := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromKernelOfCokernelToImageObject" ,
),
IsomorphismFromCokernelOfKernelToCoimage := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromImageObjectToKernelOfCokernel" ,
),
IsomorphismFromDirectSumToDirectProduct := rec(
filter_list := [ "category" , "list_of_objects" ],
input_arguments_names := [ "cat" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromCoproductToDirectSum" ,
),
IsomorphismFromDirectSumToCoproduct := rec(
filter_list := [ "category" , "list_of_objects" ],
input_arguments_names := [ "cat" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromDirectProductToDirectSum" ,
),
IsomorphismFromDirectProductToDirectSum := rec(
filter_list := [ "category" , "list_of_objects" ],
input_arguments_names := [ "cat" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromDirectSumToCoproduct" ,
),
IsomorphismFromCoproductToDirectSum := rec(
filter_list := [ "category" , "list_of_objects" ],
input_arguments_names := [ "cat" , "D" ],
return_type := "morphism" ,
dual_operation := "IsomorphismFromDirectSumToDirectProduct" ,
),
JointPairwiseDifferencesOfMorphismsFromCoproduct := rec(
filter_list := [ "category" , "object" , "list_of_morphisms" ],
input_arguments_names := [ "cat" , "A" , "D" ],
output_range_getter_string := "A" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "JointPairwiseDifferencesOfMorphismsIntoDirectProduct" ,
),
SomeProjectiveObject := rec(
filter_list := [ "category" , "object" ],
return_type := "object" ,
dual_operation := "SomeInjectiveObject" ,
is_merely_set_theoretic := true ),
EpimorphismFromSomeProjectiveObject := rec(
filter_list := [ "category" , "object" ],
input_arguments_names := [ "cat" , "A" ],
output_range_getter_string := "A" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "MonomorphismIntoSomeInjectiveObject" ,
is_merely_set_theoretic := true ),
EpimorphismFromSomeProjectiveObjectWithGivenSomeProjectiveObject := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "A" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "A" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "MonomorphismIntoSomeInjectiveObjectWithGivenSomeInjectiveObject" ,
is_merely_set_theoretic := true ),
SomeInjectiveObject := rec(
filter_list := [ "category" , "object" ],
return_type := "object" ,
dual_operation := "SomeProjectiveObject" ,
is_merely_set_theoretic := true ),
MonomorphismIntoSomeInjectiveObject := rec(
filter_list := [ "category" , "object" ],
input_arguments_names := [ "cat" , "A" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "EpimorphismFromSomeProjectiveObject" ,
is_merely_set_theoretic := true ),
MonomorphismIntoSomeInjectiveObjectWithGivenSomeInjectiveObject := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "A" , "I" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "I" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "EpimorphismFromSomeProjectiveObjectWithGivenSomeProjectiveObject" ,
is_merely_set_theoretic := true ),
ComponentOfMorphismIntoDirectSum := rec(
filter_list := [ "category" , "morphism" , "list_of_objects" , "integer" ],
input_arguments_names := [ "cat" , "alpha" , "S" , "i" ],
output_source_getter_string := "Source( alpha )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "S[i]" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "ComponentOfMorphismFromDirectSum" ),
ComponentOfMorphismFromDirectSum := rec(
filter_list := [ "category" , "morphism" , "list_of_objects" , "integer" ],
input_arguments_names := [ "cat" , "alpha" , "S" , "i" ],
output_source_getter_string := "S[i]" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( alpha )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "ComponentOfMorphismIntoDirectSum" ),
MorphismBetweenDirectSums := rec(
filter_list := [ "category" , "list_of_objects" , "list_of_lists_of_morphisms" , "list_of_objects" ],
input_arguments_names := [ "cat" , "source_diagram" , "mat" , "range_diagram" ],
return_type := "morphism" ,
output_source_getter_string := "DirectSum( cat, source_diagram )" ,
output_source_getter_preconditions := [ [ "DirectSum" , 1 ] ],
output_range_getter_string := "DirectSum( cat, range_diagram )" ,
output_range_getter_preconditions := [ [ "DirectSum" , 1 ] ],
with_given_object_position := "both" ,
pre_function := function ( cat , source_diagram, listlist, range_diagram )
local i, j;
if Length( listlist ) <> Length( source_diagram ) then
return [ false, "the number of rows does not match the length of the source diagram" ];
fi ;
for i in [ 1 .. Length( listlist ) ] do
if Length( listlist[i] ) <> Length( range_diagram ) then
return [ false, Concatenation( "the " , String(i), ". row has not the same length as the range diagram" ) ];
fi ;
for j in [ 1 .. Length( range_diagram ) ] do
if not IsEqualForObjects( cat , source_diagram[i], Source( listlist[i][j] ) ) then
return [ false, Concatenation( "the sources of the morphisms in the " , String(i), ". row must be equal to the " , String(i), ". entry of the source diagram" ) ];
fi ;
if not IsEqualForObjects( cat , range_diagram[j], Range( listlist[i][j] ) ) then
return [ false, Concatenation( "the ranges of the morphisms in the " , String(j), ". column must be equal to the " , String(j), ". entry of the range diagram" ) ];
fi ;
od;
od;
return [ true ];
end ,
dual_operation := "MorphismBetweenDirectSums" ,
dual_preprocessor_func := function ( arg )
local list;
list := CAP_INTERNAL_OPPOSITE_RECURSIVE( arg );
return NTuple( 4 , list[1 ], list[4 ], TransposedMatWithGivenDimensions( Length( list[2 ] ), Length( list[4 ] ), list[3 ] ), list[2 ] );
end
),
MorphismBetweenDirectSumsWithGivenDirectSums := rec(
filter_list := [ "category" , "object" , "list_of_objects" , "list_of_lists_of_morphisms" , "list_of_objects" , "object" ],
input_arguments_names := [ "cat" , "S" , "source_diagram" , "mat" , "range_diagram" , "T" ],
output_source_getter_string := "S" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "T" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "MorphismBetweenDirectSumsWithGivenDirectSums" ,
dual_preprocessor_func := function ( arg )
local list;
list := CAP_INTERNAL_OPPOSITE_RECURSIVE( arg );
return NTuple( 6 , list[1 ], list[6 ], list[5 ], TransposedMatWithGivenDimensions( Length( list[3 ] ), Length( list[5 ] ), list[4 ] ), list[3 ], list[2 ] );
end
),
IsHomSetInhabited := rec(
filter_list := [ "category" , "object" , "object" ],
return_type := "bool" ,
dual_operation := "IsHomSetInhabited" ,
dual_arguments_reversed := true,
),
HomomorphismStructureOnObjects := rec(
filter_list := [ "category" , "object" , "object" ],
return_type := "object_in_range_category_of_homomorphism_structure" ,
dual_operation := "HomomorphismStructureOnObjects" ,
dual_arguments_reversed := true,
dual_postprocessor_func := IdFunc
),
HomomorphismStructureOnMorphisms := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
output_source_getter_string := "HomomorphismStructureOnObjects( cat, Range( alpha ), Source( beta ) )" ,
output_source_getter_preconditions := [ [ "HomomorphismStructureOnObjects" , 1 ] ],
output_range_getter_string := "HomomorphismStructureOnObjects( cat, Source( alpha ), Range( beta ) )" ,
output_range_getter_preconditions := [ [ "HomomorphismStructureOnObjects" , 1 ] ],
with_given_object_position := "both" ,
return_type := "morphism_in_range_category_of_homomorphism_structure" ,
dual_operation := "HomomorphismStructureOnMorphisms" ,
dual_preprocessor_func := function ( cat , alpha, beta )
return Triple( OppositeCategory( cat ), Opposite( beta ), Opposite( alpha ) );
end ,
dual_postprocessor_func := IdFunc,
),
HomomorphismStructureOnMorphismsWithGivenObjects := rec(
filter_list := [ "category" , "object_in_range_category_of_homomorphism_structure" , "morphism" , "morphism" , "object_in_range_category_of_homomorphism_structure" ],
input_arguments_names := [ "cat" , "source" , "alpha" , "beta" , "range" ],
output_source_getter_string := "source" ,
output_range_getter_string := "range" ,
return_type := "morphism_in_range_category_of_homomorphism_structure" ,
dual_operation := "HomomorphismStructureOnMorphismsWithGivenObjects" ,
dual_preprocessor_func := function ( cat , source, alpha, beta, range )
return NTuple( 5 , OppositeCategory( cat ), source, Opposite( beta ), Opposite( alpha ), range );
end ,
dual_postprocessor_func := IdFunc,
),
DistinguishedObjectOfHomomorphismStructure := rec(
filter_list := [ "category" ],
return_type := "object_in_range_category_of_homomorphism_structure" ,
dual_operation := "DistinguishedObjectOfHomomorphismStructure" ,
dual_postprocessor_func := IdFunc ),
InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
output_source_getter_string := "DistinguishedObjectOfHomomorphismStructure( cat )" ,
output_source_getter_preconditions := [ [ "DistinguishedObjectOfHomomorphismStructure" , 1 ] ],
output_range_getter_string := "HomomorphismStructureOnObjects( cat, Source( alpha ), Range( alpha ) )" ,
output_range_getter_preconditions := [ [ "HomomorphismStructureOnObjects" , 1 ] ],
with_given_object_position := "both" ,
return_type := "morphism_in_range_category_of_homomorphism_structure" ,
dual_operation := "InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure" ,
dual_postprocessor_func := IdFunc
),
InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructureWithGivenObjects := rec(
filter_list := [ "category" , "object_in_range_category_of_homomorphism_structure" , "morphism" , "object_in_range_category_of_homomorphism_structure" ],
input_arguments_names := [ "cat" , "source" , "alpha" , "range" ],
return_type := "morphism_in_range_category_of_homomorphism_structure" ,
output_source_getter_string := "source" ,
output_range_getter_string := "range" ,
dual_operation := "InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructureWithGivenObjects" ,
dual_preprocessor_func := function ( cat , distinguished_object, alpha, hom_source_range )
return NTuple( 4 , OppositeCategory( cat ), distinguished_object, Opposite( alpha ), hom_source_range );
end ,
dual_postprocessor_func := IdFunc
),
InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism := rec(
filter_list := [ "category" , "object" , "object" , "morphism_in_range_category_of_homomorphism_structure" ],
input_arguments_names := [ "cat" , "source" , "range" , "alpha" ],
return_type := "morphism" ,
output_source_getter_string := "source" ,
output_range_getter_string := "range" ,
dual_operation := "InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism" ,
dual_preprocessor_func := function ( cat , A, B, morphism )
return NTuple( 4 , OppositeCategory( cat ), Opposite( B ), Opposite( A ), morphism );
end
),
SolveLinearSystemInAbCategory := rec(
filter_list := [ "category" , "list_of_lists_of_morphisms" , "list_of_lists_of_morphisms" , "list_of_morphisms" ],
return_type := "list_of_morphisms" ,
pre_function := function ( cat , left_coeffs, right_coeffs, rhs )
if not Length( left_coeffs ) > 0 then
return [ false, "the list of left coefficients is empty" ];
fi ;
if not Length( left_coeffs ) = Length( right_coeffs ) then
return [ false, "the list of left coefficients and the list of right coefficients do not have the same length" ];
fi ;
if not Length( left_coeffs ) = Length( rhs ) then
return [ false, "the list of left coefficients does not have the same length as the right hand side" ];
fi ;
if not ForAll( Concatenation( left_coeffs, right_coeffs ), x -> IsList( x ) and Length( x ) = Length( left_coeffs[1 ] ) ) then
return [ false, "the left coefficients and the right coefficients must be given by lists of lists of the same length containing morphisms in the current category" ];
fi ;
return [ true ];
end ,
pre_function_full := function ( cat , left_coeffs, right_coeffs, rhs )
local nr_columns_left, nr_columns_right;
if not ForAll( [ 1 .. Length( left_coeffs ) ], i -> ForAll( left_coeffs[i], coeff -> IsEqualForObjects( cat , Source( coeff ), Source( rhs[i] ) ) <> false ) ) then
return [ false, "the sources of the left coefficients must correspond to the sources of the right hand side" ];
fi ;
if not ForAll( [ 1 .. Length( right_coeffs ) ], i -> ForAll( right_coeffs[i], coeff -> IsEqualForObjects( cat , Range( coeff ), Range( rhs[i] ) ) <> false ) ) then
return [ false, "the ranges of the right coefficients must correspond to the ranges of the right hand side" ];
fi ;
nr_columns_left := Length( left_coeffs[1 ] );
if not ForAll( [ 1 .. nr_columns_left ], j -> ForAll( left_coeffs, x -> IsEqualForObjects( cat , Range( x[j] ), Range( left_coeffs[1 ][j] ) ) <> false ) ) then
return [ false, "all ranges in a column of the left coefficients must be equal" ];
fi ;
nr_columns_right := Length( right_coeffs[1 ] );
if not ForAll( [ 1 .. nr_columns_right ], j -> ForAll( right_coeffs, x -> IsEqualForObjects( cat , Source( x[j] ), Source( right_coeffs[1 ][j] ) ) <> false ) ) then
return [ false, "all sources in a column of the right coefficients must be equal" ];
fi ;
return [ true ];
end ,
),
MereExistenceOfSolutionOfLinearSystemInAbCategory := rec(
filter_list := [ "category" , "list_of_lists_of_morphisms" , "list_of_lists_of_morphisms" , "list_of_morphisms" ],
return_type := "bool" ,
pre_function := "SolveLinearSystemInAbCategory" ,
pre_function_full := "SolveLinearSystemInAbCategory"
),
MereExistenceOfUniqueSolutionOfLinearSystemInAbCategory := rec(
filter_list := [ "category" , "list_of_lists_of_morphisms" , "list_of_lists_of_morphisms" , "list_of_morphisms" ],
return_type := "bool" ,
pre_function := "SolveLinearSystemInAbCategory" ,
pre_function_full := "SolveLinearSystemInAbCategory"
),
MereExistenceOfUniqueSolutionOfHomogeneousLinearSystemInAbCategory := rec(
filter_list := [ "category" , "list_of_lists_of_morphisms" , "list_of_lists_of_morphisms" ],
return_type := "bool" ,
pre_function := "BasisOfSolutionsOfHomogeneousLinearSystemInLinearCategory" ,
pre_function_full := "BasisOfSolutionsOfHomogeneousLinearSystemInLinearCategory"
),
BasisOfSolutionsOfHomogeneousLinearSystemInLinearCategory := rec(
filter_list := [ "category" , "list_of_lists_of_morphisms" , "list_of_lists_of_morphisms" ],
return_type := "list_of_lists_of_morphisms" ,
pre_function := function ( cat , left_coeffs, right_coeffs )
if not Length( left_coeffs ) > 0 then
return [ false, "the list of left coefficients is empty" ];
fi ;
if not Length( left_coeffs ) = Length( right_coeffs ) then
return [ false, "the list of left coefficients and the list of right coefficients do not have the same length" ];
fi ;
if not ForAll( Concatenation( left_coeffs, right_coeffs ), x -> IsList( x ) and Length( x ) = Length( left_coeffs[1 ] ) ) then
return [ false, "the left coefficients and the right coefficients must be given by lists of lists of morphisms of the same length" ];
fi ;
return [ true ];
end ,
pre_function_full := function ( cat , left_coeffs, right_coeffs )
local nr_columns_left, nr_columns_right;
nr_columns_left := Length( left_coeffs[1 ] );
if not ForAll( [ 1 .. nr_columns_left ],
j -> ForAll( left_coeffs, x -> IsEqualForObjects( cat , Target( x[j] ), Target( left_coeffs[1 ][j] ) ) <> false ) ) then
return [ false, "all targets in any column of the left coefficients must be equal" ];
fi ;
nr_columns_right := Length( right_coeffs[1 ] );
if not ForAll( [ 1 .. nr_columns_right ],
j -> ForAll( right_coeffs, x -> IsEqualForObjects( cat , Source( x[j] ), Source( right_coeffs[1 ][j] ) ) <> false ) ) then
return [ false, "all sources in any column of the right coefficients must be equal" ];
fi ;
return [ true ];
end ,
),
BasisOfSolutionsOfHomogeneousDoubleLinearSystemInLinearCategory := rec(
filter_list := [ "category" , "list_of_lists_of_morphisms" , "list_of_lists_of_morphisms" , "list_of_lists_of_morphisms" , "list_of_lists_of_morphisms" ],
return_type := "list_of_lists_of_morphisms" ,
),
MorphismsOfExternalHom := rec(
filter_list := [ "category" , "object" , "object" ],
return_type := "list_of_morphisms" ,
dual_operation := "MorphismsOfExternalHom" ,
dual_arguments_reversed := true
),
BasisOfExternalHom := rec(
filter_list := [ "category" , "object" , "object" ],
return_type := "list_of_morphisms" ,
dual_operation := "BasisOfExternalHom" ,
dual_arguments_reversed := true
),
CoefficientsOfMorphism := rec(
filter_list := [ "category" , "morphism" ],
return_type := "list_of_elements_of_commutative_ring_of_linear_structure" ,
dual_operation := "CoefficientsOfMorphism" ,
dual_postprocessor_func := IdFunc
),
RandomObjectByInteger := rec(
filter_list := [ "category" , "integer" ],
input_arguments_names := [ "cat" , "n" ],
return_type := "object" ,
dual_operation := "RandomObjectByInteger" ,
),
RandomMorphismByInteger := rec(
filter_list := [ "category" , "integer" ],
input_arguments_names := [ "cat" , "n" ],
return_type := "morphism" ,
dual_operation := "RandomMorphismByInteger" ,
),
RandomMorphismWithFixedSourceByInteger := rec(
filter_list := [ "category" , "object" , "integer" ],
input_arguments_names := [ "cat" , "A" , "n" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "RandomMorphismWithFixedRangeByInteger" ,
),
RandomMorphismWithFixedRangeByInteger := rec(
filter_list := [ "category" , "object" , "integer" ],
input_arguments_names := [ "cat" , "B" , "n" ],
output_range_getter_string := "B" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "RandomMorphismWithFixedSourceByInteger" ,
),
RandomMorphismWithFixedSourceAndRangeByInteger := rec(
filter_list := [ "category" , "object" , "object" , "integer" ],
input_arguments_names := [ "cat" , "A" , "B" , "n" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "B" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "RandomMorphismWithFixedSourceAndRangeByInteger" ,
dual_preprocessor_func := function ( cat , A, B, n )
return NTuple( 4 , OppositeCategory( cat ), Opposite( B ), Opposite( A ), n );
end
),
RandomObjectByList := rec(
filter_list := [ "category" , "arbitrary_list" ],
input_arguments_names := [ "cat" , "L" ],
return_type := "object"
),
RandomMorphismByList := rec(
filter_list := [ "category" , "arbitrary_list" ],
input_arguments_names := [ "cat" , "L" ],
return_type := "morphism"
),
RandomMorphismWithFixedSourceByList := rec(
filter_list := [ "category" , "object" , "arbitrary_list" ],
input_arguments_names := [ "cat" , "A" , "L" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
),
RandomMorphismWithFixedRangeByList := rec(
filter_list := [ "category" , "object" , "arbitrary_list" ],
input_arguments_names := [ "cat" , "B" , "L" ],
output_range_getter_string := "B" ,
output_range_getter_preconditions := [ ],
return_type := "morphism"
),
RandomMorphismWithFixedSourceAndRangeByList := rec(
filter_list := [ "category" , "object" , "object" , "arbitrary_list" ],
input_arguments_names := [ "cat" , "A" , "B" , "L" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "B" ,
output_range_getter_preconditions := [ ],
return_type := "morphism"
),
HomologyObject := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
return_type := "object" ,
pre_function := function ( cat , alpha, beta )
if not IsEqualForObjects( cat , Range( alpha ), Source( beta ) ) then
return [ false, "the range of the first morphism has to be equal to the source of the second morphism" ];
fi ;
return [ true ];
end ,
dual_operation := "HomologyObject" ,
dual_arguments_reversed := true
),
HomologyObjectFunctorialWithGivenHomologyObjects := rec(
filter_list := [ "category" , "object" , "5_tuple_of_morphisms" , "object" ],
input_arguments_names := [ "cat" , "H_1" , "L" , "H_2" ],
return_type := "morphism" ,
pre_function := function ( cat , H_1, L, H2 )
local alpha, beta, epsilon, gamma, delta;
alpha := L[1 ];
beta := L[2 ];
epsilon := L[3 ];
gamma := L[4 ];
delta := L[5 ];
if not IsEqualForObjects( cat , Range( alpha ), Source( beta ) ) then
return [ false, "the range of the first morphism has to be equal to the source of the second morphism" ];
fi ;
if not IsEqualForObjects( cat , Range( gamma ), Source( delta ) ) then
return [ false, "the range of the fourth morphism has to be equal to the source of the fifth morphism" ];
fi ;
if not IsEqualForObjects( cat , Source( epsilon ), Source( beta ) ) then
return [ false, "the source of the third morphism has to be equal to the source of the second morphism" ];
fi ;
if not IsEqualForObjects( cat , Range( epsilon ), Range( gamma ) ) then
return [ false, "the range of the third morphism has to be equal to the range of the fourth morphism" ];
fi ;
return [ true ];
end ,
dual_operation := "HomologyObjectFunctorialWithGivenHomologyObjects" ,
dual_preprocessor_func := function ( arg )
local list;
list := CAP_INTERNAL_OPPOSITE_RECURSIVE( arg );
return NTuple( 4 , list[1 ], list[4 ], Reversed( list[3 ] ), list[2 ] );
end
),
IsomorphismFromHomologyObjectToItsConstructionAsAnImageObject := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
return_type := "morphism" ),
IsomorphismFromItsConstructionAsAnImageObjectToHomologyObject := rec(
filter_list := [ "category" , "morphism" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" , "beta" ],
return_type := "morphism" ),
## SimplifyObject*
SimplifyObject := rec(
filter_list := [ "category" , "object" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "A" , "n" ],
return_type := "object" ,
dual_operation := "SimplifyObject" ,
redirect_function := function ( cat , A, n )
if n = 0 then
return [ true, A ];
fi ;
return [ false ];
end ,
pre_function := function ( cat , A, n )
if not ( IsPosInt( n ) or IsInfinity( n ) ) then
return [ false, "the second argument must be a non-negative integer or infinity" ];
fi ;
return [ true ];
end
),
SimplifyObject_IsoFromInputObject := rec(
filter_list := [ "category" , "object" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "A" , "n" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifyObject_IsoToInputObject" ,
redirect_function := function ( cat , A, n )
if n = 0 then
return [ true, IdentityMorphism( A ) ];
fi ;
return [ false ];
end ,
pre_function := "SimplifyObject"
),
SimplifyObject_IsoToInputObject := rec(
filter_list := [ "category" , "object" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "A" , "n" ],
output_range_getter_string := "A" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifyObject_IsoFromInputObject" ,
redirect_function := "SimplifyObject_IsoFromInputObject" ,
pre_function := "SimplifyObject"
),
## SimplifyMorphism
SimplifyMorphism := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_source_getter_string := "Source( mor )" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "Range( mor )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifyMorphism" ,
redirect_function := "SimplifyObject" ,
pre_function := "SimplifyObject"
),
## SimplifySource*
SimplifySource := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_range_getter_string := "Range( mor )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifyRange" ,
redirect_function := "SimplifyObject" ,
pre_function := "SimplifyObject"
),
SimplifySource_IsoToInputObject := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_range_getter_string := "Source( mor )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifyRange_IsoFromInputObject" ,
redirect_function := function ( cat , alpha, n )
if n = 0 then
return [ true, IdentityMorphism( Source( alpha ) ) ];
fi ;
return [ false ];
end ,
pre_function := "SimplifyObject"
),
SimplifySource_IsoFromInputObject := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_source_getter_string := "Source( mor )" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifyRange_IsoToInputObject" ,
redirect_function := "SimplifySource_IsoToInputObject" ,
pre_function := "SimplifyObject"
),
## SimplifyRange*
SimplifyRange := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_source_getter_string := "Source( mor )" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifySource" ,
redirect_function := "SimplifyObject" ,
pre_function := "SimplifyObject"
),
SimplifyRange_IsoToInputObject := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_range_getter_string := "Range( mor )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifySource_IsoFromInputObject" ,
redirect_function := function ( cat , alpha, n )
if n = 0 then
return [ true, IdentityMorphism( Range( alpha ) ) ];
fi ;
return [ false ];
end ,
pre_function := "SimplifyObject"
),
SimplifyRange_IsoFromInputObject := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_source_getter_string := "Range( mor )" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifySource_IsoToInputObject" ,
redirect_function := "SimplifySource_IsoToInputObject" ,
pre_function := "SimplifyObject"
),
## SimplifySourceAndRange*
SimplifySourceAndRange := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
return_type := "morphism" ,
dual_operation := "SimplifySourceAndRange" ,
redirect_function := "SimplifyObject" ,
pre_function := "SimplifyObject"
),
SimplifySourceAndRange_IsoToInputSource := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_range_getter_string := "Source( mor )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifySourceAndRange_IsoFromInputRange" ,
redirect_function := "SimplifySource_IsoToInputObject" ,
pre_function := "SimplifyObject"
),
SimplifySourceAndRange_IsoFromInputSource := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_source_getter_string := "Source( mor )" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifySourceAndRange_IsoToInputRange" ,
redirect_function := "SimplifySource_IsoToInputObject" ,
pre_function := "SimplifyObject"
),
SimplifySourceAndRange_IsoToInputRange := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_range_getter_string := "Range( mor )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifySourceAndRange_IsoFromInputSource" ,
redirect_function := "SimplifySource_IsoToInputObject" ,
pre_function := "SimplifyObject"
),
SimplifySourceAndRange_IsoFromInputRange := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_source_getter_string := "Range( mor )" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifySourceAndRange_IsoToInputSource" ,
redirect_function := "SimplifySource_IsoToInputObject" ,
pre_function := "SimplifyObject"
),
## SimplifyEndo*
SimplifyEndo := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
return_type := "morphism" ,
dual_operation := "SimplifyEndo" ,
redirect_function := "SimplifyObject" ,
pre_function := function ( cat , endo, n )
if not ( IsPosInt( n ) or IsInfinity( n ) ) then
return [ false, "the second argument must be a non-negative integer or infinity" ];
fi ;
if not IsEndomorphism( endo ) then
return [ false, "the first argument must be an endomorphism" ];
fi ;
return [ true ];
end
),
SimplifyEndo_IsoFromInputObject := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_source_getter_string := "Source( mor )" ,
output_source_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifyEndo_IsoToInputObject" ,
redirect_function := "SimplifySource_IsoToInputObject" ,
pre_function := "SimplifyEndo"
),
SimplifyEndo_IsoToInputObject := rec(
filter_list := [ "category" , "morphism" , "nonneg_integer_or_infinity" ],
input_arguments_names := [ "cat" , "mor" , "n" ],
output_range_getter_string := "Range( mor )" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "SimplifyEndo_IsoFromInputObject" ,
redirect_function := "SimplifySource_IsoToInputObject" ,
pre_function := "SimplifyEndo"
),
SomeReductionBySplitEpiSummand := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
return_type := "morphism" ,
),
SomeReductionBySplitEpiSummand_MorphismToInputRange := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
return_type := "morphism" ,
),
SomeReductionBySplitEpiSummand_MorphismFromInputRange := rec(
filter_list := [ "category" , "morphism" ],
input_arguments_names := [ "cat" , "alpha" ],
return_type := "morphism" ,
),
ProjectiveDimension := rec(
filter_list := [ "category" , "object" ],
return_type := "nonneg_integer_or_infinity" ,
dual_operation := "InjectiveDimension" ,
),
InjectiveDimension := rec(
filter_list := [ "category" , "object" ],
return_type := "nonneg_integer_or_infinity" ,
dual_operation := "ProjectiveDimension" ,
),
AdditiveGenerators := rec(
filter_list := [ "category" ],
return_type := "list_of_objects" ,
dual_operation := "AdditiveGenerators" ,
),
IndecomposableProjectiveObjects := rec(
filter_list := [ "category" ],
return_type := "list_of_objects" ,
dual_operation := "IndecomposableInjectiveObjects" ,
),
IndecomposableInjectiveObjects := rec(
filter_list := [ "category" ],
return_type := "list_of_objects" ,
dual_operation := "IndecomposableProjectiveObjects" ,
),
ProjectiveCoverObject := rec(
filter_list := [ "category" , "object" ],
return_type := "object" ,
dual_operation := "InjectiveEnvelopeObject" ,
is_merely_set_theoretic := true ),
EpimorphismFromProjectiveCoverObject := rec(
filter_list := [ "category" , "object" ],
input_arguments_names := [ "cat" , "A" ],
output_range_getter_string := "A" ,
output_range_getter_preconditions := [ ],
with_given_object_position := "Source" ,
return_type := "morphism" ,
dual_operation := "MonomorphismIntoInjectiveEnvelopeObject" ,
is_merely_set_theoretic := true ),
EpimorphismFromProjectiveCoverObjectWithGivenProjectiveCoverObject := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "A" , "P" ],
output_source_getter_string := "P" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "A" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "MonomorphismIntoInjectiveEnvelopeObjectWithGivenInjectiveEnvelopeObject" ,
is_merely_set_theoretic := true ),
InjectiveEnvelopeObject := rec(
filter_list := [ "category" , "object" ],
return_type := "object" ,
dual_operation := "ProjectiveCoverObject" ,
is_merely_set_theoretic := true ),
MonomorphismIntoInjectiveEnvelopeObject := rec(
filter_list := [ "category" , "object" ],
input_arguments_names := [ "cat" , "A" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
with_given_object_position := "Range" ,
return_type := "morphism" ,
dual_operation := "EpimorphismFromProjectiveCoverObject" ,
is_merely_set_theoretic := true ),
MonomorphismIntoInjectiveEnvelopeObjectWithGivenInjectiveEnvelopeObject := rec(
filter_list := [ "category" , "object" , "object" ],
input_arguments_names := [ "cat" , "A" , "I" ],
output_source_getter_string := "A" ,
output_source_getter_preconditions := [ ],
output_range_getter_string := "I" ,
output_range_getter_preconditions := [ ],
return_type := "morphism" ,
dual_operation := "EpimorphismFromProjectiveCoverObjectWithGivenProjectiveCoverObject" ,
is_merely_set_theoretic := true ),
) );
BindGlobal( "CAP_INTERNAL_METHOD_NAME_RECORD_LIMITS" , [
rec(
object_specification := [ "varobject" ],
morphism_specification := [ ],
limit_object_name := "DirectProduct" ,
colimit_object_name := "Coproduct" ,
),
rec(
object_specification := [ "varobject" ],
morphism_specification := [ ],
limit_object_name := "DirectSum" ,
colimit_object_name := "DirectSum" ,
),
rec(
object_specification := [ "fixedobject" , "varobject" ],
morphism_specification := [ [ 2 , "varmorphism" , 1 ] ],
limit_object_name := "FiberProduct" ,
colimit_object_name := "Pushout" ,
),
rec(
object_specification := [ "fixedobject" , "fixedobject" ],
morphism_specification := [ [ 1 , "varmorphism" , 2 ] ],
limit_object_name := "Equalizer" ,
limit_projection_name := "EmbeddingOfEqualizer" ,
colimit_object_name := "Coequalizer" ,
colimit_injection_name := "ProjectionOntoCoequalizer" ,
),
rec(
object_specification := [ "fixedobject" , "fixedobject" ],
morphism_specification := [ [ 1 , "fixedmorphism" , 2 ], [ 1 , "zeromorphism" , 2 ] ],
limit_object_name := "KernelObject" ,
limit_projection_name := "KernelEmbedding" ,
limit_universal_morphism_name := "KernelLift" ,
colimit_object_name := "CokernelObject" ,
colimit_injection_name := "CokernelProjection" ,
colimit_universal_morphism_name := "CokernelColift" ,
),
rec(
object_specification := [ ],
morphism_specification := [ ],
limit_object_name := "TerminalObject" ,
colimit_object_name := "InitialObject" ,
),
rec(
object_specification := [ ],
morphism_specification := [ ],
limit_object_name := "ZeroObject" ,
colimit_object_name := "ZeroObject" ,
)
] );
CAP_INTERNAL_ENHANCE_NAME_RECORD_LIMITS( CAP_INTERNAL_METHOD_NAME_RECORD_LIMITS );
CAP_INTERNAL_VALIDATE_LIMITS_IN_NAME_RECORD( CAP_INTERNAL_CORE_METHOD_NAME_RECORD, CAP_INTERNAL_METHOD_NAME_RECORD_LIMITS );
CAP_INTERNAL_ENHANCE_NAME_RECORD( CAP_INTERNAL_CORE_METHOD_NAME_RECORD );
CAP_INTERNAL_GENERATE_DECLARATIONS_AND_INSTALLATIONS_FROM_METHOD_NAME_RECORD(
CAP_INTERNAL_CORE_METHOD_NAME_RECORD,
"CAP" ,
"MethodRecord" ,
"Add Functions" ,
"Available Add functions"
);
CAP_INTERNAL_REGISTER_METHOD_NAME_RECORD_OF_PACKAGE( CAP_INTERNAL_CORE_METHOD_NAME_RECORD, "CAP" );
#= comment for Julia
CAP_INTERNAL_GENERATE_CONVENIENCE_METHODS_FOR_LIMITS( "CAP" , CAP_INTERNAL_CORE_METHOD_NAME_RECORD, CAP_INTERNAL_METHOD_NAME_RECORD_LIMITS );
# =#
CAP_INTERNAL_INSTALL_ADDS_FROM_RECORD( CAP_INTERNAL_CORE_METHOD_NAME_RECORD );
Messung V0.5 in Prozent C=100 H=91 G=95
¤ Dauer der Verarbeitung: 0.466 Sekunden
(vorverarbeitet am 2026-10-14)
¤
*© Formatika GbR, Deutschland