File: Mathlib/Algebra/Module/Projective.lean

full_name: Module.Projective.out
code: /-- An R-module is projective if it is a direct summand of a free module, or equivalently
  if maps from the module lift along surjections. There are several other equivalent
  definitions. -/
class Module.Projective (R : Type*) [Semiring R] (P : Type*) [AddCommMonoid P] [Module R P] :
    Prop where
  out : ∃ s : P →ₗ[R] P →₀ R, Function.LeftInverse (Finsupp.total P P R id) s
goal: ∃ s, Function.LeftInverse ⇑(Finsupp.total P P R id) ⇑s

full_name: Module.Projective
code: /-- An R-module is projective if it is a direct summand of a free module, or equivalently
  if maps from the module lift along surjections. There are several other equivalent
  definitions. -/
class Module.Projective (R : Type*) [Semiring R] (P : Type*) [AddCommMonoid P] [Module R P] :
    Prop where
  out : ∃ s : P →ₗ[R] P →₀ R, Function.LeftInverse (Finsupp.total P P R id) s
goal: Prop

full_name: Module.projective_def
code: theorem projective_def :
    Projective R P ↔ ∃ s : P →ₗ[R] P →₀ R, Function.LeftInverse (Finsupp.total P P R id) s 
goal: Module.Projective R P ↔ ∃ s, Function.LeftInverse ⇑(Finsupp.total P P R id) ⇑s

full_name: Module.projective_def'
code: theorem projective_def' :
    Projective R P ↔ ∃ s : P →ₗ[R] P →₀ R, Finsupp.total P P R id ∘ₗ s = .id 
goal: Module.Projective R P ↔ ∃ s, Finsupp.total P P R id ∘ₗ s = LinearMap.id

full_name: Module.projective_lifting_property
code: /-- A projective R-module has the property that maps from it lift along surjections. -/
theorem projective_lifting_property [h : Projective R P] (f : M →ₗ[R] N) (g : P →ₗ[R] N)
    (hf : Function.Surjective f) : ∃ h : P →ₗ[R] M, f.comp h = g 
goal: ∃ h, f ∘ₗ h = g

full_name: Module.Projective.of_lifting_property''
code: /-- A module which satisfies the universal property is projective: If all surjections of
`R`-modules `(P →₀ R) →ₗ[R] P` have `R`-linear left inverse maps, then `P` is
projective. -/
theorem Projective.of_lifting_property'' {R : Type u} [Semiring R] {P : Type v} [AddCommMonoid P]
    [Module R P] (huniv : ∀ (f : (P →₀ R) →ₗ[R] P), Function.Surjective f →
      ∃ h : P →ₗ[R] (P →₀ R), f.comp h = .id) :
    Projective R P 
goal: Module.Projective R P

full_name: Module.instProjectiveProd
code: instance [Projective R P] [Projective R Q] : Projective R (P × Q) 
goal: Module.Projective R (P × Q)

full_name: Module.instProjectiveDFinsupp
code: instance [h : ∀ i : ι, Projective R (A i)] : Projective R (Π₀ i, A i) 
goal: Module.Projective R (Π₀ (i : ι), A i)

full_name: Module.Projective.of_basis
code: /-- Free modules are projective. -/
theorem Projective.of_basis {ι : Type*} (b : Basis ι R P) : Projective R P 
goal: Module.Projective R P

full_name: Module.Projective.of_free
code: instance (priority := 100) Projective.of_free [Module.Free R P] : Module.Projective R P 
goal: Module.Projective R P

full_name: Module.Projective.of_split
code: theorem Projective.of_split [Module.Projective R M]
    (i : P →ₗ[R] M) (s : M →ₗ[R] P) (H : s.comp i = LinearMap.id) : Module.Projective R P 
goal: Module.Projective R P

full_name: Module.Projective.of_equiv
code: theorem Projective.of_equiv [Module.Projective R M]
    (e : M ≃ₗ[R] P) : Module.Projective R P 
goal: Module.Projective R P

full_name: Module.Projective.iff_split
code: /-- A module is projective iff it is the direct summand of a free module. -/
theorem Projective.iff_split : Module.Projective R P ↔
    ∃ (M : Type max u v) (_ : AddCommGroup M) (_ : Module R M) (_ : Module.Free R M)
      (i : P →ₗ[R] M) (s : M →ₗ[R] P), s.comp i = LinearMap.id 
goal: Module.Projective R P ↔ ∃ M x x_1, ∃ (_ : Module.Free R M), ∃ i s, s ∘ₗ i = LinearMap.id

full_name: Module.Projective.iff_split_of_projective
code: /-- A quotient of a projective module is projective iff it is a direct summand. -/
theorem Projective.iff_split_of_projective [Module.Projective R M] (s : M →ₗ[R] P)
    (hs : Function.Surjective s) :
    Module.Projective R P ↔ ∃ i, s ∘ₗ i = LinearMap.id 
goal: Module.Projective R P ↔ ∃ i, s ∘ₗ i = LinearMap.id

full_name: Module.Projective.tensorProduct
code: instance Projective.tensorProduct [hM : Module.Projective R M] [hN : Module.Projective R₀ N] :
    Module.Projective R (M ⊗[R₀] N) 
goal: Module.Projective R (TensorProduct R₀ M N)

full_name: Module.Projective.of_lifting_property'
code: /-- A module which satisfies the universal property is projective. Note that the universe variables
in `huniv` are somewhat restricted. -/
theorem Projective.of_lifting_property' {R : Type u} [Semiring R] {P : Type max u v}
    [AddCommMonoid P] [Module R P]
    -- If for all surjections of `R`-modules `M →ₗ N`, all maps `P →ₗ N` lift to `P →ₗ M`,
    (huniv : ∀ {M : Type max v u} {N : Type max u v} [AddCommMonoid M] [AddCommMonoid N]
      [Module R M] [Module R N] (f : M →ₗ[R] N) (g : P →ₗ[R] N),
        Function.Surjective f → ∃ h : P →ₗ[R] M, f.comp h = g) :
    -- then `P` is projective.
    Projective R P 
goal: Module.Projective R P

full_name: Module.Projective.of_lifting_property
code: /-- A variant of `of_lifting_property'` when we're working over a `[Ring R]`,
which only requires quantifying over modules with an `AddCommGroup` instance. -/
theorem Projective.of_lifting_property {R : Type u} [Ring R] {P : Type max u v} [AddCommGroup P]
    [Module R P]
    -- If for all surjections of `R`-modules `M →ₗ N`, all maps `P →ₗ N` lift to `P →ₗ M`,
    (huniv : ∀ {M : Type max v u} {N : Type max u v} [AddCommGroup M] [AddCommGroup N]
      [Module R M] [Module R N] (f : M →ₗ[R] N) (g : P →ₗ[R] N),
        Function.Surjective f → ∃ h : P →ₗ[R] M, f.comp h = g) :
    -- then `P` is projective.
    Projective R P 
goal: Module.Projective R P