Zulip Chat Archive

Stream: new members

Topic: Adding vectors of reals


Marcus Rossel (May 09 2022 at 08:00):

I tried to define addition on vector ℝ n as follows:

protected def add : Π {n : }, vector  n  vector  n  vector  n
  | 0       ⟨[], _        ⟨[], _        := nil
  | (m + 1) hd₁::tl₁, h₁ hd₂::tl₂, h₂ :=
    let v₁ : vector  m := tl₁, (by simp [list.length_cons] at h₁; exact h₁)⟩ in
    let v₂ : vector  m := tl₂, (by simp [list.length_cons] at h₂; exact h₂)⟩ in
    (hd₁ + hd₂) :: (add v₁ v₂)

Proving things about this definition isn't very nice though. I always have to obtain the underlying list and then do a case distinction on n and the list:

protected theorem add_comm (v₁ v₂ : vector  n) : v₁ + v₂ = v₂ + v₁ := begin
  cases n,
  obtain l₁, hl₁ := v₁,
  { cases l₁ ; simp [vector.add] },
  {
    cases l₁,
    ...
  }
end

Is there a way to define add directly over vectors, instead of the lists somehow?

Kevin Buzzard (May 09 2022 at 08:11):

vector is a pretty gnarly dependent type. Why not just use the non-dependent type fin n -> \R instead, like in mathlib? Proving things about the latter definition is really easy. I agree that proving things about your definition isn't very nice, but I am suggesting that you don't bother trying to solve this problem.

Kevin Buzzard (May 09 2022 at 08:12):

See for example docs#vector3

Eric Wieser (May 09 2022 at 08:17):

Does docs#vector.zip_with exist?

Eric Wieser (May 09 2022 at 08:19):

Your add is just zip_with (+)

Eric Wieser (May 09 2022 at 08:20):

And your add_comm follows from docs#list.zip_with_comm


Last updated: Dec 20 2023 at 11:08 UTC