intros F n.
apply Build_abelian_monoid_on.
apply Build_abelian_sgroup_on.
exact (Fn_plus_commutative (F:=F) (n:=n)).
Qed.
Definition Fn_abmon (F : abelian_monoid) (n : Nat) : ABELIAN_MONOID :=
Build_abelian_monoid (Fn_monoid_is_abelian F n).
(***********************************)
(* What's in a name? That which we *)
(* call a group by any other word  *)
(* would smell as sweet.           *)
(***********************************)
Let Fn_inv_fun : forall (F : group) (n : Nat), Fn_monoid F n -> Fn_monoid F n.
simpl in |- *.
intros F n v.
apply (Build_Map (Ap:=fun i : fin n => group_inverse F (v i))).
red in |- *.
intros i i' H.
apply GROUP_comp; auto with algebra.
Defined.
Definition Fn_inv :
forall (F : group) (n : Nat), Map (Fn_monoid F n) (Fn_monoid F n).
intros F n.
apply (Build_Map (Ap:=Fn_inv_fun (F:=F) (n:=n))).
red in |- *.
intros.
simpl in |- *.
red in |- *.
intro i.
simpl in H.
red in H.
simpl in |- *.
apply GROUP_comp; auto with algebra.
Defined.

(* Specifications: *)
Lemma Fn_inv_is_r_inverse :
forall (F : group) (n : Nat),
inverse_r (Fn_plus F n) (Fn_zero F n) (Fn_inv F n).