Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Spaces.Nat.Core Spaces.Int. Require Export Classes.interfaces.canonical_names (Commutative). Require Export Classes.interfaces.abstract_algebra (IsAbGroup(..), abgroup_group, abgroup_commutative). Require Import AbelianGroup. Local Open Scope mc_scope. Local Open Scope mc_add_scope. (** * Finite Sums *) (** Indexed finite sum of abelian group elements. *)
A: AbGroup
n: nat
f: forall k : nat, (k < n)%nat -> A

A
A: AbGroup
n: nat
f: forall k : nat, (k < n)%nat -> A

A
A: AbGroup
f: forall k : nat, (k < 0)%nat -> A

A
A: AbGroup
n: nat
f: forall k : nat, (k < n.+1)%nat -> A
IHn: (forall k : nat, (k < n)%nat -> A) -> A
A
A: AbGroup
f: forall k : nat, (k < 0)%nat -> A

A
exact 0.
A: AbGroup
n: nat
f: forall k : nat, (k < n.+1)%nat -> A
IHn: (forall k : nat, (k < n)%nat -> A) -> A

A
A: AbGroup
n: nat
f: forall k : nat, (k < n.+1)%nat -> A
IHn: (forall k : nat, (k < n)%nat -> A) -> A

forall k : nat, (k < n)%nat -> A
A: AbGroup
n: nat
f: forall k : nat, (k < n.+1)%nat -> A
IHn: (forall k : nat, (k < n)%nat -> A) -> A
k: nat
Hk: (k < n)%nat

A
exact (f k _). Defined. (** If the function is constant in the range of a finite sum then the sum is equal to the constant times [n]. This is a group power in the underlying group. *)
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n)%nat -> A
p: forall (k : nat) (Hk : (k < n)%nat), f k Hk = a

ab_sum n f = ab_mul n a
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n)%nat -> A
p: forall (k : nat) (Hk : (k < n)%nat), f k Hk = a

ab_sum n f = ab_mul n a
A: AbGroup
a: A
f: forall k : nat, (k < 0)%nat -> A
p: forall (k : nat) (Hk : (k < 0)%nat), f k Hk = a

ab_sum 0 f = ab_mul 0%nat a
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a
IHn: forall f : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = a) -> ab_sum n f = ab_mul n a
ab_sum n.+1 f = ab_mul n.+1%nat a
A: AbGroup
a: A
f: forall k : nat, (k < 0)%nat -> A
p: forall (k : nat) (Hk : (k < 0)%nat), f k Hk = a

ab_sum 0 f = ab_mul 0%nat a
reflexivity.
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a
IHn: forall f : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = a) -> ab_sum n f = ab_mul n a

ab_sum n.+1 f = ab_mul n.+1%nat a
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a
IHn: forall f : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = a) -> ab_sum n f = ab_mul n a

ab_sum n.+1 f = grp_pow a n.+1%int
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a
IHn: forall f : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = a) -> ab_sum n f = ab_mul n a

ab_sum n.+1 f = a + grp_pow a n
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a
IHn: forall f : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = a) -> ab_sum n f = ab_mul n a

f n (leq_refl n.+1) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk)) = a + grp_pow a n
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a
IHn: forall f : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = a) -> ab_sum n f = ab_mul n a

ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk)) = grp_pow a n
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a
IHn: forall f : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = a) -> ab_sum n f = ab_mul n a

forall (k : nat) (Hk : (k < n)%nat), f k (leq_succ_r Hk) = a
A: AbGroup
n: nat
a: A
f: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a
IHn: forall f : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = a) -> ab_sum n f = ab_mul n a
k: nat
Hk: (k < n)%nat

f k (leq_succ_r Hk) = a
apply p. Defined. (** If the function is zero in the range of a finite sum then the sum is zero. *)
A: AbGroup
n: nat
f: forall k : nat, (k < n)%nat -> A
p: forall (k : nat) (Hk : (k < n)%nat), f k Hk = 0

