Skip to content
Closed
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
4a941eb
make Seq.recOn cases_eliminator
vasnesterov Dec 9, 2024
e7dd2f6
revert some
vasnesterov Dec 9, 2024
db575e9
general lemmas
vasnesterov Dec 10, 2024
6c0d1eb
drop lemmas
vasnesterov Dec 10, 2024
de0847b
termination lemmas
vasnesterov Dec 10, 2024
d0c4d00
take lemmas
vasnesterov Dec 10, 2024
b4b2f7b
fold lemmas
vasnesterov Dec 10, 2024
620f8ca
rename
vasnesterov Dec 10, 2024
d5c4cb6
fix
vasnesterov Dec 10, 2024
6204386
golf
vasnesterov Dec 10, 2024
f47f463
suggestions
vasnesterov Dec 14, 2024
53fdb26
Merge branch 'vasnesterov/Seq' into vasnesterov/Seq_refactor
vasnesterov Dec 19, 2024
65a2c3f
rearrange
vasnesterov Dec 19, 2024
30befcf
return lost lemmas
vasnesterov Dec 19, 2024
9781fdd
Merge branch 'vasnesterov/Seq_refactor' into vasnesterov/Seq_operations
vasnesterov Dec 21, 2024
c43d4ad
zip lemmas
vasnesterov Dec 21, 2024
57dda42
modify + set
vasnesterov Dec 21, 2024
55b86cb
zip lemmas
vasnesterov Dec 21, 2024
66a3e87
zip_map lemmas
vasnesterov Dec 21, 2024
9688eb7
Merge branch 'vasnesterov/Seq_refactor' into vasnesterov/Seq_operations
vasnesterov Dec 21, 2024
69496e6
remove import
vasnesterov Jan 18, 2025
f35a0e1
Merge branch 'vasnesterov/Seq_refactor' into vasnesterov/Seq_operations
vasnesterov Jan 18, 2025
03f44db
Merge branch 'master' into vasnesterov/Seq_operations
vasnesterov Jan 18, 2025
0e45935
Merge branch 'master' into vasnesterov/Seq_operations
vasnesterov May 12, 2025
6603676
golf
vasnesterov May 20, 2025
b187964
golf
vasnesterov May 20, 2025
2d46e13
docs
vasnesterov May 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions Mathlib/Data/Seq/Seq.lean
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,21 @@ def fold (s : Seq α) (init : β) (f : β → α → β) : Seq β :=
| some (x, s) => .some (f acc x, f acc x, s)
cons init <| corec f (init, s)

/-- Applies `f` to the `n`th element of the sequence, if it exists, replacing that element
with the result. -/
def modify (s : Seq α) (n : ℕ) (f : α → α) : Seq α where
val := Function.update s.val n ((s.val n).map f)
property := by
have (i : ℕ) : (Function.update s.val n ((s.get? n).map f)) i = none ↔ s.get? i = none := by
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
have (i : ℕ) : (Function.update s.val n ((s.get? n).map f)) i = none ↔ s.get? i = none := by
have (i : ℕ) : Function.update s.val n ((s.get? n).map f) i = none ↔ s.get? i = none := by

I haven't tested this, but it looks like it should work

by_cases hi : i = n <;> simp [Function.update, hi]
simp [IsSeq, this]
exact @s.prop
Comment on lines +724 to +725
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a non-terminal simp, can we write it using simpa instead?


/-- Sets the value of sequence `s` at index `n` to `a`. If the `n`th element does not exist
(`s` terminates earlier), the sequence is left unchanged. -/
def set (s : Seq α) (n : ℕ) (a : α) : Seq α :=
modify s n (fun _ ↦ a)

section OfStream

@[simp]
Expand Down Expand Up @@ -1243,6 +1258,60 @@ theorem fold_head (init : β) (f : β → α → β) (s : Seq α) :

end Fold

section Modify

@[simp]
theorem modify_nil {f : α → α} {n} : modify nil n f = nil := by
ext1 m
simp [modify, Function.update]

@[simp]
theorem set_nil {n : ℕ} {x : α} : set nil n x = nil := modify_nil

@[simp]
theorem modify_cons_zero {f : α → α} {hd : α} {tl : Seq α} :
(cons hd tl).modify 0 f = cons (f hd) tl := by
ext1 n
cases n <;> simp [modify]
rfl

@[simp]
theorem set_cons_zero {hd hd' : α} {tl : Seq α} :
(cons hd tl).set 0 hd' = cons hd' tl := modify_cons_zero

@[simp]
theorem modify_cons_succ {hd : α} {f : α → α} {n : ℕ} {tl : Seq α} :
(cons hd tl).modify (n + 1) f = cons hd (tl.modify n f) := by
ext1 n
cases n <;> simp [modify, Function.update] <;> rfl

@[simp]
theorem set_cons_succ {hd x : α} {n : ℕ} {tl : Seq α} :
(cons hd tl).set (n + 1) x = cons hd (tl.set n x) := modify_cons_succ

theorem set_get_of_not_terminated {s : Seq α} {x : α} {n : ℕ}
(h_not_terminated : ¬ s.TerminatedAt n) :
(s.set n x).get? n = x := by
simpa [set, modify, ← Option.ne_none_iff_exists'] using h_not_terminated

theorem set_get_of_terminated {s : Seq α} {x : α} {n : ℕ}
(h_terminated : s.TerminatedAt n) :
(s.set n x).get? n = .none := by
simpa [set, modify] using h_terminated

theorem set_get_stable {s : Seq α} {x : α} {n m : ℕ}
(h : n ≠ m) :
(s.set m x).get? n = s.get? n := by
simp [set, modify, Function.update, h]

theorem set_dropn_stable_of_lt {s : Seq α} {m n : ℕ} {x : α}
(h : m < n) :
(s.set m x).drop n = s.drop n := by
ext1 i
simp [set_get_stable (show n + i ≠ m by omega)]

end Modify

instance : Functor Seq where map := @map

instance : LawfulFunctor Seq where
Expand Down
Loading