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.LocalOpen Scope mc_scope.LocalOpen Scope mc_add_scope.(** * Finite Sums *)(** Indexed finite sum of abelian group elements. *)
A: AbGroup n: nat f: forallk : nat, (k < n.+1)%nat -> A IHn: (forallk : nat, (k < n)%nat -> A) -> A
A
A: AbGroup f: forallk : nat, (k < 0)%nat -> A
A
exact0.
A: AbGroup n: nat f: forallk : nat, (k < n.+1)%nat -> A IHn: (forallk : nat, (k < n)%nat -> A) -> A
A
A: AbGroup n: nat f: forallk : nat, (k < n.+1)%nat -> A IHn: (forallk : nat, (k < n)%nat -> A) -> A
forallk : nat, (k < n)%nat -> A
A: AbGroup n: nat f: forallk : nat, (k < n.+1)%nat -> A IHn: (forallk : 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: forallk : 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: forallk : 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: forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a IHn: forallf : forallk : 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: forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a IHn: forallf : forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a IHn: forallf : forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a IHn: forallf : forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a IHn: forallf : forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a IHn: forallf : forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a IHn: forallf : forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat), f k Hk = a IHn: forallf : forallk : 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: forallk : 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: forallk : 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: forallk : 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. *)
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) => 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: forallk : 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: forallk : nat, (k < n.+1)%nat -> A IHn: forallfg : forallk : 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: forallk : nat, (k < n.+1)%nat -> A IHn: forallfg : forallk : 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: forallk : nat, (k < n.+1)%nat -> A IHn: forallfg : forallk : 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: forallk : nat, (k < n.+1)%nat -> A IHn: forallfg : forallk : 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: forallk : nat, (k < n.+1)%nat -> A IHn: forallfg : forallk : 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))
A: AbGroup m, n: nat f: forallij : 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: forallij : 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: forallij : 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: forallij : nat,
(i < m)%nat -> (j < n.+1)%nat -> A IHn: forall (m : nat) (f : forallij : 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: forallij : nat,
(i < m)%nat -> (j < n.+1)%nat -> A IHn: forall (m : nat) (f : forallij : 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: forallk : 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: forallk : 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: forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat),
f k Hk = g k Hk IHn: forallfg : forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat),
f k Hk = g k Hk IHn: forallfg : forallk : 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: forallk : nat, (k < n.+1)%nat -> A p: forall (k : nat) (Hk : (k < n.+1)%nat),
f k Hk = g k Hk IHn: forallfg : forallk : 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
(funn : nat =>
(forallk : nat, (k < n)%nat -> A) -> A)
(fun_ : forallk : nat, (k < 0)%nat -> A => 0)
(fun (n : nat)
(IHn : (forallk : nat, (k < n)%nat -> A) -> A)
(f : forallk : 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
(funn : nat =>
(forallk : nat, (k < n)%nat -> A) -> A)
(fun_ : forallk : nat, (k < 0)%nat -> A => 0)
(fun (n : nat)
(IHn : (forallk : nat, (k < n)%nat -> A) -> A)
(f : forallk : 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))