Definition generated_monoid : submonoid M :=
  image_monoid_hom (FM_lift (inj_part A)).

(* Specifications: *)
Lemma generated_monoid_minimal : forall (M : MONOID) (A : part_set M) (H : submonoid M), included A H -> included (generated_monoid A) H.
Lemma generated_monoid_prop_included : forall (M : MONOID) (A : part_set M), included A (generated_monoid A).
Lemma generated_monoid_prop : forall (M : MONOID) (A : part_set M) (y : M), in_part y (generated_monoid A) -> exists x : FM A, Equal y (FM_lift (inj_part A) x).
Lemma generated_monoid_prop_rev : forall (M : MONOID) (A : part_set M) (y : M), (exists x : FM A, Equal y (FM_lift (inj_part A) x)) -> in_part y (generated_monoid A).