Built with Alectryon. 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.
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: forallk0 : nat, (k0 < n.+1)%nat -> A IHn: (forallk0 : nat, (k0 < 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: forallf0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = a) ->
ab_sum n f0 = 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: forallf0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = a) ->
ab_sum n f0 = 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: forallf0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = a) ->
ab_sum n f0 = 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: forallf0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = a) ->
ab_sum n f0 = 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: forallf0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = a) ->
ab_sum n f0 = 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: forallf0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = a) ->
ab_sum n f0 = 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: forallf0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = a) ->
ab_sum n f0 = 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: forallk0 : nat, (k0 < n.+1)%nat -> A p: forall (k0 : nat) (Hk0 : (k0 < n.+1)%nat), f k0 Hk0 = a IHn: forallf0 : forallk0 : nat, (k0 < n)%nat -> A,
(forall (k0 : nat) (Hk0 : (k0 < n)%nat), f0 k0 Hk0 = a) ->
ab_sum n f0 = 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: forallf0g0 : forallk : nat, (k < n)%nat -> A,
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk + g0 k Hk) =
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk) +
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g0 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: forallf0g0 : forallk : nat, (k < n)%nat -> A,
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk + g0 k Hk) =
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk) +
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g0 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: forallf0g0 : forallk : nat, (k < n)%nat -> A,
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk + g0 k Hk) =
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk) +
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g0 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: forallf0g0 : forallk : nat, (k < n)%nat -> A,
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk + g0 k Hk) =
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk) +
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g0 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: forallf0g0 : forallk : nat, (k < n)%nat -> A,
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk + g0 k Hk) =
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => f0 k Hk) +
ab_sum n (fun (k : nat) (Hk : (k < n)%nat) => g0 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 (m0 : nat) (f0 : forallij : nat, (i < m0)%nat -> (j < n)%nat -> A),
ab_sum m0
(fun (i : nat) (Hi : (i < m0)%nat) =>
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => f0 i j Hi Hj)) =
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
ab_sum m0 (fun (i : nat) (Hi : (i < m0)%nat) => f0 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 (m0 : nat) (f0 : forallij : nat, (i < m0)%nat -> (j < n)%nat -> A),
ab_sum m0
(fun (i : nat) (Hi : (i < m0)%nat) =>
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => f0 i j Hi Hj)) =
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
ab_sum m0 (fun (i : nat) (Hi : (i < m0)%nat) => f0 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: forallf0g0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = g0 k Hk) ->
ab_sum n f0 = ab_sum n g0
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: forallf0g0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = g0 k Hk) ->
ab_sum n f0 = ab_sum n g0
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: forallf0g0 : forallk : nat, (k < n)%nat -> A,
(forall (k : nat) (Hk : (k < n)%nat), f0 k Hk = g0 k Hk) ->
ab_sum n f0 = ab_sum n g0
nat_rect (funn0 : nat => (forallk : nat, (k < n0)%nat -> A) -> A)
(fun_ : forallk : nat, (k < 0)%nat -> A => 0)
(fun (n0 : nat) (IHn0 : (forallk : nat, (k < n0)%nat -> A) -> A)
(f0 : forallk : nat, (k < n0.+1)%nat -> A) =>
f0 n0 (leq_refl n0.+1) +
IHn0 (fun (k : nat) (Hk : (k < n0)%nat) => f0 k (leq_succ_r Hk)))
n (fun (k : nat) (Hk : (k < n)%nat) => f k (leq_succ_r Hk)) =
nat_rect (funn0 : nat => (forallk : nat, (k < n0)%nat -> A) -> A)
(fun_ : forallk : nat, (k < 0)%nat -> A => 0)
(fun (n0 : nat) (IHn0 : (forallk : nat, (k < n0)%nat -> A) -> A)
(f0 : forallk : nat, (k < n0.+1)%nat -> A) =>
f0 n0 (leq_refl n0.+1) +
IHn0 (fun (k : nat) (Hk : (k < n0)%nat) => f0 k (leq_succ_r Hk)))
n (fun (k : nat) (Hk : (k < n)%nat) => g k (leq_succ_r Hk))