ab_sum n f = 0
A: AbGroup
n: nat
f: forall k : nat, (k < n)%nat -> A
p: forall (k : nat) (Hk : (k < n)%nat), f k Hk = 0

ab_sum n f = 0
A: AbGroup
n: nat
f: forall k : nat, (k < n)%nat -> A
p: forall (k : nat) (Hk : (k < n)%nat), f k Hk = 0

ab_mul n 0 = 0
apply grp_pow_unit. Defined. (** Finite sums distribute over addition. *)
A: AbGroup
n: nat
f, g: forall k : nat, (k < n)%nat -> A

ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk + g k Hk) = ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k Hk)
A: AbGroup
n: nat
f, g: forall k : nat, (k < n)%nat -> A

ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk + g k Hk) = ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k Hk)
A: AbGroup
f, g: forall k : nat, (k < 0)%nat -> A

ab_sum 0 (fun (k : nat) (Hk : (k < 0)%nat) => f k Hk + g k Hk) = ab_sum 0 (fun (k : nat) (Hk : (k < 0)%nat) => f k Hk) + ab_sum 0 (fun (k : nat) (Hk : (k < 0)%nat) => g k Hk)
A: AbGroup
n: nat
f, g: forall k : nat, (k < n.+1)%nat -> A
IHn: forall f g : forall k : nat, (k < n)%nat -> A, ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk + g k Hk) = ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k Hk)
ab_sum n.+1 (fun (k : nat) (Hk : (k < n.+1)%nat) => f k Hk + g k Hk) = ab_sum n.+1 (fun (k : nat) (Hk : (k < n.+1)%nat) => f k Hk) + ab_sum n.+1 (fun (k : nat) (Hk : (k < n.+1)%nat) => g k Hk)
A: AbGroup
n: nat
f, g: forall k : nat, (k < n.+1)%nat -> A
IHn: forall f g : forall k : nat, (k < n)%nat -> A, ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk + g k Hk) = ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k Hk)

ab_sum n.+1 (fun (k : nat) (Hk : (k < n.+1)%nat) => f k Hk + g k Hk) = ab_sum n.+1 (fun (k : nat) (Hk : (k < n.+1)%nat) => f k Hk) + ab_sum n.+1 (fun (k : nat) (Hk : (k < n.+1)%nat) => g k Hk)
A: AbGroup
n: nat
f, g: forall k : nat, (k < n.+1)%nat -> A
IHn: forall f g : forall k : nat, (k < n)%nat -> A, ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk + g k Hk) = ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k Hk)

f n (leq_refl n.+1) + g n (leq_refl n.+1) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk) + g k (leq_succ_r Hk)) = f n (leq_refl n.+1) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk)) + (g n (leq_refl n.+1) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k (leq_succ_r Hk)))
A: AbGroup
n: nat
f, g: forall k : nat, (k < n.+1)%nat -> A
IHn: forall f g : forall k : nat, (k < n)%nat -> A, ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk + g k Hk) = ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k Hk)

