## TPTP Axioms File: HAL001+0.ax

```%--------------------------------------------------------------------------
% File     : HAL001+0 : TPTP v8.1.0. Released v2.6.0.
% Domain   : Homological Algebra
% Axioms   : Standard homological algebra axioms
% Version  : [TPTP] axioms.
% English  :

% Refs     : [Wei94] Weibel (1994), An Introduction to Homological Algebra
% Source   : [TPTP]
% Names    :

% Status   : Satisfiable
% Syntax   : Number of formulae    :   13 (   0 unt;   0 def)
%            Number of atoms       :   66 (  16 equ)
%            Maximal formula atoms :    7 (   5 avg)
%            Number of connectives :   53 (   0   ~;   0   |;  30   &)
%                                         (   2 <=>;  21  =>;   0  <=;   0 <~>)
%            Maximal formula depth :   16 (  10 avg)
%            Maximal term depth    :    3 (   1 avg)
%            Number of predicates  :    7 (   6 usr;   0 prp; 1-4 aty)
%            Number of functors    :    3 (   3 usr;   0 con; 1-3 aty)
%            Number of variables   :   69 (  65   !;   4   ?)
% SPC      :

%--------------------------------------------------------------------------
fof(morphism,axiom,
! [Morphism,Dom,Cod] :
( morphism(Morphism,Dom,Cod)
=> ( ! [El] :
( element(El,Dom)
=> element(apply(Morphism,El),Cod) )
& apply(Morphism,zero(Dom)) = zero(Cod) ) ) ).

fof(injection_properties,axiom,
! [Morphism,Dom,Cod] :
( ( injection(Morphism)
& morphism(Morphism,Dom,Cod) )
=> ! [El1,El2] :
( ( element(El1,Dom)
& element(El2,Dom)
& apply(Morphism,El1) = apply(Morphism,El2) )
=> El1 = El2 ) ) ).

fof(properties_for_injection,axiom,
! [Morphism,Dom,Cod] :
( ( morphism(Morphism,Dom,Cod)
& ! [El1,El2] :
( ( element(El1,Dom)
& element(El2,Dom)
& apply(Morphism,El1) = apply(Morphism,El2) )
=> El1 = El2 ) )
=> injection(Morphism) ) ).

%----Sasha's weird injection axioms
% input_formula(injection_properties,axiom, (
%     ! [Morphism,Dom,Cod] :
%       ( ( injection(Morphism)
%         & morphism(Morphism,Dom,Cod) )
%      => ! [El] :
%           ( ( element(El,Dom)
%             & equal(apply(Morphism,El),zero(Cod)) )
%          => equal(El,zero(Dom)) ) )  )).
%
% input_formula(properties_for_injection,axiom, (
%     ! [Morphism,Dom,Cod] :
%       ( ( morphism(Morphism,Dom,Cod)
%         & ! [El] :
%             ( ( element(El,Dom)
%               & equal(apply(Morphism,El),zero(Cod)) )
%            => equal(El,zero(Dom)) ) )
%      => injection(Morphism) )  )).

fof(surjection_properties,axiom,
! [Morphism,Dom,Cod] :
( ( surjection(Morphism)
& morphism(Morphism,Dom,Cod) )
=> ! [ElCod] :
( element(ElCod,Cod)
=> ? [ElDom] :
( element(ElDom,Dom)
& apply(Morphism,ElDom) = ElCod ) ) ) ).

fof(properties_for_surjection,axiom,
! [Morphism,Dom,Cod] :
( ( morphism(Morphism,Dom,Cod)
& ! [ElCod] :
( element(ElCod,Cod)
=> ? [ElDom] :
( element(ElDom,Dom)
& apply(Morphism,ElDom) = ElCod ) ) )
=> surjection(Morphism) ) ).

fof(exact_properties,axiom,
! [Morphism1,Morphism2,Dom,CodDom,Cod] :
( ( exact(Morphism1,Morphism2)
& morphism(Morphism1,Dom,CodDom)
& morphism(Morphism2,CodDom,Cod) )
=> ! [ElCodDom] :
( ( element(ElCodDom,CodDom)
& apply(Morphism2,ElCodDom) = zero(Cod) )
<=> ? [ElDom] :
( element(ElDom,Dom)
& apply(Morphism1,ElDom) = ElCodDom ) ) ) ).

fof(properties_for_exact,axiom,
! [Morphism1,Morphism2,Dom,CodDom,Cod] :
( ( morphism(Morphism1,Dom,CodDom)
& morphism(Morphism2,CodDom,Cod)
& ! [ElCodDom] :
( ( element(ElCodDom,CodDom)
& apply(Morphism2,ElCodDom) = zero(Cod) )
<=> ? [ElDom] :
( element(ElDom,Dom)
& apply(Morphism1,ElDom) = ElCodDom ) ) )
=> exact(Morphism1,Morphism2) ) ).

fof(commute_properties,axiom,
! [M1,M2,M3,M4,Dom,DomCod1,DomCod2,Cod] :
( ( commute(M1,M2,M3,M4)
& morphism(M1,Dom,DomCod1)
& morphism(M2,DomCod1,Cod)
& morphism(M3,Dom,DomCod2)
& morphism(M4,DomCod2,Cod) )
=> ! [ElDom] :
( element(ElDom,Dom)
=> apply(M2,apply(M1,ElDom)) = apply(M4,apply(M3,ElDom)) ) ) ).

fof(properties_for_commute,axiom,
! [M1,M2,M3,M4,Dom,DomCod1,DomCod2,Cod] :
( ( morphism(M1,Dom,DomCod1)
& morphism(M2,DomCod1,Cod)
& morphism(M3,Dom,DomCod2)
& morphism(M4,DomCod2,Cod)
& ! [ElDom] :
( element(ElDom,Dom)
=> apply(M2,apply(M1,ElDom)) = apply(M4,apply(M3,ElDom)) ) )
=> commute(M1,M2,M3,M4) ) ).

fof(subtract_in_domain,axiom,
! [Dom,El1,El2] :
( ( element(El1,Dom)
& element(El2,Dom) )
=> element(subtract(Dom,El1,El2),Dom) ) ).

fof(subtract_to_0,axiom,
! [Dom,El] :
( element(El,Dom)
=> subtract(Dom,El,El) = zero(Dom) ) ).

fof(subtract_cancellation,axiom,
! [Dom,El1,El2] :
( ( element(El1,Dom)
& element(El2,Dom) )
=> subtract(Dom,El1,subtract(Dom,El1,El2)) = El2 ) ).

fof(subtract_distribution,axiom,
! [Morphism,Dom,Cod] :
( morphism(Morphism,Dom,Cod)
=> ! [El1,El2] :
( ( element(El1,Dom)
& element(El2,Dom) )
=> apply(Morphism,subtract(Dom,El1,El2)) = subtract(Cod,apply(Morphism,El1),apply(Morphism,El2)) ) ) ).

%--------------------------------------------------------------------------
```