@@ -421,6 +421,14 @@ def cons (p : RelSeries r) (newHead : α) (rel : r newHead p.head) : RelSeries r
421
421
delta cons
422
422
rw [last_append]
423
423
424
+ lemma cons_cast_succ (s : RelSeries r) (a : α) (h : r a s.head) (i : Fin (s.length + 1 )) :
425
+ (s.cons a h) (.cast (by simp) (.succ i)) = s i := by
426
+ dsimp [cons]
427
+ convert append_apply_right (singleton r a) s h i
428
+ ext
429
+ show i.1 + 1 = _ % _
430
+ simpa using (Nat.mod_eq_of_lt (by simp)).symm
431
+
424
432
/--
425
433
Given a series `a₀ -r→ a₁ -r→ ... -r→ aₙ` and an `a` such that `aₙ -r→ a` holds, there is
426
434
a series of length `n+1`: `a₀ -r→ a₁ -r→ ... -r→ aₙ -r→ a`.
@@ -436,6 +444,10 @@ def snoc (p : RelSeries r) (newLast : α) (rel : r p.last newLast) : RelSeries r
436
444
@[simp] lemma last_snoc (p : RelSeries r) (newLast : α) (rel : r p.last newLast) :
437
445
(p.snoc newLast rel).last = newLast := last_append _ _ _
438
446
447
+ lemma snoc_cast_castSucc (s : RelSeries r) (a : α) (h : r s.last a) (i : Fin (s.length + 1 )) :
448
+ (s.snoc a h) (.cast (by simp) (.castSucc i)) = s i :=
449
+ append_apply_left s (singleton r a) h i
450
+
439
451
-- This lemma is useful because `last_snoc` is about `Fin.last (p.snoc _ _).length`, but we often
440
452
-- see `Fin.last (p.length + 1)` in practice. They are equal by definition, but sometimes simplifier
441
453
-- does not pick up `last_snoc`
@@ -656,6 +668,36 @@ lemma Rel.finiteDimensional_or_infiniteDimensional [Nonempty α] :
656
668
rw [← not_finiteDimensional_iff]
657
669
exact em r.FiniteDimensional
658
670
671
+ instance Rel.FiniteDimensional.swap [FiniteDimensional r] : FiniteDimensional (Function.swap r) :=
672
+ ⟨.reverse (.longestOf r), fun s ↦ s.reverse.length_le_length_longestOf⟩
673
+
674
+ variable {r} in
675
+ @[simp]
676
+ lemma Rel.finiteDimensional_swap_iff :
677
+ FiniteDimensional (Function.swap r) ↔ FiniteDimensional r :=
678
+ ⟨fun _ ↦ .swap _, fun _ ↦ .swap _⟩
679
+
680
+ instance Rel.InfiniteDimensional.swap [InfiniteDimensional r] :
681
+ InfiniteDimensional (Function.swap r) :=
682
+ ⟨fun n ↦ ⟨.reverse (.withLength r n), RelSeries.length_withLength r n⟩⟩
683
+
684
+ variable {r} in
685
+ @[simp]
686
+ lemma Rel.infiniteDimensional_swap_iff :
687
+ InfiniteDimensional (Function.swap r) ↔ InfiniteDimensional r :=
688
+ ⟨fun _ ↦ .swap _, fun _ ↦ .swap _⟩
689
+
690
+ lemma Rel.wellFounded_swap_of_finiteDimensional [Rel.FiniteDimensional r] :
691
+ WellFounded (Function.swap r) := by
692
+ rw [WellFounded.wellFounded_iff_no_descending_seq]
693
+ refine ⟨fun ⟨f, hf⟩ ↦ ?_⟩
694
+ let s := RelSeries.mk (r := r) ((RelSeries.longestOf r).length + 1 ) (f ·) (hf ·)
695
+ exact (RelSeries.longestOf r).length.lt_succ_self.not_le s.length_le_length_longestOf
696
+
697
+ lemma Rel.wellFounded_of_finiteDimensional [Rel.FiniteDimensional r] : WellFounded r :=
698
+ have : (Rel.FiniteDimensional (Function.swap r)) := Rel.finiteDimensional_swap_iff.mp ‹_›
699
+ wellFounded_swap_of_finiteDimensional (Function.swap r)
700
+
659
701
/-- A type is finite dimensional if its `LTSeries` has bounded length. -/
660
702
abbrev FiniteDimensionalOrder (γ : Type *) [Preorder γ] :=
661
703
Rel.FiniteDimensional ((· < ·) : γ → γ → Prop )
0 commit comments