g n (leq_refl n.+1) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk) + g k (leq_succ_r Hk)) = ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk)) + (g n (leq_refl n.+1) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k (leq_succ_r Hk)))
A: AbGroup
n: nat
f, g: forall k : nat, (k < n.+1)%nat -> A
IHn: forall f g : forall k : nat, (k < n)%nat -> A, ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk + g k Hk) = ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f k Hk) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k Hk)

ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k (leq_succ_r Hk)) + g n (leq_refl n.+1) = g n (leq_refl n.+1) + ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g k (leq_succ_r Hk))
by rewrite abgroup_commutative. Defined. (** Double finite sums commute. *)
A: AbGroup
m, n: nat
f: forall i j : nat, (i < m)%nat -> (j < n)%nat -> A

ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => f i j Hi Hj)) = ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => f i j Hi Hj))
A: AbGroup
m, n: nat
f: forall i j : nat, (i < m)%nat -> (j < n)%nat -> A

ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => f i j Hi Hj)) = ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => f i j Hi Hj))
A: AbGroup
m: nat
f: forall i j : nat, (i < m)%nat -> (j < 0)%nat -> A

ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => ab_sum 0 (fun (j : nat) (Hj : (j < 0)%nat) => f i j Hi Hj)) = ab_sum 0 (fun (j : nat) (Hj : (j < 0)%nat) => ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => f i j Hi Hj))
A: AbGroup
m, n: nat
f: forall i j : nat, (i < m)%nat -> (j < n.+1)%nat -> A
IHn: forall (m : nat) (f : forall i j : nat, (i < m)%nat -> (j < n)%nat -> A), ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => f i j Hi Hj)) = ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => f i j Hi Hj))
ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => ab_sum n.+1 (fun (j : nat) (Hj : (j < n.+1)%nat) => f i j Hi Hj)) = ab_sum n.+1 (fun (j : nat) (Hj : (j < n.+1)%nat) => ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => f i j Hi Hj))
A: AbGroup
m, n: nat
f: forall i j : nat, (i < m)%nat -> (j < n.+1)%nat -> A
IHn: forall (m : nat) (f : forall i j : nat, (i < m)%nat -> (j < n)%nat -> A), ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => f i j Hi Hj)) = ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => f i j Hi Hj))

ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => ab_sum n.+1 (fun (j : nat) (Hj : (j < n.+1)%nat) => f i j Hi Hj)) = ab_sum n.+1 (fun (j : nat) (Hj : (j < n.+1)%nat) => ab_sum m (fun (i : nat) (Hi : (i < m)%nat) => f i j Hi Hj))
lhs napply ab_sum_plus; cbn; f_ap. Defined. (** Finite sums are equal if the functions are equal in the range. *)
A: AbGroup
n: nat
f, g: forall k : nat, (k < n)%nat -> A
p: forall (k : nat) (Hk : (k < n)%nat), f k Hk = g k Hk

ab_sum n f = ab_sum n g
A: AbGroup
n: nat
f, g: forall k : nat, (k < n)%nat -> A
p: forall (k : nat) (Hk : (k < n)%nat), f k Hk = g k Hk

ab_sum n f = ab_sum n g
A: AbGroup
f, g: forall k : nat, (k < 0)%nat -> A
p: forall (k : nat) (Hk : (k < 0)%nat), f k Hk = g k Hk

ab_sum 0 f = ab_sum 0 g
A: AbGroup
n: nat
f, g: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = g k Hk
IHn: forall f g : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = g k Hk) -> ab_sum n f = ab_sum n g
ab_sum n.+1 f = ab_sum n.+1 g
A: AbGroup
n: nat
f, g: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = g k Hk
IHn: forall f g : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = g k Hk) -> ab_sum n f = ab_sum n g

ab_sum n.+1 f = ab_sum n.+1 g
A: AbGroup
n: nat
f, g: forall k : nat, (k < n.+1)%nat -> A
p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = g k Hk
IHn: forall f g : forall k : nat, (k < n)%nat -> A, (forall (k : nat) (Hk : (k < n)%nat), f k Hk = g k Hk) -> ab_sum n f = ab_sum n g

nat_rect (fun n : nat => (forall k : nat, (k < n)%nat -> A) -> A) (fun _ : forall k : nat, (k < 0)%nat -> A => 0) (fun (n : nat) (IHn : (forall k : nat, (k < n)%nat -> A) -> A) (f : forall k : nat, (k < n.+1)%nat -> A) => f n (leq_refl n.+1) + IHn (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk))) n (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk)) = nat_rect (fun n : nat => (forall k : nat, (k < n)%nat -> A) -> A) (fun _ : forall k : nat, (k < 0)%nat -> A => 0) (fun (n : nat) (IHn : (forall k : nat, (k < n)%nat -> A) -> A) (f : forall k : nat, (k < n.+1)%nat -> A) => f n (leq_refl n.+1) + IHn (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk))) n (fun (k : nat) (Hk : (k < n)%nat) => g k (leq_succ_r Hk))
by apply IHn. Defined.