@lapxo/obligations 0.4.5 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +42 -3
  2. package/TARGET.bound +148 -42
  3. package/contracts/extension-lineage-participation.json +30 -0
  4. package/contracts/m0-binomial-bridge.json +6 -0
  5. package/contracts/m0-diagonal-conditional.json +15 -0
  6. package/contracts/m0-keff-interval.json +27 -0
  7. package/contracts/m0-moment-identification.json +42 -0
  8. package/contracts/m1-diagonal-regions.json +45 -0
  9. package/contracts/m1-generator-binomial.json +26 -0
  10. package/contracts/m1-offdiag-limit.json +42 -0
  11. package/contracts/m1-subcauses.json +66 -0
  12. package/contracts/model-collapse-1a.json +16 -0
  13. package/contracts/projection-chain.json +20 -0
  14. package/docs/contracts/experiment1a-public-attribution.md +1 -0
  15. package/docs/contracts/extension-lineage-participation.md +13 -0
  16. package/docs/contracts/installation-046-inputs.md +1 -0
  17. package/docs/contracts/m0-binomial-bridge.md +1 -0
  18. package/docs/contracts/m0-diagonal-lindeberg.md +1 -0
  19. package/docs/contracts/m0-diagonal-moments.md +1 -0
  20. package/docs/contracts/m0-diagonal-symmetric.md +1 -0
  21. package/docs/contracts/m0-diagonal-threshold.md +1 -0
  22. package/docs/contracts/m0-keff-floor-refutation.md +1 -0
  23. package/docs/contracts/m0-keff-interval.md +1 -0
  24. package/docs/contracts/m0-moment-identification.md +1 -0
  25. package/docs/contracts/m0-refuted-inverses.md +1 -0
  26. package/docs/contracts/m0-wf-floor-refutation.md +1 -0
  27. package/docs/contracts/m1-diagonal-regions.md +1 -0
  28. package/docs/contracts/m1-generator-binomial.md +1 -0
  29. package/docs/contracts/m1-offdiag-limit.md +1 -0
  30. package/docs/contracts/model-collapse-1a.md +11 -0
  31. package/docs/contracts/projection-chain.md +1 -0
  32. package/package.json +1 -1
  33. package/proofs/definitions-046/declaration.json +11 -0
  34. package/proofs/experiment1a-046/declaration.json +11 -0
  35. package/proofs/m0-046/BridgeNegatives.lean +23 -0
  36. package/proofs/m0-046/M0Bridge.lean +300 -0
  37. package/proofs/m0-046/Obligations045/ConsensusGrid.lean +72 -0
  38. package/proofs/m0-046/Obligations045/M0Coincidence.lean +39 -0
  39. package/proofs/m0-046/Obligations045/M0Diagonal.lean +18 -0
  40. package/proofs/m0-046/Obligations045/M0Limit.lean +134 -0
  41. package/proofs/m0-046/Obligations045/M0Offdiag.lean +171 -0
  42. package/proofs/m0-046/Obligations045.lean +5 -0
  43. package/proofs/m0-046/lake-manifest.json +116 -0
  44. package/proofs/m0-046/lakefile.toml +14 -0
  45. package/proofs/m0-046/lean-toolchain +1 -0
  46. package/proofs/m0-046-diagonal/BridgeNegatives.lean +23 -0
  47. package/proofs/m0-046-diagonal/M0Bridge.lean +300 -0
  48. package/proofs/m0-046-diagonal/M0Diagonal046.lean +235 -0
  49. package/proofs/m0-046-diagonal/M0Lindeberg046.lean +92 -0
  50. package/proofs/m0-046-diagonal/M0Moments046.lean +295 -0
  51. package/proofs/m0-046-diagonal/M0Threshold046.lean +278 -0
  52. package/proofs/m0-046-diagonal/Obligations045/ConsensusGrid.lean +72 -0
  53. package/proofs/m0-046-diagonal/Obligations045/M0Coincidence.lean +39 -0
  54. package/proofs/m0-046-diagonal/Obligations045/M0Diagonal.lean +18 -0
  55. package/proofs/m0-046-diagonal/Obligations045/M0Limit.lean +134 -0
  56. package/proofs/m0-046-diagonal/Obligations045/M0Offdiag.lean +171 -0
  57. package/proofs/m0-046-diagonal/Obligations045.lean +5 -0
  58. package/proofs/m0-046-diagonal/lake-manifest.json +116 -0
  59. package/proofs/m0-046-diagonal/lakefile.toml +26 -0
  60. package/proofs/m0-046-diagonal/lean-toolchain +1 -0
  61. package/proofs/m0-046-identification/M0Identification046.lean +209 -0
  62. package/proofs/m0-046-identification/Obligations045/M0Coincidence.lean +39 -0
  63. package/proofs/m0-046-identification/lake-manifest.json +116 -0
  64. package/proofs/m0-046-identification/lakefile.toml +12 -0
  65. package/proofs/m0-046-identification/lean-toolchain +1 -0
  66. package/proofs/m0-046-uncertainty/BridgeNegatives.lean +23 -0
  67. package/proofs/m0-046-uncertainty/M0BlockCoverage046.lean +163 -0
  68. package/proofs/m0-046-uncertainty/M0Bridge.lean +300 -0
  69. package/proofs/m0-046-uncertainty/M0Diagonal046.lean +235 -0
  70. package/proofs/m0-046-uncertainty/M0FiniteDiscord046.lean +207 -0
  71. package/proofs/m0-046-uncertainty/M0Interval046.lean +82 -0
  72. package/proofs/m0-046-uncertainty/M0Lindeberg046.lean +92 -0
  73. package/proofs/m0-046-uncertainty/M0Moments046.lean +295 -0
  74. package/proofs/m0-046-uncertainty/M0Threshold046.lean +278 -0
  75. package/proofs/m0-046-uncertainty/Obligations045/ConsensusGrid.lean +72 -0
  76. package/proofs/m0-046-uncertainty/Obligations045/M0Coincidence.lean +39 -0
  77. package/proofs/m0-046-uncertainty/Obligations045/M0Diagonal.lean +18 -0
  78. package/proofs/m0-046-uncertainty/Obligations045/M0Limit.lean +134 -0
  79. package/proofs/m0-046-uncertainty/Obligations045/M0Offdiag.lean +171 -0
  80. package/proofs/m0-046-uncertainty/Obligations045.lean +5 -0
  81. package/proofs/m0-046-uncertainty/lake-manifest.json +116 -0
  82. package/proofs/m0-046-uncertainty/lakefile.toml +35 -0
  83. package/proofs/m0-046-uncertainty/lean-toolchain +1 -0
  84. package/proofs/m1-046-bridge/M0Bridge.lean +300 -0
  85. package/proofs/m1-046-bridge/M1Bridge046.lean +359 -0
  86. package/proofs/m1-046-bridge/Obligations045/M0Limit.lean +134 -0
  87. package/proofs/m1-046-bridge/Obligations045/M0Offdiag.lean +171 -0
  88. package/proofs/m1-046-bridge/lake-manifest.json +116 -0
  89. package/proofs/m1-046-bridge/lakefile.toml +29 -0
  90. package/proofs/m1-046-bridge/lean-toolchain +1 -0
  91. package/proofs/m1-046-diagonal/M0Bridge.lean +300 -0
  92. package/proofs/m1-046-diagonal/M0Diagonal046.lean +235 -0
  93. package/proofs/m1-046-diagonal/M0Lindeberg046.lean +92 -0
  94. package/proofs/m1-046-diagonal/M0Moments046.lean +295 -0
  95. package/proofs/m1-046-diagonal/M0Threshold046.lean +278 -0
  96. package/proofs/m1-046-diagonal/M1Bridge046.lean +359 -0
  97. package/proofs/m1-046-diagonal/M1Diagonal046.lean +334 -0
  98. package/proofs/m1-046-diagonal/M1Offdiag046.lean +270 -0
  99. package/proofs/m1-046-diagonal/Obligations045/M0Limit.lean +134 -0
  100. package/proofs/m1-046-diagonal/Obligations045/M0Offdiag.lean +171 -0
  101. package/proofs/m1-046-diagonal/lake-manifest.json +116 -0
  102. package/proofs/m1-046-diagonal/lakefile.toml +35 -0
  103. package/proofs/m1-046-diagonal/lean-toolchain +1 -0
  104. package/proofs/m1-046-offdiag/M0Bridge.lean +300 -0
  105. package/proofs/m1-046-offdiag/M0Diagonal046.lean +235 -0
  106. package/proofs/m1-046-offdiag/M0Moments046.lean +295 -0
  107. package/proofs/m1-046-offdiag/M1Bridge046.lean +359 -0
  108. package/proofs/m1-046-offdiag/M1Offdiag046.lean +270 -0
  109. package/proofs/m1-046-offdiag/Obligations045/M0Limit.lean +134 -0
  110. package/proofs/m1-046-offdiag/Obligations045/M0Offdiag.lean +171 -0
  111. package/proofs/m1-046-offdiag/lake-manifest.json +116 -0
  112. package/proofs/m1-046-offdiag/lakefile.toml +32 -0
  113. package/proofs/m1-046-offdiag/lean-toolchain +1 -0
  114. package/proofs/projection-chain.md +11 -0
  115. package/protocols/model-collapse-1a.json +108 -0
  116. package/receipts.bound +578 -210
  117. package/samples/laws/definitions/no/sample.json +26 -0
  118. package/samples/laws/definitions/yes/sample.json +12 -0
  119. package/samples/laws/experiment1a/no/sample.json +16 -0
  120. package/samples/laws/experiment1a/yes/sample.json +8 -0
  121. package/samples/laws/m0-binomial-bridge/no/pairwise-is-not-joint.json +59 -0
  122. package/samples/laws/m0-binomial-bridge/no/sample.json +13 -0
  123. package/samples/laws/m0-binomial-bridge/yes/sample.json +16 -0
  124. package/samples/laws/m0-binomial-bridge/yes/small-binomial-table.json +100 -0
  125. package/samples/laws/m0-diagonal-conditional/no/sample.json +5 -0
  126. package/samples/laws/m0-diagonal-conditional/yes/sample.json +7 -0
  127. package/samples/laws/m0-keff-interval/no/sample.json +215 -0
  128. package/samples/laws/m0-keff-interval/yes/api-rows.json +2002 -0
  129. package/samples/laws/m0-keff-interval/yes/sample.json +70 -0
  130. package/samples/laws/m0-moment-identification/no/sample.json +47 -0
  131. package/samples/laws/m0-moment-identification/yes/sample.json +97 -0
  132. package/samples/laws/m1-diagonal-regions/no/sample.json +44 -0
  133. package/samples/laws/m1-diagonal-regions/yes/sample.json +45 -0
  134. package/samples/laws/m1-generator-binomial/no/sample.json +21 -0
  135. package/samples/laws/m1-generator-binomial/yes/sample.json +290 -0
  136. package/samples/laws/m1-offdiag-limit/no/sample.json +17 -0
  137. package/samples/laws/m1-offdiag-limit/yes/sample.json +87 -0
  138. package/samples/laws/projection-chain/no/sample.json +26 -0
  139. package/samples/laws/projection-chain/yes/sample.json +25 -0
  140. package/samples/no/installed-artifact.json +2 -2
  141. package/samples/yes/installed-artifact.json +2 -2
  142. package/src/laws/laws.bound +146 -0
  143. package/vectors/laws/a7-t90.json +72 -0
  144. package/vectors/laws/a9-t99.json +110 -0
  145. package/vectors/laws/definitions.native-capture.json +326 -0
  146. package/vectors/laws/definitions.native.json +82 -0
  147. package/vectors/laws/experiment1a-protocol.native-capture.json +391 -0
  148. package/vectors/laws/experiment1a-protocol.native.json +64 -0
  149. package/vectors/laws/experiment1a-public-input.native-capture.json +224 -0
  150. package/vectors/laws/m0-binomial-bridge.lean.json +185 -0
  151. package/vectors/laws/m0-diagonal-lindeberg.lean.json +167 -0
  152. package/vectors/laws/m0-diagonal-moments.lean.json +185 -0
  153. package/vectors/laws/m0-diagonal-symmetric.lean.json +188 -0
  154. package/vectors/laws/m0-diagonal-threshold.lean.json +199 -0
  155. package/vectors/laws/m0-identification.lean.json +136 -0
  156. package/vectors/laws/m0-identification.native-capture.json +230 -0
  157. package/vectors/laws/m0-keff-interval.json +569 -0
  158. package/vectors/laws/m0-uncertainty-blocks.lean.json +201 -0
  159. package/vectors/laws/m0-uncertainty-finite-discord.lean.json +194 -0
  160. package/vectors/laws/m0-uncertainty-interval.lean.json +189 -0
  161. package/vectors/laws/m0-uncertainty.native-capture.json +651 -0
  162. package/vectors/laws/m1-diagonal-partial.lean.json +192 -0
  163. package/vectors/laws/m1-diagonal-partial.native-capture.json +275 -0
  164. package/vectors/laws/m1-generator-binomial.lean.json +162 -0
  165. package/vectors/laws/m1-generator-binomial.native-capture.json +245 -0
  166. package/vectors/laws/m1-offdiag-limit.lean.json +166 -0
  167. package/vectors/laws/m1-offdiag-limit.native-capture.json +260 -0
  168. package/vectors/laws/model-collapse-1a.json +12 -0
  169. package/vectors/laws/projection-chain.json +61 -0
  170. package/vectors/laws/projection-chain.native-capture.json +311 -0
  171. package/vectors/laws/projection-chain.native.json +56 -0
  172. package/vectors/measures/installed-artifact.cli.json +6 -6
  173. package/CHANGELOG.md +0 -10
