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 Algebra.Rings.Ring.Require Import Classes.interfaces.abstract_algebra.Local Set Universe Minimization ToSet.Local Set Polymorphic Inductive Cumulativity.(** ** Kronecker Delta *)SectionAssumeDecidable.(** Throughout this section, we assume that we have a type [A] with decidable equality. This will be our indexing type and can be thought of as [nat] for reading purposes. *)Universes u v.Context {A : Type@{u}} `{DecidablePaths@{u} A} {R : Ring@{v}}.(** The Kronecker delta function is a function of elements of [A] that is 1 when the two numbers are equal and 0 otherwise. It is useful for working with finite sums of ring elements. *)Definitionkronecker_delta@{} (i j : A) : R
:= if dec (i = j) then1else0.(** Kronecker delta with the same index is 1. *)
A: Type H: DecidablePaths A R: Ring i: A
kronecker_delta i i = 1
A: Type H: DecidablePaths A R: Ring i: A
kronecker_delta i i = 1
A: Type H: DecidablePaths A R: Ring i: A
(if dec (i = i) then1else0) = 1
A: Type H: DecidablePaths A R: Ring i: A
foralls : (i = i) + (i <> i),
(if s then1else0) = 1
by rapply decidable_paths_refl.Defined.(** Kronecker delta with differing indices is 0. *)
A: Type H: DecidablePaths A R: Ring i, j: A p: i <> j
kronecker_delta i j = 0
A: Type H: DecidablePaths A R: Ring i, j: A p: i <> j
kronecker_delta i j = 0
A: Type H: DecidablePaths A R: Ring i, j: A p: i <> j
(if dec (i = j) then1else0) = 0
by decidable_false (dec (i = j)) p.Defined.(** Kronecker delta is symmetric in its arguments. *)
A: Type H: DecidablePaths A R: Ring i, j: A
kronecker_delta i j = kronecker_delta j i
A: Type H: DecidablePaths A R: Ring i, j: A
kronecker_delta i j = kronecker_delta j i
A: Type H: DecidablePaths A R: Ring i, j: A
(if dec (i = j) then1else0) =
(if dec (j = i) then1else0)
A: Type H: DecidablePaths A R: Ring i, j: A p: i = j
1 = (if dec (j = i) then1else0)
A: Type H: DecidablePaths A R: Ring i, j: A q: i <> j
0 = (if dec (j = i) then1else0)
A: Type H: DecidablePaths A R: Ring i, j: A p: i = j
1 = (if dec (j = i) then1else0)
by decidable_true (dec (j = i)) p^.
A: Type H: DecidablePaths A R: Ring i, j: A q: i <> j
0 = (if dec (j = i) then1else0)
by decidable_false (dec (j = i)) (symmetric_neq q).Defined.(** An injective endofunction on [A] preserves the Kronecker delta. *)
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f
kronecker_delta (f i) (f j) = kronecker_delta i j
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f
kronecker_delta (f i) (f j) = kronecker_delta i j
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f
(if dec (f i = f j) then1else0) =
(if dec (i = j) then1else0)
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f p: i = j
(if dec (f i = f j) then1else0) = 1
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f p: i <> j
(if dec (f i = f j) then1else0) = 0
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f p: i = j
(if dec (f i = f j) then1else0) = 1
by decidable_true (dec (f i = f j)) (ap f p).
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f p: i <> j
(if dec (f i = f j) then1else0) = 0
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f p: i <> j q: f i = f j
1 = 0
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f p: i <> j q: f i <> f j
0 = 0
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f p: i <> j q: f i = f j
1 = 0
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f p: i <> j q: i = j
1 = 0
contradiction.
A: Type H: DecidablePaths A R: Ring i, j: A f: A -> A IsInjective0: IsInjective f p: i <> j q: f i <> f j
0 = 0
reflexivity.Defined.(** Kronecker delta commutes with any ring element. *)
A: Type H: DecidablePaths A R: Ring i, j: A r: R
r * kronecker_delta i j = kronecker_delta i j * r
A: Type H: DecidablePaths A R: Ring i, j: A r: R
r * kronecker_delta i j = kronecker_delta i j * r
A: Type H: DecidablePaths A R: Ring i, j: A r: R
r * (if dec (i = j) then1else0) =
(if dec (i = j) then1else0) * r
A: Type H: DecidablePaths A R: Ring i, j: A r: R p: i = j
r * 1 = 1 * r
A: Type H: DecidablePaths A R: Ring i, j: A r: R n: i <> j
r * 0 = 0 * r
A: Type H: DecidablePaths A R: Ring i, j: A r: R p: i = j
r * 1 = 1 * r
exact (rng_mult_one_r _ @ (rng_mult_one_l _)^).
A: Type H: DecidablePaths A R: Ring i, j: A r: R n: i <> j
r * 0 = 0 * r
exact (rng_mult_zero_r _ @ (rng_mult_zero_l _)^).Defined.EndAssumeDecidable.(** The following lemmas are specialised to when the indexing type is [nat]. *)(** Kronecker delta where the first index is strictly less than the second is 0. *)
R: Ring i, j: nat p: (i < j)%nat
kronecker_delta i j = 0
R: Ring i, j: nat p: (i < j)%nat
kronecker_delta i j = 0
R: Ring i, j: nat p: (i < j)%nat
i <> j
R: Ring i: nat p: (i < i)%nat
Empty
byapply lt_irrefl in p.Defined.(** Kronecker delta where the first index is strictly greater than the second is 0. *)
R: Ring i, j: nat p: (j < i)%nat
kronecker_delta i j = 0
R: Ring i, j: nat p: (j < i)%nat
kronecker_delta i j = 0
R: Ring i, j: nat p: (j < i)%nat
i <> j
R: Ring i: nat p: (i < i)%nat
Empty
byapply lt_irrefl in p.Defined.(** Kronecker delta can be used to extract a single term from a finite sum. *)
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta i j * f j Hj) = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta i j * f j Hj) = f i Hi
R: Ring i: nat Hi: (i < 0)%nat f: forallk : nat, (k < 0)%nat -> R
ab_sum 0
(fun (j : nat) (Hj : (j < 0)%nat) =>
kronecker_delta i j * f j Hj) = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R
ab_sum n.+1
(fun (j : nat) (Hj : (j < n.+1)%nat) =>
kronecker_delta i j * f j Hj) = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R
ab_sum n.+1
(fun (j : nat) (Hj : (j < n.+1)%nat) =>
kronecker_delta i j * f j Hj) = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i = n
ab_sum n.+1
(fun (j : nat) (Hj : (j < n.+1)%nat) =>
kronecker_delta i j * f j Hj) = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
ab_sum n.+1
(fun (j : nat) (Hj : (j < n.+1)%nat) =>
kronecker_delta i j * f j Hj) = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i = n
ab_sum n.+1
(fun (j : nat) (Hj : (j < n.+1)%nat) =>
kronecker_delta i j * f j Hj) = f i Hi
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi
sg_op (kronecker_delta i i * f i (leq_refl i.+1))
(ab_sum i
(fun (k : nat) (Hk : (k < i)%nat) =>
kronecker_delta i k * f k (leq_succ_r Hk))) =
f i Hi
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi
sg_op (1 * f i (leq_refl i.+1))
(ab_sum i
(fun (k : nat) (Hk : (k < i)%nat) =>
kronecker_delta i k * f k (leq_succ_r Hk))) =
f i Hi
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi
sg_op (f i (leq_refl i.+1))
(ab_sum i
(fun (k : nat) (Hk : (k < i)%nat) =>
kronecker_delta i k * f k (leq_succ_r Hk))) =
f i Hi
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi
sg_op (f i (leq_refl i.+1))
(ab_sum i
(fun (k : nat) (Hk : (k < i)%nat) =>
kronecker_delta i k * f k (leq_succ_r Hk))) =
f i Hi + 0
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi
sg_op (f i (leq_refl i.+1)) = plus (f i Hi)
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi
ab_sum i
(fun (k : nat) (Hk : (k < i)%nat) =>
kronecker_delta i k * f k (leq_succ_r Hk)) = 0
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi
sg_op (f i (leq_refl i.+1)) = plus (f i Hi)
apply (ap (funh => plus (f i h))), path_ishprop.
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi
ab_sum i
(fun (k : nat) (Hk : (k < i)%nat) =>
kronecker_delta i k * f k (leq_succ_r Hk)) = 0
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi
forall (k : nat) (Hk : (k < i)%nat),
kronecker_delta i k * f k (leq_succ_r Hk) = mon_unit
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi k: nat Hk: (k < i)%nat
kronecker_delta i k * f k (leq_succ_r Hk) = mon_unit
R: Ring i: nat Hi: (i < i.+1)%nat f: forallk : nat, (k < i.+1)%nat -> R IHn: forall (i0 : nat) (Hi : (i0 < i)%nat) (f : forallk : nat, (k < i)%nat -> R),
ab_sum i (fun (j : nat) (Hj : (j < i)%nat) => kronecker_delta i0 j * f j Hj) =
f i0 Hi k: nat Hk: (k < i)%nat
0 * f k (leq_succ_r Hk) = mon_unit
apply rng_mult_zero_l.
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
ab_sum n.+1
(fun (j : nat) (Hj : (j < n.+1)%nat) =>
kronecker_delta i j * f j Hj) = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
ab_sum n
(fun (k : nat) (Hk : (k < n)%nat) =>
kronecker_delta i k * f k (leq_succ_r Hk)) = ?Goal
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
sg_op (kronecker_delta i n * f n (leq_refl n.+1))
?Goal = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
ab_sum n
(fun (k : nat) (Hk : (k < n)%nat) =>
kronecker_delta i k * f k (leq_succ_r Hk)) = ?Goal
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
(i < n)%nat
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: ((i < n)%nat + (i > n)%nat)%type
(i < n)%nat
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R g: (i > n)%nat
(i < n)%nat
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: ~ (n.+1 <= i)%nat f: forallk : nat, (k < n.+1)%nat -> R g: (i > n)%nat
(i < n)%nat
contradiction Hi.
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
sg_op (kronecker_delta i n * f n (leq_refl n.+1))
(f i
(leq_succ_r
(letH := fst neq_iff_lt_or_gt inletp := H p inmatch p with
| inl l => idmap l
| inr g =>
(fung0 : (i > n)%nat =>
letH0 := snd gt_iff_not_leq inletHi := H0 Hi in
Overture.Empty_rec (i < n)%nat (Hi g0))
g
end))) = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
sg_op (0 * f n (leq_refl n.+1))
(f i
(leq_succ_r
(letH := fst neq_iff_lt_or_gt inletp := H p inmatch p with
| inl l => l
| inr g =>
letH0 := snd gt_iff_not_leq inletHi := H0 Hi in
Overture.Empty_rec (i < n)%nat (Hi g)
end))) = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
sg_op 0
(f i
(leq_succ_r
(letH := fst neq_iff_lt_or_gt inletp := H p inmatch p with
| inl l => l
| inr g =>
letH0 := snd gt_iff_not_leq inletHi := H0 Hi in
Overture.Empty_rec (i < n)%nat (Hi g)
end))) = f i Hi
R: Ring n: nat IHn: forall (i : nat) (Hi : (i < n)%nat) (f : forallk : nat, (k < n)%nat -> R),
ab_sum n (fun (j : nat) (Hj : (j < n)%nat) => kronecker_delta i j * f j Hj) =
f i Hi i: nat Hi: (i < n.+1)%nat f: forallk : nat, (k < n.+1)%nat -> R p: i <> n
f i
(leq_succ_r
(letH := fst neq_iff_lt_or_gt inletp := H p inmatch p with
| inl l => l
| inr g =>
letH0 := snd gt_iff_not_leq inletHi := H0 Hi in
Overture.Empty_rec (i < n)%nat (Hi g)
end)) = f i Hi
apply ap, path_ishprop.Defined.(** Variant of [rng_sum_kronecker_delta_l] where the indexing is swapped. *)
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta j i * f j Hj) = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta j i * f j Hj) = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
forall (k : nat) (Hk : (k < n)%nat),
kronecker_delta k i * f k Hk = ?Goal k Hk
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n ?Goal = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
forall (k : nat) (Hk : (k < n)%nat),
kronecker_delta k i * f k Hk =
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta i j * f j Hj) k Hk
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R k: nat Hk: (k < n)%nat
kronecker_delta k i * f k Hk =
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta i j * f j Hj) k Hk
cbn; f_ap; apply kronecker_delta_symm.Defined.(** Variant of [rng_sum_kronecker_delta_l] where the Kronecker delta appears on the right. *)
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
f j Hj * kronecker_delta i j) = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
f j Hj * kronecker_delta i j) = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
forall (k : nat) (Hk : (k < n)%nat),
f k Hk * kronecker_delta i k = ?Goal k Hk
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n ?Goal = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
forall (k : nat) (Hk : (k < n)%nat),
f k Hk * kronecker_delta i k =
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta i j * f j Hj) k Hk
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R k: nat Hk: (k < n)%nat
f k Hk * kronecker_delta i k =
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta i j * f j Hj) k Hk
apply kronecker_delta_comm.Defined.(** Variant of [rng_sum_kronecker_delta_r] where the indexing is swapped. *)
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
f j Hj * kronecker_delta j i) = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n
(fun (j : nat) (Hj : (j < n)%nat) =>
f j Hj * kronecker_delta j i) = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
forall (k : nat) (Hk : (k < n)%nat),
f k Hk * kronecker_delta k i = ?Goal k Hk
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
ab_sum n ?Goal = f i Hi
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R
forall (k : nat) (Hk : (k < n)%nat),
f k Hk * kronecker_delta k i =
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta j i * f j Hj) k Hk
R: Ring n, i: nat Hi: (i < n)%nat f: forallk : nat, (k < n)%nat -> R k: nat Hk: (k < n)%nat
f k Hk * kronecker_delta k i =
(fun (j : nat) (Hj : (j < n)%nat) =>
kronecker_delta j i * f j Hj) k Hk