@@ -233,23 +233,220 @@ Proof.
233233Qed .
234234
235235(* ====================================================================
236- End of Session 1.
236+ §3 finSum add / scale + Cauchy-Schwarz (Session 2, 2026-04-18)
237+ ==================================================================== *)
238+
239+ (* Adds the add / scale lemmas and a local Cauchy-Schwarz suitable
240+ for use on the uniform-distribution variance-proxy theorem below.
241+ These mirror lemmas already in S4_heisenberg_ndim.v but are
242+ inlined here because canonical-proof-suite files compile
243+ independently under `coqc`. *)
244+
245+ Lemma finSum_add :
246+ forall (n : nat) (f g : Fin.t n -> R),
247+ finSum n (fun i => f i + g i) = finSum n f + finSum n g.
248+ Proof .
249+ induction n as [|k IH]; intros f g; simpl.
250+ - lra.
251+ - rewrite IH. lra.
252+ Qed .
253+
254+ Lemma finSum_scale :
255+ forall (n : nat) (c : R) (f : Fin.t n -> R),
256+ finSum n (fun i => c * f i) = c * finSum n f.
257+ Proof .
258+ induction n as [|k IH]; intros c f; simpl.
259+ - lra.
260+ - rewrite IH. lra.
261+ Qed .
262+
263+ Lemma R_square_nonneg : forall r : R, 0 <= r * r.
264+ Proof .
265+ intro r. replace (r * r) with (Rsqr r) by (unfold Rsqr; reflexivity).
266+ apply Rle_0_sqr.
267+ Qed .
268+
269+ Lemma finSum_self_square_nonneg :
270+ forall (n : nat) (f : Fin.t n -> R),
271+ 0 <= finSum n (fun i => f i * f i).
272+ Proof .
273+ intros n f. apply finSum_nonneg. intro i. apply R_square_nonneg.
274+ Qed .
275+
276+ (* self-square-zero implies pointwise-zero, needed for the y = 0
277+ branch of the Cauchy-Schwarz split below. *)
278+ Lemma finSum_self_square_zero_implies_pointwise_zero :
279+ forall (n : nat) (f : Fin.t n -> R),
280+ finSum n (fun i => f i * f i) = 0 ->
281+ forall i : Fin.t n, f i = 0.
282+ Proof .
283+ induction n as [|k IH]; intros f Hzero i.
284+ - inversion i.
285+ - simpl in Hzero.
286+ assert (Hhead_nn : 0 <= f Fin.F1 * f Fin.F1) by apply R_square_nonneg.
287+ assert (Htail_nn : 0 <= finSum k (fun j => f (Fin.FS j) * f (Fin.FS j))).
288+ { apply finSum_nonneg. intro j. apply R_square_nonneg. }
289+ assert (Hhead_zero : f Fin.F1 * f Fin.F1 = 0) by lra.
290+ assert (Htail_zero : finSum k (fun j => f (Fin.FS j) * f (Fin.FS j)) = 0)
291+ by lra.
292+ pose proof (Fin.caseS' i (fun i0 : Fin.t (S k) => f i0 = 0)) as Hcase.
293+ apply Hcase.
294+ + assert (Hsqr : Rsqr (f Fin.F1) = 0)
295+ by (unfold Rsqr; exact Hhead_zero).
296+ apply Rsqr_eq_0. exact Hsqr.
297+ + intro i'. apply (IH (fun j => f (Fin.FS j)) Htail_zero i').
298+ Qed .
299+
300+ (* The n-dim Cauchy-Schwarz inequality, stated directly over finSum
301+ rather than a named `inner` (S4 introduces `inner` — we do not,
302+ to keep this file focused on probability distributions). *)
303+ Theorem cauchy_schwarz_finSum :
304+ forall (n : nat) (x y : Fin.t n -> R),
305+ (finSum n (fun i => x i * y i))^2
306+ <= finSum n (fun i => x i * x i) * finSum n (fun i => y i * y i).
307+ Proof .
308+ intros n x y.
309+ pose proof (finSum_self_square_nonneg n y) as Hyy_nn.
310+ destruct (Req_dec (finSum n (fun i => y i * y i)) 0) as [Hyy_zero | Hyy_nz].
311+ - (* y is identically zero, so sum (x*y) = 0 and LHS = 0. *)
312+ assert (Hy_zero : forall i : Fin.t n, y i = 0).
313+ { apply finSum_self_square_zero_implies_pointwise_zero. exact Hyy_zero. }
314+ assert (Hxy_zero : finSum n (fun i => x i * y i) = 0).
315+ { replace (fun i : Fin.t n => x i * y i) with (fun _ : Fin.t n => 0).
316+ - apply finSum_zero.
317+ - apply functional_extensionality. intro i.
318+ rewrite (Hy_zero i). lra. }
319+ rewrite Hxy_zero, Hyy_zero.
320+ replace ((0 : R) ^ 2) with 0 by (simpl; lra).
321+ lra.
322+ - assert (Hyy_pos : 0 < finSum n (fun i => y i * y i)) by lra.
323+ (* Polynomial non-negativity: for all t, 0 <= sum (x + t*y)^2. *)
324+ set (A := finSum n (fun i => x i * x i)).
325+ set (B := finSum n (fun i => x i * y i)).
326+ set (C := finSum n (fun i => y i * y i)).
327+ assert (HC_pos : 0 < C) by (unfold C; exact Hyy_pos).
328+ assert (HC_nz : C <> 0) by lra.
329+ (* Expand sum (x + t y)^2 = A + 2tB + t^2 C and instantiate at
330+ t := -B/C to get A - B^2/C >= 0. *)
331+ assert (Hexpand :
332+ forall t : R,
333+ finSum n (fun i => (x i + t * y i) * (x i + t * y i))
334+ = A + 2 * t * B + t^2 * C).
335+ { intro t.
336+ rewrite finSum_ext with
337+ (g := fun i : Fin.t n =>
338+ x i * x i + (2 * t) * (x i * y i) + (t^2) * (y i * y i)).
339+ 2: { intro i. ring. }
340+ rewrite finSum_add, finSum_add.
341+ rewrite (finSum_scale n (2 * t) (fun i => x i * y i)).
342+ rewrite (finSum_scale n (t^2) (fun i => y i * y i)).
343+ unfold A, B, C. ring. }
344+ assert (Hpoly_nn : forall t : R, 0 <= A + 2 * t * B + t^2 * C).
345+ { intro t. rewrite <- Hexpand.
346+ apply finSum_self_square_nonneg. }
347+ pose proof (Hpoly_nn (- B / C)) as Hspec.
348+ assert (Hrewrite :
349+ A + 2 * (- B / C) * B + (- B / C) ^ 2 * C
350+ = A - B ^ 2 / C)
351+ by (field; exact HC_nz).
352+ rewrite Hrewrite in Hspec.
353+ (* Hspec : 0 <= A - B^2/C. Multiply by C > 0 to clear division. *)
354+ assert (Hmul_nn : 0 <= (A - B^2 / C) * C)
355+ by (apply Rmult_le_pos; [exact Hspec | lra]).
356+ assert (Hfinal : 0 <= A * C - B^2).
357+ { replace (A * C - B^2) with ((A - B^2 / C) * C).
358+ - exact Hmul_nn.
359+ - field. exact HC_nz. }
360+ lra.
361+ Qed .
362+
363+ (* ====================================================================
364+ §4 Uniform-distribution square-sum lower bound (rung-1 theorem)
365+ ==================================================================== *)
366+
367+ (* Two helper lemmas before the headline rung-1 result. *)
368+
369+ (* finSum of the constant function 1 equals INR n (the real
370+ image of the natural number n). Cauchy-Schwarz applied to
371+ (p, 1) uses this to turn the sum-of-ones factor into n. *)
372+ Lemma finSum_const_1 :
373+ forall n : nat, finSum n (fun _ : Fin.t n => 1) = INR n.
374+ Proof .
375+ induction n as [|k IH]; simpl.
376+ - reflexivity.
377+ - (* INR (S k) = INR k + 1 by definition of INR; S_INR captures this
378+ in the positive case. For k = 0, INR 1 = 1 is definitional. *)
379+ destruct k as [|k'].
380+ + simpl. lra.
381+ + rewrite IH. rewrite S_INR. lra.
382+ Qed .
383+
384+ (* For a probability distribution p on n points (n >= 1), the sum
385+ of squares is bounded below by 1/n. This is the finite-dim
386+ analogue of the binary variance-maximum fact, and the arithmetic
387+ kernel of `H(p) <= ln n` (Session 3+ will deduce the entropy
388+ bound from this square-sum bound together with concavity of ln —
389+ that is the actual Jensen step). *)
390+
391+ Theorem prob_dist_sum_squares_ge_inv_n :
392+ forall (n : nat) (p : Vec n),
393+ is_prob_dist n p ->
394+ (n > 0)%nat ->
395+ 1 / INR n <= finSum n (fun i => p i * p i).
396+ Proof .
397+ intros n p Hpd Hn_pos.
398+ (* Cauchy-Schwarz with x := p and y := fun _ => 1 :
399+ (sum p_i * 1)^2 <= (sum p_i^2) * (sum 1^2).
400+ LHS = (sum p)^2 = 1^2 = 1; sum 1^2 = n. *)
401+ pose proof (cauchy_schwarz_finSum n p (fun _ => 1)) as HCS.
402+ cbv beta in HCS.
403+ (* HCS : (finSum n (fun i => p i * 1))^2
404+ <= finSum n (fun i => p i * p i) * finSum n (fun i => 1 * 1).
405+ Rewrite the LHS factor `p i * 1` to `p i`, the 1*1 factor to 1,
406+ then apply `finSum_const_1` and `prob_dist_sum_one`. *)
407+ rewrite (finSum_ext n (fun i : Fin.t n => p i * 1) p) in HCS
408+ by (intro i; lra).
409+ rewrite (finSum_ext n (fun i : Fin.t n => (1 : R) * 1)
410+ (fun _ : Fin.t n => 1)) in HCS
411+ by (intro i; lra).
412+ rewrite (finSum_const_1 n) in HCS.
413+ rewrite (prob_dist_sum_one n p Hpd) in HCS.
414+ (* HCS : 1^2 <= finSum n (fun i => p i * p i) * INR n. *)
415+ replace ((1 : R)^2) with 1 in HCS by (simpl; lra).
416+ (* Rewrite to divide through by INR n > 0. *)
417+ assert (HINRn_pos : 0 < INR n) by (apply lt_0_INR; exact Hn_pos).
418+ assert (HINRn_nz : INR n <> 0) by lra.
419+ apply Rmult_le_reg_r with (r := INR n).
420+ - exact HINRn_pos.
421+ - replace (1 / INR n * INR n) with 1 by (field; exact HINRn_nz).
422+ rewrite Rmult_comm.
423+ lra.
424+ Qed .
425+
426+ (* ====================================================================
427+ End of Session 2.
237428
238429 Landed this session:
239- §1 finSum over Fin.t n with zero / ext / nonneg / le /
240- singleton-le-total lemmas (pigeonhole kernel).
241- §2 Probability-distribution predicate plus three basic
242- consequences (non-negativity / sum-one projection /
243- coordinatewise upper bound at 1).
244-
245- Session 2 target:
246- §3 Import tangent-line bound ln x <= x - 1 (Stdlib extended
247- via Coquelicot.ElemFct for the y < 0 case) + its equality-
248- at-1 side condition.
249- §4 Shannon entropy H(p) = - finSum n (fun i => p i * ln (p i)).
250- §5 Gibbs' inequality.
251- §6 Uniform-distribution maximum H(p) <= ln n (= log n in R).
252-
253- Session 3+: Riemann-integral continuous version on [0, 1].
254- Session 4+: Lebesgue + Boltzmann operator.
430+ §3 finSum add / scale / self-square-nonneg / null-implies-zero;
431+ cauchy_schwarz_finSum (n-dim Cauchy-Schwarz inequality,
432+ Qed-closed via polynomial-non-negativity / discriminant
433+ route — same proof shape as S4_heisenberg_ndim.v's Rung-1
434+ theorem, duplicated here because canonical-proof-suite
435+ files compile independently).
436+ §4 finSum_const_1 (sum of the constant-1 function = INR n);
437+ prob_dist_sum_squares_ge_inv_n — the *rung-1 theorem*.
438+ For any probability distribution p on n >= 1 points,
439+ `finSum n (p i * p i) >= 1/n`, equality at the uniform
440+ distribution. This is the arithmetic kernel underneath
441+ `H(p) <= ln n`: the next step is Jensen applied to ln on
442+ the square-sum floor.
443+
444+ Session 3 target:
445+ §5 ln-based Shannon entropy definition + `ln x <= x - 1`
446+ tangent-line bound (requires either `Coquelicot.ElemFct`
447+ or a convexity-based derivation of the y < 0 case of
448+ `exp y >= 1 + y`).
449+ §6 Gibbs inequality, then H(p) <= ln n via Jensen.
450+
451+ Session 4+: Riemann / Lebesgue / Boltzmann rungs.
255452 ==================================================================== *)
0 commit comments