@@ -3,6 +3,7 @@ Copyright (c) 2017 Mario Carneiro. All rights reserved.
33Released under Apache 2.0 license as described in the file LICENSE.
44Authors: Mario Carneiro, Vasilii Nesterov
55-/
6+ import Mathlib.Data.Nat.SuccPred
67import Mathlib.Data.Seq.Defs
78import Mathlib.Data.ENat.Basic
89import Mathlib.Tactic.ENatToNat
@@ -23,6 +24,10 @@ namespace Seq
2324
2425variable {α : Type u} {β : Type v} {γ : Type w}
2526
27+ theorem terminatedAt_le {m n : ℕ} (hmn : m ≤ n) (s : Seq α)
28+ (h : s.TerminatedAt m) : s.TerminatedAt n :=
29+ Nat.le_induction_step_iff.mp @s.property _ _ hmn h
30+
2631section length
2732
2833theorem length'_of_terminates {s : Seq α} (h : s.Terminates) :
@@ -417,6 +422,82 @@ theorem map_append (f : α → β) (s t) : map f (append s t) = append (map f s)
417422
418423end Map
419424
425+ section Subsequence
426+
427+ variable {f : ℕ → ℕ} (hf : Monotone f) {g : ℕ → ℕ} (hg : Monotone g) (s : Seq α)
428+
429+ @[simp]
430+ theorem subsequence_get? (n : ℕ) : (s.subsequence hf).get? n = s.get? (f n) := rfl
431+
432+ @[simp]
433+ theorem subsequence_nil : (nil : Seq α).subsequence hf = nil := rfl
434+
435+ @[simp]
436+ theorem subsequence_cons a (s : Seq α) :
437+ (cons a s).subsequence (Monotone.comp Order.succ_mono hf) = s.subsequence hf := by
438+ ext n
439+ simp
440+
441+ theorem subsequence_cons' (h : f 0 ≠ 0 ) a (s : Seq α) :
442+ (cons a s).subsequence hf = s.subsequence (Monotone.comp Order.pred_mono hf) := by
443+ ext n
444+ dsimp
445+ have := hf (zero_le n)
446+ nth_rw 1 [show f n = f n - 1 + 1 by omega]
447+ simp
448+
449+ @[simp]
450+ theorem subsequence_id : s.subsequence monotone_id = s := rfl
451+
452+ @[simp]
453+ theorem subsequence_succ_eq_tail : s.subsequence Order.succ_mono = s.tail := by
454+ ext n
455+ simp
456+
457+ @[simp]
458+ theorem subsequence_tail_pred (h : f 0 ≠ 0 ) (s : Seq α) :
459+ s.tail.subsequence (Monotone.comp Order.pred_mono hf) = s.subsequence hf := by
460+ ext n
461+ dsimp
462+ have := hf (zero_le n)
463+ rw [show f n - 1 + 1 = f n by omega]
464+
465+ theorem subsequence_comp :
466+ s.subsequence (Monotone.comp hg hf) = (s.subsequence hg).subsequence hf := by
467+ ext n
468+ simp
469+
470+ @[simp]
471+ theorem terminatedAt_subsequence_iff {n : ℕ} :
472+ (s.subsequence hf).TerminatedAt n ↔ s.TerminatedAt (f n) := by
473+ simp [TerminatedAt]
474+
475+ theorem terminates_subsequence : (s.subsequence hf).Terminates → s.Terminates :=
476+ fun ⟨_, h⟩ => ⟨_, (terminatedAt_subsequence_iff _ _).mp h⟩
477+
478+ @[simp]
479+ theorem terminates_subsequence_iff {f : ℕ → ℕ} (hf : StrictMono f) (s : Seq α) :
480+ (s.subsequence hf.monotone).Terminates ↔ s.Terminates :=
481+ ⟨terminates_subsequence _ _, fun ⟨_, h⟩ => ⟨_, terminatedAt_le (StrictMono.le_apply hf) s h⟩⟩
482+
483+ theorem length_subsequence_le {f : ℕ → ℕ} (hf : StrictMono f) (s : Seq α) (h : s.Terminates) :
484+ (s.subsequence _).length ((terminates_subsequence_iff hf _).mpr h) ≤ s.length h := by
485+ simp [length]
486+ exact fun m hm h => hm m (le_refl _) <| terminatedAt_le (StrictMono.le_apply hf) s h
487+
488+ theorem mem_subsequence {a : α} : a ∈ s.subsequence hf → a ∈ s := fun ⟨n, h⟩ => ⟨f n, h⟩
489+
490+ @[simp]
491+ theorem subsequence_update {f : ℕ → ℕ} (hf : StrictMono f) (s : Seq α) (u : α → α) (n : ℕ) :
492+ (s.update (f n) u).subsequence hf.monotone = (s.subsequence hf.monotone).update n u := by
493+ ext m
494+ simp [update, Function.update]
495+ split_ifs with h' h h <;> (try rfl) <;> exfalso
496+ · exact h <| hf.injective h'
497+ · exact h' <| congrArg _ h
498+
499+ end Subsequence
500+
420501section Join
421502
422503
0 commit comments