Theorem: UFModel.Agrees.set
File: Mathlib/Data/UnionFind.lean

tactic: cases H
state_before: α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
n : ℕ
m : Fin n → β
H : Agrees arr f m
i : Fin (Array.size arr)
x : α
m' : Fin n → β
hm₁ : ∀ (j : Fin n), ↑j ≠ ↑i → m' j = m j
hm₂ : ∀ (h : ↑i < n), f x = m' { val := ↑i, isLt := h }
⊢ Agrees (Array.set arr i x) f m'

tactic: refine mk' (by simp) fun j hj₁ hj₂ ↦ ?_
state_before: case mk
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
⊢ Agrees (Array.set arr i x) f m'

tactic: suffices f (Array.set arr i x)[j] = m' ⟨j, hj₂⟩ by simp_all [Array.get_set]
state_before: case mk
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
j : ℕ
hj₁ : j < Array.size (Array.set arr i x)
hj₂ : j < Array.size arr
⊢ f (Array.get (Array.set arr i x) { val := j, isLt := hj₁ }) = m' { val := j, isLt := hj₂ }

tactic: by_cases h : i = j
state_before: case mk
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
j : ℕ
hj₁ : j < Array.size (Array.set arr i x)
hj₂ : j < Array.size arr
⊢ f (Array.set arr i x)[j] = m' { val := j, isLt := hj₂ }

tactic: simp
state_before: α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
⊢ Array.size arr = Array.size (Array.set arr i x)

tactic: simp_all [Array.get_set]
state_before: α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
j : ℕ
hj₁ : j < Array.size (Array.set arr i x)
hj₂ : j < Array.size arr
this : f (Array.set arr i x)[j] = m' { val := j, isLt := hj₂ }
⊢ f (Array.get (Array.set arr i x) { val := j, isLt := hj₁ }) = m' { val := j, isLt := hj₂ }

tactic: subst h
state_before: case pos
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
j : ℕ
hj₁ : j < Array.size (Array.set arr i x)
hj₂ : j < Array.size arr
h : ↑i = j
⊢ f (Array.set arr i x)[j] = m' { val := j, isLt := hj₂ }

tactic: rw [Array.get_set_eq, ← hm₂]
state_before: case pos
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
hj₁ : ↑i < Array.size (Array.set arr i x)
hj₂ : ↑i < Array.size arr
⊢ f (Array.set arr i x)[↑i] = m' { val := ↑i, isLt := hj₂ }

tactic: rw [arr.get_set_ne _ _ _ h, hm₁ ⟨j, _⟩ (Ne.symm h)]
state_before: case neg
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
j : ℕ
hj₁ : j < Array.size (Array.set arr i x)
hj₂ : j < Array.size arr
h : ¬↑i = j
⊢ f (Array.set arr i x)[j] = m' { val := j, isLt := hj₂ }

tactic: rfl
state_before: case neg
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
j : ℕ
hj₁ : j < Array.size (Array.set arr i x)
hj₂ : j < Array.size arr
h : ¬↑i = j
⊢ f arr[j] = (fun i => f (Array.get arr i)) { val := j, isLt := hj₂ }

α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
j : ℕ
hj₁ : j < Array.size (Array.set arr i x)
hj₂ : j < Array.size arr
h : ¬↑i = j
⊢ j < Array.size arr

α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin (Array.size arr)
x : α
m' : Fin (Array.size arr) → β
hm₂ : ∀ (h : ↑i < Array.size arr), f x = m' { val := ↑i, isLt := h }
hm₁ : ∀ (j : Fin (Array.size arr)), ↑j ≠ ↑i → m' j = (fun i => f (Array.get arr i)) j
j : ℕ
hj₁ : j < Array.size (Array.set arr i x)
hj₂ : j < Array.size arr
h : ¬↑i = j
⊢ j < Array.size arr