Skip to content

Commit 56ed77d

Browse files
committed
feat(Data/Seq/Basic): prove basic theorems about Seq.subsequence
1 parent 647d5d8 commit 56ed77d

1 file changed

Lines changed: 81 additions & 0 deletions

File tree

Mathlib/Data/Seq/Basic.lean

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Copyright (c) 2017 Mario Carneiro. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Mario Carneiro, Vasilii Nesterov
55
-/
6+
import Mathlib.Data.Nat.SuccPred
67
import Mathlib.Data.Seq.Defs
78
import Mathlib.Data.ENat.Basic
89
import Mathlib.Tactic.ENatToNat
@@ -23,6 +24,10 @@ namespace Seq
2324

2425
variable {α : 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+
2631
section length
2732

2833
theorem 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

418423
end 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 00) 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 00) (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+
420501
section Join
421502

422503

0 commit comments

Comments
 (0)