Zulip Chat Archive

Stream: new members

Topic: Replace vector with same vector of equivalent length


Vivek Rajesh Joshi (Jul 04 2024 at 12:45):

import Mathlib.Data.Matrix.Notation

variable {F : Type} [Field F] [DecidableEq F]

def Vector.any {F : Type} (v : Vector F n) (p : F  Bool) := v.toList.any p

@[simp] theorem Vector.any_def (v : Vector F n) (p : F  Bool) : v.any p = v.toList.any p := rfl

def Vector.firstNonzElt {F : Type} [Field F] [DecidableEq F] (v : Vector F n) (h: v.any (·  0)) : {x:F // x0}×(i : Fin n)×(Vector F (n-i-1)) :=
  match v with
  | [],hv => by simp at h
  | x::ys,ha =>
    have hn : n > 0 := by rw [ ha]; simp
    if hx:x  0
    then (x, hx, ⟨⟨0,hn,ys,by simp_rw [ ha];simp⟩⟩)
    else
      by
      have ys_nontriv: ys.any (·  0) := by
        simp at hx
        simp [List.any_cons, hx] at h
        simp [h]
      let (value, index, tail) := firstNonzElt (ys,by simp at ha; rw [ ha]; simp : Vector F (n-1)) ys_nontriv
      exact (value, index.succ.cast (by simp [Nat.sub_add_cancel hn]),tail.congr (by simp [Nat.Simproc.sub_add_eq_comm n (index) 1]))

def zeroVec (k: Nat) : Vector F k := Vector.replicate k 0

theorem Vector.append_def {n m : Nat} (v : Vector α n) (w : Vector α m) :
  v.append w = v.toList++w.toList,by simp := rfl

lemma Vector.firstNonzElt_zeroVecAppend {p : Nat} {w : Vector F n} (hw : w.any (.≠0)) :
  (((zeroVec p).append w).firstNonzElt (by simp at hw ⊢; rcases hw with x,hx⟩; use x; exact Or.inr hx.1,hx.2)).1 = (w.firstNonzElt hw).1 := by
  induction p with
  | zero => simp [zeroVec,replicate,append_def]; have := w.mk_toList (w.toList_length); rw [this]
  | succ n ih => sorry

How can I get rw [this] to work here?
I am aware of Vector.congr, but that's not what I want. I want something that is able to substitute one equivalent vector for another, not convert one to the other.

Daniel Weber (Jul 04 2024 at 14:55):

congr 1
· rw [zero_add]
· congr 1
  · simp
  convert heq_of_eq this
  rw [zero_add]; rfl
  apply zero_add

works

Vivek Rajesh Joshi (Jul 04 2024 at 14:57):

Ahh right, the congr tactic. Thanks a lot!!

Vivek Rajesh Joshi (Jul 04 2024 at 15:32):

Same problem with the succ case, although I can't use congr here:

| succ n ih =>
    simp [zeroVec,replicate,append_def] at ih 
    rw [cons_eq_listCons 0 (List.replicate n 0 ++ w.toList)]

Last updated: May 02 2025 at 03:31 UTC