@@ -0,0 +1,300 @@
1
+ import Obligations045.M0Offdiag
2
+ import Mathlib.Data.Nat.Choose.Sum
3
+ import Mathlib.Probability.ProbabilityMassFunction.Integrals
4
+ import Mathlib.Algebra.BigOperators.Group.Finset.Pi
5
+
6
+ open scoped BigOperators
7
+ open MeasureTheory ProbabilityTheory Filter Topology
8
+ noncomputable section
9
+ open Classical
10
+ namespace Obligations046.Bridge
11
+
12
+ def count {n : ℕ} (s : Finset (Fin n)) : Fin (n+1) :=
13
+ ⟨s.card, Nat.lt_succ_of_le (by simpa using s.card_le_univ)⟩
14
+ def mass (p : ℝ) {n : ℕ} (s : Finset (Fin n)) : ℝ :=
15
+ p^s.card*(1-p)^(n-s.card)
16
+ def binMass (p : ℝ) (n : ℕ) (k : Fin (n+1)) : ℝ :=
17
+ (n.choose k : ℝ)*p^(k:ℕ)*(1-p)^(n-(k:ℕ))
18
+
19
+ theorem count_fiber_mass (p : ℝ) (n : ℕ) (k : Fin (n+1)) :
20
+ (∑ s : Finset (Fin n), if count s = k then mass p s else 0) = binMass p n k := by
21
+ have hfilter : Finset.univ.filter (fun s : Finset (Fin n) => count s = k) =
22
+ Finset.powersetCard (k:ℕ) (Finset.univ : Finset (Fin n)) := by
23
+ ext s
24
+ simp [count, Fin.ext_iff, Finset.mem_powersetCard]
25
+ rw [← Finset.sum_filter, hfilter]
26
+ calc
27
+ _ = ∑ _s ∈ Finset.powersetCard (k:ℕ) (Finset.univ : Finset (Fin n)),
28
+ p^(k:ℕ)*(1-p)^(n-(k:ℕ)) := by
29
+ apply Finset.sum_congr rfl
30
+ intro s hs
31
+ simp only [Finset.mem_powersetCard] at hs
32
+ simp [mass, hs.2]
33
+ _ = binMass p n k := by
34
+ simp [binMass, Finset.card_powersetCard, nsmul_eq_mul, mul_assoc]
35
+
36
+ /-- Finite product-law pushforward, before any choice of Bernoulli parameters. -/
37
+ theorem product_pushforward {ι : Type*} [Fintype ι] [DecidableEq ι]
38
+ {S T : ι → Type*} [∀ i, Fintype (S i)] [∀ i, Fintype (T i)]
39
+ [∀ i, DecidableEq (T i)] (m : ∀ i, S i → ℝ) (c : ∀ i, S i → T i)
40
+ (f : (∀ i, T i) → ℝ) :
41
+ (∑ x : ∀ i, S i, (∏ i, m i (x i))*f (fun i => c i (x i))) =
42
+ ∑ k : ∀ i, T i, (∏ i, ∑ s : S i, if c i s = k i then m i s else 0)*f k := by
43
+ have gate (x : ∀ i, S i) (k : ∀ i, T i) :
44
+ (∏ i, if c i (x i) = k i then m i (x i) else 0) =
45
+ if (fun i => c i (x i)) = k then ∏ i, m i (x i) else 0 := by
46
+ by_cases h : (fun i => c i (x i)) = k
47
+ · subst k
48
+ simp
49
+ · rw [if_neg h]
50
+ have h' : ∃ i, c i (x i) ≠ k i := by
51
+ by_contra hn
52
+ push_neg at hn
53
+ exact h (funext hn)
54
+ obtain ⟨i, hi⟩ := h'
55
+ exact Finset.prod_eq_zero (Finset.mem_univ i) (by simp [hi])
56
+ symm
57
+ simp_rw [Fintype.prod_sum, Finset.sum_mul]
58
+ rw [Finset.sum_comm]
59
+ apply Finset.sum_congr rfl
60
+ intro x _
61
+ simp_rw [gate, ite_mul, zero_mul]
62
+ simp
63
+
64
+ /-- Raw individual Bernoulli outcomes are subsets of named member indices. -/
65
+ abbrev World {ι : Type*} (n : ι → ℕ) := ∀ i, Finset (Fin (n i))
66
+ instance worldMeasurableSpace {ι : Type*} (n : ι → ℕ) : MeasurableSpace (World n) := ⊤
67
+ instance worldDiscreteMeasurable {ι : Type*} (n : ι → ℕ) : DiscreteMeasurableSpace (World n) := ⟨fun _ => trivial⟩
68
+
69
+ def jointMass {ι : Type*} [Fintype ι] (n : ι → ℕ) (p : ι → ℝ)
70
+ (x : World n) : ℝ := ∏ i, mass (p i) (x i)
71
+
72
+ theorem joint_count_pushforward {ι : Type*} [Fintype ι] [DecidableEq ι]
73
+ (n : ι → ℕ) (p : ι → ℝ) (f : (∀ i, Fin (n i+1)) → ℝ) :
74
+ (∑ x : World n, jointMass n p x*f (fun i => count (x i))) =
75
+ ∑ k : ∀ i, Fin (n i+1), (∏ i, binMass (p i) (n i) (k i))*f k := by
76
+ simpa [jointMass, count_fiber_mass] using
77
+ product_pushforward (fun i => mass (p i)) (fun _ => count) f
78
+
79
+ theorem mass_sum (p : ℝ) (n : ℕ) :
80
+ ∑ s : Finset (Fin n), mass p s = 1 := by
81
+ have h := Finset.sum_powerset_apply_card (fun k => p^k*(1-p)^(n-k))
82
+ (x := (Finset.univ : Finset (Fin n)))
83
+ simp only [Finset.powerset_univ, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] at h
84
+ change (∑ s : Finset (Fin n), p^s.card*(1-p)^(n-s.card)) = 1
85
+ rw [h]
86
+ calc
87
+ _ = (p+(1-p))^n := by
88
+ rw [add_pow]
89
+ apply Finset.sum_congr rfl
90
+ intro k _
91
+ ring
92
+ _ = 1 := by simp
93
+
94
+ theorem mass_nonneg (p : ℝ) (hp : 0 ≤ p) (hp1 : p ≤ 1)
95
+ {n : ℕ} (s : Finset (Fin n)) : 0 ≤ mass p s :=
96
+ mul_nonneg (pow_nonneg hp _) (pow_nonneg (sub_nonneg.mpr hp1) _)
97
+
98
+ theorem jointMass_sum {ι : Type*} [Fintype ι] [DecidableEq ι]
99
+ (n : ι → ℕ) (p : ι → ℝ) : ∑ x : World n, jointMass n p x = 1 := by
100
+ simp only [jointMass, ← Fintype.prod_sum, mass_sum, Finset.prod_const_one]
101
+
102
+ def memberLaw {ι : Type*} [Fintype ι] [DecidableEq ι]
103
+ (n : ι → ℕ) (p : ι → ℝ) (hp : ∀ i, 0 ≤ p i) (hp1 : ∀ i, p i ≤ 1) :
104
+ PMF (World n) :=
105
+ PMF.ofFintype (fun x => ENNReal.ofReal (jointMass n p x)) (by
106
+ rw [← ENNReal.ofReal_sum_of_nonneg]
107
+ · simp [jointMass_sum]
108
+ · intro x _
109
+ exact Finset.prod_nonneg (fun i _ => mass_nonneg (p i) (hp i) (hp1 i) (x i)))
110
+
111
+ theorem memberLaw_expectation {ι : Type*} [Fintype ι] [DecidableEq ι]
112
+ (n : ι → ℕ) (p : ι → ℝ) (hp : ∀ i, 0 ≤ p i) (hp1 : ∀ i, p i ≤ 1)
113
+ (f : World n → ℝ) :
114
+ (∫ x, f x ∂(memberLaw n p hp hp1).toMeasure) =
115
+ ∑ x : World n, jointMass n p x*f x := by
116
+ rw [PMF.integral_eq_sum]
117
+ apply Finset.sum_congr rfl
118
+ intro x _
119
+ simp only [memberLaw, PMF.ofFintype_apply, smul_eq_mul]
120
+ have hm : 0 ≤ jointMass n p x := Finset.prod_nonneg
121
+ (fun i _ => mass_nonneg (p i) (hp i) (hp1 i) (x i))
122
+ rw [ENNReal.toReal_ofReal hm]
123
+
124
+ open Obligations045.M0
125
+ abbrev sizes (M : Domain) (N : ℕ) (i : Fin M.K) := allocation M.w N i
126
+ def modelLaw (M : Domain) (N : ℕ) (a : Fin M.K → Bool) : PMF (World (sizes M N)) :=
127
+ memberLaw (sizes M N) (fun i => q M (a i))
128
+ (fun i => (q_pos M (a i)).le) (fun i => (q_lt_one M (a i)).le)
129
+ def correctCount {ι : Type*} [Fintype ι] {n : ι → ℕ} (x : World n) : ℕ :=
130
+ ∑ i, (x i).card
131
+
132
+ /-- Exact finite expectation of individual Bernoulli member outcomes, not an assumed count law. -/
133
+ theorem conditional_error_representation (M : Domain) (N : ℕ) (a : Fin M.K → Bool) :
134
+ (∫ x, fairLoss (correctCount x) N ∂(modelLaw M N a).toMeasure) =
135
+ conditionalError M N a := by
136
+ rw [modelLaw, memberLaw_expectation]
137
+ have h := joint_count_pushforward (sizes M N) (fun i => q M (a i))
138
+ (fun k => fairLoss (∑ i, (k i : ℕ)) N)
139
+ simpa [conditionalError, binMass, count, correctCount, sizes] using h
140
+
141
+ /-- N=0 has fairLoss=1/2; it is not the average bridge. -/
142
+ theorem conditional_error_zero (M : Domain) (a : Fin M.K → Bool) :
143
+ conditionalError M 0 a = 1/2 := by
144
+ rw [← conditional_error_representation]
145
+ have hz : ∀ x : World (sizes M 0), correctCount x = 0 := by
146
+ intro x
147
+ have h : ∀ i, x i = ∅ := by
148
+ intro i
149
+ apply Finset.eq_empty_iff_forall_not_mem.mpr
150
+ intro j _
151
+ have hj := j.isLt
152
+ simp [sizes, allocation] at hj
153
+ simp [correctCount, h]
154
+ simp [hz, fairLoss]
155
+
156
+ theorem fair_loss_average_bridge (total N : ℕ) (hN : 0 < N) :
157
+ fairLoss total N = limitingLoss ((total:ℝ)/(N:ℝ)) := by
158
+ have hn : (0:ℝ) < N := by exact_mod_cast hN
159
+ have hlt : (total:ℝ)/(N:ℝ) < (1:ℝ)/2 ↔ 2*total < N := by
160
+ rw [div_lt_iff₀ hn]
161
+ constructor
162
+ · intro h
163
+ exact_mod_cast (show (2:ℝ)*total < N by linarith)
164
+ · intro h
165
+ have h' : (2:ℝ)*total < N := by exact_mod_cast h
166
+ linarith
167
+ have heq : (total:ℝ)/(N:ℝ) = (1:ℝ)/2 ↔ 2*total = N := by
168
+ rw [div_eq_iff hn.ne']
169
+ constructor
170
+ · intro h
171
+ exact_mod_cast (show (2:ℝ)*total = N by linarith)
172
+ · intro h
173
+ have h' : (2:ℝ)*total = N := by exact_mod_cast h
174
+ linarith
175
+ unfold fairLoss limitingLoss
176
+ simp only [hlt, heq]
177
+
178
+ /-- Probability of every joint count event, derived from raw member product probabilities. -/
179
+ theorem lineage_count_binomial_law {ι : Type*} [Fintype ι] [DecidableEq ι]
180
+ (n : ι → ℕ) (p : ι → ℝ) (hp : ∀ i, 0 ≤ p i) (hp1 : ∀ i, p i ≤ 1)
181
+ (k : ∀ i, Fin (n i+1)) :
182
+ (∫ x, if (fun i => count (x i)) = k then (1:ℝ) else 0
183
+ ∂(memberLaw n p hp hp1).toMeasure) = ∏ i, binMass (p i) (n i) (k i) := by
184
+ rw [memberLaw_expectation]
185
+ simpa using joint_count_pushforward n p (fun z => if z = k then (1:ℝ) else 0)
186
+
187
+ /-- The snapshot retains individual named Bernoulli outcomes; it is not a count-law certificate. -/
188
+ def snapshot {Ω : Type*} (M : Domain) (N : ℕ)
189
+ (X : Fin M.K → ℕ → Ω → Bool) (ω : Ω) : World (sizes M N) :=
190
+ fun i => Finset.univ.filter (fun j : Fin (sizes M N i) => X i j ω)
191
+ def indicator {Ω : Type*} {K : ℕ} (X : Fin K → ℕ → Ω → Bool) : Fin K → ℕ → Ω → ℝ :=
192
+ fun i j ω => if X i j ω then 1 else 0
193
+
194
+ theorem snapshot_card {Ω : Type*} (M : Domain) (N : ℕ)
195
+ (X : Fin M.K → ℕ → Ω → Bool) (ω : Ω) (i : Fin M.K) :
196
+ (((snapshot M N X ω) i).card : ℝ) =
197
+ ∑ j ∈ Finset.range (allocation M.w N i), indicator X i j ω := by
198
+ simp only [snapshot, Finset.card_filter, Nat.cast_sum, Nat.cast_ite,
199
+ Nat.cast_one, Nat.cast_zero, indicator]
200
+ exact Fin.sum_univ_eq_sum_range (fun j => if X i j ω then (1:ℝ) else 0) _
201
+
202
+ theorem snapshot_average {Ω : Type*} (M : Domain) (N : ℕ)
203
+ (X : Fin M.K → ℕ → Ω → Bool) (ω : Ω) :
204
+ memberAverage M (indicator X) N ω = (correctCount (snapshot M N X ω):ℝ)/(N:ℝ) := by
205
+ simp only [memberAverage, correctCount, Nat.cast_sum, snapshot_card, Finset.sum_div]
206
+
207
+ /-- Transfer from a declared joint Bernoulli MEMBER law on an ambient probability space.
208
+ hproduct names all raw bits, not counts, their expectation, or a tail/convergence law. -/
209
+ theorem ambient_conditional_error_representation {Ω : Type*} [MeasurableSpace Ω]
210
+ (M : Domain) (N : ℕ) (a : Fin M.K → Bool) (μ : Measure Ω)
211
+ (X : Fin M.K → ℕ → Ω → Bool) (hN : 0 < N)
212
+ (hmeas : AEMeasurable (snapshot M N X) μ)
213
+ (hproduct : Measure.map (snapshot M N X) μ = (modelLaw M N a).toMeasure) :
214
+ (∫ ω, limitingLoss (memberAverage M (indicator X) N ω) ∂μ) =
215
+ conditionalError M N a := by
216
+ have hpoint : (fun ω => limitingLoss (memberAverage M (indicator X) N ω)) =
217
+ (fun ω => fairLoss (correctCount (snapshot M N X ω)) N) := by
218
+ funext ω
219
+ rw [snapshot_average, fair_loss_average_bridge _ _ hN]
220
+ rw [hpoint]
221
+ have hf : AEStronglyMeasurable (fun x : World (sizes M N) => fairLoss (correctCount x) N)
222
+ (Measure.map (snapshot M N X) μ) := Measurable.of_discrete.stronglyMeasurable.aestronglyMeasurable
223
+ rw [← integral_map hmeas hf, hproduct, conditional_error_representation]
224
+
225
+ theorem mixture_error_representation {Ω : Type*} [MeasurableSpace Ω]
226
+ (M : Domain) (N : ℕ) (μ : Measure Ω)
227
+ (X : (Fin M.K → Bool) → Fin M.K → ℕ → Ω → Bool) (hN : 0 < N)
228
+ (hmeas : ∀ a, AEMeasurable (snapshot M N (X a)) μ)
229
+ (hproduct : ∀ a, Measure.map (snapshot M N (X a)) μ = (modelLaw M N a).toMeasure) :
230
+ error M N = ∑ a : Fin M.K → Bool, latentMass M a *
231
+ ∫ ω, limitingLoss (memberAverage M (indicator (X a)) N ω) ∂μ := by
232
+ unfold error
233
+ apply Finset.sum_congr rfl
234
+ intro a _
235
+ rw [ambient_conditional_error_representation M N a μ (X a) hN (hmeas a) (hproduct a)]
236
+
237
+ /-- The implementation limit follows from the old model theorem and the new representation bridge.
238
+ No CLT, diagonal theorem, count-law certificate, or convergence premise is assumed. -/
239
+ theorem computational_offdiag_limit {Ω : Type*} [MeasurableSpace Ω]
240
+ (M : Domain) (μ : Measure Ω) [IsProbabilityMeasure μ]
241
+ (X : (Fin M.K → Bool) → Fin M.K → ℕ → Ω → Bool)
242
+ (hsnapshot : ∀ a N, AEMeasurable (snapshot M N (X a)) μ)
243
+ (hproduct : ∀ a N, Measure.map (snapshot M N (X a)) μ = (modelLaw M N a).toMeasure)
244
+ (hint : ∀ a i, Integrable (indicator (X a) i 0) μ)
245
+ (hindep : ∀ a i, Pairwise (fun j k : ℕ => IndepFun (indicator (X a) i j) (indicator (X a) i k) μ))
246
+ (hident : ∀ a i j, IdentDistrib (indicator (X a) i j) (indicator (X a) i 0) μ μ)
247
+ (hmean : ∀ a i, ∫ ω, indicator (X a) i 0 ω ∂μ = q M (a i))
248
+ (hmeas : ∀ a N, AEStronglyMeasurable
249
+ (fun ω => limitingLoss (memberAverage M (indicator (X a)) N ω)) μ)
250
+ (hoff : ∀ a, score M a ≠ (1:ℝ)/2) :
251
+ Tendsto (error M) atTop (𝓝 (floor M)) := by
252
+ have h := floor_limit_offdiag_mixture M μ (fun a => indicator (X a))
253
+ hint hindep hident hmean hmeas hoff
254
+ have heq : (fun N => error M N) =ᶠ[atTop]
255
+ (fun N => ∑ a : Fin M.K → Bool, latentMass M a *
256
+ ∫ ω, limitingLoss (memberAverage M (indicator (X a)) N ω) ∂μ) := by
257
+ filter_upwards [eventually_ge_atTop 1] with N hN
258
+ exact mixture_error_representation M N μ X (lt_of_lt_of_le Nat.zero_lt_one hN)
259
+ (fun a => hsnapshot a N) (fun a => hproduct a N)
260
+ exact h.congr' heq.symm
261
+
262
+ /-- The starting probability is the product over NAMED INDIVIDUAL bits, with no binomial factor. -/
263
+ theorem mass_eq_individual_product (p : ℝ) {n : ℕ} (s : Finset (Fin n)) :
264
+ mass p s = ∏ j : Fin n, if j ∈ s then p else 1-p := by
265
+ have hc : (Finset.univ.filter (fun j : Fin n => j ∉ s)) = sᶜ := by
266
+ ext j
267
+ simp
268
+ rw [Finset.prod_ite]
269
+ simp [mass, Finset.filter_mem_eq_inter, hc, Finset.card_compl]
270
+
271
+ theorem memberLaw_individual_probability {ι : Type*} [Fintype ι] [DecidableEq ι]
272
+ (n : ι → ℕ) (p : ι → ℝ) (hp : ∀ i, 0 ≤ p i) (hp1 : ∀ i, p i ≤ 1)
273
+ (x : World n) :
274
+ ((memberLaw n p hp hp1) x).toReal =
275
+ ∏ i, ∏ j : Fin (n i), if j ∈ x i then p i else 1-p i := by
276
+ simp only [memberLaw, PMF.ofFintype_apply]
277
+ have hm : 0 ≤ jointMass n p x := Finset.prod_nonneg
278
+ (fun i _ => mass_nonneg (p i) (hp i) (hp1 i) (x i))
279
+ rw [ENNReal.toReal_ofReal hm]
280
+ simp only [jointMass, mass_eq_individual_product]
281
+
282
+ theorem zero_average_counterexample : fairLoss 0 0 ≠ limitingLoss ((0:ℝ)/0) := by
283
+ norm_num [fairLoss, limitingLoss]
284
+
285
+ theorem latentMass_sum (M : Domain) : ∑ a : Fin M.K → Bool, latentMass M a = 1 := by
286
+ have h := (Fintype.prod_sum (fun (_i : Fin M.K) (b : Bool) =>
287
+ if b then M.p else 1-M.p)).symm
288
+ simpa [latentMass] using h
289
+
290
+ /-- The finite mixture itself equals the existing implementation for EVERY N,
291
+ including zero. Its product-Bernoulli latent weights sum to one. -/
292
+ theorem model_mixture_error_representation (M : Domain) (N : ℕ) :
293
+ (∑ a : Fin M.K → Bool, latentMass M a *
294
+ ∫ x, fairLoss (correctCount x) N ∂(modelLaw M N a).toMeasure) = error M N := by
295
+ unfold error
296
+ apply Finset.sum_congr rfl
297
+ intro a _
298
+ rw [conditional_error_representation]
299
+
300
+ end Obligations046.Bridge
@@ -0,0 +1,235 @@
1
+ import M0Bridge
2
+ import Lean.Elab.Tactic.Omega
3
+ open scoped BigOperators
4
+ open Filter Topology
5
+ noncomputable section
6
+ open Classical Obligations045.M0
7
+ namespace Obligations046.Diagonal
8
+
9
+ /-- Deterministic mean and Bernoulli variance of the declared product law.
10
+ The probabilistic CLT is not an assumption of either definition. -/
11
+ def mean (M : Domain) (a : Fin M.K → Bool) (N : ℕ) : ℝ :=
12
+ ∑ i : Fin M.K, (allocation M.w N i : ℝ) * q M (a i)
13
+ def variance (M : Domain) (a : Fin M.K → Bool) (N : ℕ) : ℝ :=
14
+ ∑ i : Fin M.K, (allocation M.w N i : ℝ) * (q M (a i) * (1-q M (a i)))
15
+ def varianceRate (M : Domain) (a : Fin M.K → Bool) : ℝ :=
16
+ ∑ i : Fin M.K, M.w i * (q M (a i) * (1-q M (a i)))
17
+ def varianceLower (M : Domain) : ℝ := (1-M.c)^2 * M.p * (1-M.p)
18
+
19
+ theorem weights_fin_sum (M : Domain) : ∑ i : Fin M.K, M.w i = 1 := by
20
+ simpa only [Fin.sum_univ_eq_sum_range] using M.weights_sum
21
+
22
+ theorem variance_lower_pos (M : Domain) : 0 < varianceLower M := by
23
+ have hp : 0 < M.p := by linarith [M.p_half]
24
+ unfold varianceLower
25
+ exact mul_pos (mul_pos (sq_pos_of_pos (by linarith [M.c_lt_one])) hp)
26
+ (by linarith [M.p_lt_one])
27
+
28
+ theorem bernoulli_variance_lower (M : Domain) (b : Bool) :
29
+ varianceLower M ≤ q M b * (1-q M b) := by
30
+ have hc : 0 ≤ 1-M.c := by linarith [M.c_lt_one]
31
+ have hp : 0 ≤ M.p := by linarith [M.p_half]
32
+ have hprod : 0 ≤ (1-M.c)*M.p := mul_nonneg hc hp
33
+ have hprod' : 0 ≤ (1-M.c)*(1-M.p) := mul_nonneg hc (by linarith [M.p_lt_one])
34
+ cases b <;> simp only [q, Bool.false_eq_true, ite_false, add_zero, ite_true]
35
+ · unfold varianceLower
36
+ nlinarith [mul_nonneg hprod M.c_nonneg]
37
+ · unfold varianceLower
38
+ nlinarith [mul_nonneg hprod' M.c_nonneg]
39
+
40
+ theorem variance_rate_pos (M : Domain) (a : Fin M.K → Bool) :
41
+ 0 < varianceRate M a := by
42
+ have h : varianceLower M ≤ varianceRate M a := by
43
+ calc
44
+ varianceLower M = ∑ i : Fin M.K, M.w i * varianceLower M := by
45
+ rw [← Finset.sum_mul, weights_fin_sum, one_mul]
46
+ _ ≤ varianceRate M a := Finset.sum_le_sum (fun i _ =>
47
+ mul_le_mul_of_nonneg_left (bernoulli_variance_lower M (a i)) (M.w_nonneg i))
48
+ exact lt_of_lt_of_le (variance_lower_pos M) h
49
+
50
+ theorem finite_variance_lower (M : Domain) (a : Fin M.K → Bool) (N : ℕ) :
51
+ (N:ℝ)*varianceLower M ≤ variance M a N := by
52
+ have hsum : ∑ i : Fin M.K, (allocation M.w N i : ℝ) = (N:ℝ) := by
53
+ exact_mod_cast (by simpa only [Fin.sum_univ_eq_sum_range] using allocation_sum M N)
54
+ calc
55
+ (N:ℝ)*varianceLower M = ∑ i : Fin M.K,
56
+ (allocation M.w N i : ℝ)*varianceLower M := by rw [← Finset.sum_mul, hsum]
57
+ _ ≤ variance M a N := Finset.sum_le_sum (fun i _ =>
58
+ mul_le_mul_of_nonneg_left (bernoulli_variance_lower M (a i)) (by positivity))
59
+
60
+ theorem mean_rounding_bound (M : Domain) (a : Fin M.K → Bool) (N : ℕ) :
61
+ |mean M a N - (N:ℝ)*score M a| ≤ (M.K:ℝ) := by
62
+ have heq : mean M a N - (N:ℝ)*score M a =
63
+ ∑ i : Fin M.K, ((allocation M.w N i : ℝ)-(N:ℝ)*M.w i)*q M (a i) := by
64
+ simp only [mean, score, Finset.mul_sum, ← Finset.sum_sub_distrib]
65
+ apply Finset.sum_congr rfl
66
+ intro i _
67
+ ring
68
+ rw [heq]
69
+ calc
70
+ _ ≤ ∑ i : Fin M.K, |((allocation M.w N i : ℝ)-(N:ℝ)*M.w i)*q M (a i)| :=
71
+ Finset.abs_sum_le_sum_abs _ _
72
+ _ ≤ ∑ _i : Fin M.K, (1:ℝ) := by
73
+ apply Finset.sum_le_sum
74
+ intro i _
75
+ rw [abs_mul, abs_of_pos (q_pos M (a i))]
76
+ have hdis : |(allocation M.w N i : ℝ)-(N:ℝ)*M.w i| ≤ 1 :=
77
+ abs_le.mpr ⟨le_of_lt (allocation_discrepancy M N i).1,
78
+ le_of_lt (allocation_discrepancy M N i).2⟩
79
+ exact (mul_le_mul_of_nonneg_right hdis (le_of_lt (q_pos M (a i)))).trans
80
+ (by simpa using le_of_lt (q_lt_one M (a i)))
81
+ _ = (M.K:ℝ) := by simp
82
+
83
+ theorem diagonal_mean_bound (M : Domain) (a : Fin M.K → Bool)
84
+ (hdiag : score M a = (1:ℝ)/2) (N : ℕ) :
85
+ |mean M a N - (N:ℝ)/2| ≤ (M.K:ℝ) := by
86
+ simpa only [hdiag, mul_one_div] using mean_rounding_bound M a N
87
+
88
+ theorem variance_rate_limit (M : Domain) (a : Fin M.K → Bool) :
89
+ Tendsto (fun N : ℕ => variance M a N / (N:ℝ)) atTop (𝓝 (varianceRate M a)) := by
90
+ have h := tendsto_finset_sum Finset.univ (fun (i : Fin M.K) _ =>
91
+ (allocation_ratio M i).mul_const (q M (a i)*(1-q M (a i))))
92
+ convert h using 1
93
+ funext N
94
+ simp only [variance, Finset.sum_div, div_mul_eq_mul_div]
95
+
96
+ /-- Variance really diverges for this fixed domain, including zero-weight lineages. -/
97
+ theorem variance_atTop (M : Domain) (a : Fin M.K → Bool) :
98
+ Tendsto (variance M a) atTop atTop := by
99
+ apply tendsto_atTop_mono (fun N => finite_variance_lower M a N)
100
+ exact tendsto_natCast_atTop_atTop.atTop_mul_const (variance_lower_pos M)
101
+
102
+ /-- On the diagonal the bounded quota drift is negligible compared with variance.
103
+ This is a CLT prerequisite, not a CLT or a probability-tail certificate. -/
104
+ theorem diagonal_drift_squared_limit (M : Domain) (a : Fin M.K → Bool)
105
+ (hdiag : score M a = (1:ℝ)/2) :
106
+ Tendsto (fun N : ℕ => (mean M a N - (N:ℝ)/2)^2 / variance M a N)
107
+ atTop (𝓝 0) := by
108
+ have hupper : Tendsto (fun N : ℕ => (M.K:ℝ)^2 / variance M a N)
109
+ atTop (𝓝 0) := tendsto_const_nhds.div_atTop (variance_atTop M a)
110
+ apply tendsto_of_tendsto_of_tendsto_of_le_of_le' tendsto_const_nhds hupper
111
+ · filter_upwards [(variance_atTop M a).eventually (eventually_ge_atTop 1)] with N hN
112
+ exact div_nonneg (sq_nonneg _) (by linarith)
113
+ · filter_upwards [(variance_atTop M a).eventually (eventually_ge_atTop 1)] with N hN
114
+ apply div_le_div_of_nonneg_right _ (by linarith)
115
+ have habs := diagonal_mean_bound M a hdiag N
116
+ nlinarith [sq_abs (mean M a N - (N:ℝ)/2), abs_nonneg (mean M a N - (N:ℝ)/2)]
117
+
118
+ open Obligations046.Bridge
119
+
120
+ def complement {ι : Type*} [Fintype ι] {n : ι → ℕ} (x : World n) : World n :=
121
+ fun i => (x i)ᶜ
122
+
123
+ theorem complement_involutive {ι : Type*} [Fintype ι] {n : ι → ℕ} (x : World n) :
124
+ complement (complement x) = x := by funext i; simp [complement]
125
+
126
+ theorem unbiased_mass_complement (n : ℕ) (x : Finset (Fin n)) :
127
+ mass (1/2 : ℝ) xᶜ = mass (1/2 : ℝ) x := by
128
+ have hx : x.card ≤ n := by simpa using x.card_le_univ
129
+ simp only [mass, Finset.card_compl, Fintype.card_fin]
130
+ norm_num
131
+ rw [Nat.sub_sub_self hx, mul_comm]
132
+
133
+ theorem unbiased_joint_complement {ι : Type*} [Fintype ι] (n : ι → ℕ)
134
+ (x : World n) :
135
+ jointMass n (fun _ => (1/2 : ℝ)) (complement x) =
136
+ jointMass n (fun _ => (1/2 : ℝ)) x := by
137
+ apply Finset.prod_congr rfl
138
+ intro i _
139
+ exact unbiased_mass_complement (n i) (x i)
140
+
141
+ theorem count_complement (M : Domain) (N : ℕ) (x : World (sizes M N)) :
142
+ correctCount (complement x) + correctCount x = N := by
143
+ have hsum : ∑ i : Fin M.K, sizes M N i = N := by
144
+ simpa only [Fin.sum_univ_eq_sum_range] using allocation_sum M N
145
+ unfold correctCount
146
+ rw [← Finset.sum_add_distrib]
147
+ convert hsum using 1
148
+ apply Finset.sum_congr rfl
149
+ intro i _
150
+ simp only [complement, Finset.card_compl, Fintype.card_fin]
151
+ exact Nat.sub_add_cancel (by simpa using (x i).card_le_univ)
152
+
153
+ theorem fair_loss_reflection (b d N : ℕ) (h : b+d=N) :
154
+ fairLoss b N + fairLoss d N = 1 := by
155
+ unfold fairLoss
156
+ split_ifs <;> norm_num <;> omega
157
+
158
+ /-- Genuine diagonal subdomain, exact for every N (even N=0).
159
+ It is not asserted for arbitrary diagonal scores with unequal q_i. -/
160
+ theorem unbiased_conditional_exact (M : Domain) (a : Fin M.K → Bool)
161
+ (hunbiased : ∀ i, q M (a i) = (1:ℝ)/2) (N : ℕ) :
162
+ conditionalError M N a = (1:ℝ)/2 := by
163
+ let f : World (sizes M N) → ℝ := fun x =>
164
+ jointMass (sizes M N) (fun _ => (1/2:ℝ)) x * fairLoss (correctCount x) N
165
+ have hrep : conditionalError M N a = ∑ x, f x := by
166
+ rw [← conditional_error_representation, modelLaw, memberLaw_expectation]
167
+ simp only [f, hunbiased]
168
+ have hsym : ∑ x, f (complement x) = ∑ x, f x :=
169
+ Fintype.sum_bijective complement
170
+ ⟨fun x y h => by simpa only [complement_involutive] using congrArg complement h,
171
+ fun x => ⟨complement x, complement_involutive x⟩⟩ _ _ (fun _ => rfl)
172
+ have hpair : ∀ x, f (complement x) + f x =
173
+ jointMass (sizes M N) (fun _ => (1/2:ℝ)) x := by
174
+ intro x
175
+ simp only [f, unbiased_joint_complement, ← mul_add]
176
+ rw [fair_loss_reflection _ _ _ (count_complement M N x), mul_one]
177
+ have htotal : (∑ x, f (complement x)) + (∑ x, f x) = 1 := by
178
+ rw [← Finset.sum_add_distrib]
179
+ simp only [hpair]
180
+ exact jointMass_sum _ _
181
+ rw [hrep]
182
+ linarith
183
+
184
+ theorem floor_limit_diag_unbiased (M : Domain) (a : Fin M.K → Bool)
185
+ (hunbiased : ∀ i, q M (a i) = (1:ℝ)/2) :
186
+ Tendsto (fun N => conditionalError M N a) atTop (𝓝 ((1:ℝ)/2)) := by
187
+ simpa only [unbiased_conditional_exact M a hunbiased] using
188
+ (tendsto_const_nhds : Tendsto (fun _ : ℕ => (1:ℝ)/2) atTop (𝓝 ((1:ℝ)/2)))
189
+
190
+ /-- c=1 lies outside Domain: cumulative-floor quotas alone do not preserve ties.
191
+ With two equal-weight deterministic lineages (false,true), odd sizes favor true. -/
192
+ theorem deterministic_quota_even (m : ℕ) :
193
+ fairLoss ((2*m) - (2*m)/2) (2*m) = (1:ℝ)/2 := by
194
+ have h : (2*m)/2 = m := by omega
195
+ rw [h]
196
+ have hsub : 2*m-m = m := by omega
197
+ rw [hsub]
198
+ simp [fairLoss, Nat.not_lt.mpr (le_refl (2*m))]
199
+
200
+ theorem deterministic_quota_odd (m : ℕ) :
201
+ fairLoss ((2*m+1) - (2*m+1)/2) (2*m+1) = 0 := by
202
+ have h : (2*m+1)/2 = m := by omega
203
+ rw [h]
204
+ have hl : ¬ 2*(2*m+1-m) < 2*m+1 := by omega
205
+ have he : ¬ 2*(2*m+1-m) = 2*m+1 := by omega
206
+ simp only [fairLoss, if_neg hl, if_neg he]
207
+
208
+ /-- A legal heterogeneous diagonal; score=1/2 does not imply every q_i=1/2. -/
209
+ def heterogeneous : Domain where
210
+ K := 2
211
+ K_pos := by norm_num
212
+ p := 3/4
213
+ c := 1/2
214
+ p_half := by norm_num
215
+ p_lt_one := by norm_num
216
+ c_nonneg := by norm_num
217
+ c_lt_one := by norm_num
218
+ w := fun i => if i=0 then 3/4 else if i=1 then 1/4 else 0
219
+ w_nonneg := by intro i; split_ifs <;> norm_num
220
+ weights_sum := by norm_num [Finset.sum_range_succ]
221
+
222
+ def heterogeneousA : Fin 2 → Bool := fun i => i.val == 1
223
+
224
+ theorem heterogeneous_diagonal : score heterogeneous heterogeneousA = (1:ℝ)/2 := by
225
+ change (∑ i : Fin 2, (if (i:ℕ)=0 then (3:ℝ)/4 else if (i:ℕ)=1 then 1/4 else 0) *
226
+ ((1-(1:ℝ)/2)*(3/4) + if (i:ℕ)==1 then (1:ℝ)/2 else 0)) = 1/2
227
+ norm_num [Fin.sum_univ_succ]
228
+
229
+ theorem heterogeneous_not_unbiased :
230
+ ¬ (∀ i, q heterogeneous (heterogeneousA i) = (1:ℝ)/2) := by
231
+ intro h
232
+ have h0 := h ⟨0, by norm_num [heterogeneous]⟩
233
+ norm_num [q, heterogeneous, heterogeneousA] at h0
234
+
235
+ end Obligations046.Diagonal