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 arr.size
x : α
m' : Fin n → β
hm₁ : ∀ (j : Fin n), ↑j ≠ ↑i → m' j = m j
hm₂ : ∀ (h : ↑i < n), f x = m' ⟨↑i, h⟩
⊢ Agrees (arr.set i x) f m'
state_after: case mk
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin arr.size
x : α
m' : Fin arr.size → β
hm₂ : ∀ (h : ↑i < arr.size), f x = m' ⟨↑i, h⟩
hm₁ : ∀ (j : Fin arr.size), ↑j ≠ ↑i → m' j = (fun i => f (arr.get i)) j
⊢ Agrees (arr.set 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 arr.size
x : α
m' : Fin arr.size → β
hm₂ : ∀ (h : ↑i < arr.size), f x = m' ⟨↑i, h⟩
hm₁ : ∀ (j : Fin arr.size), ↑j ≠ ↑i → m' j = (fun i => f (arr.get i)) j
⊢ Agrees (arr.set i x) f m'
state_after: case mk
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin arr.size
x : α
m' : Fin arr.size → β
hm₂ : ∀ (h : ↑i < arr.size), f x = m' ⟨↑i, h⟩
hm₁ : ∀ (j : Fin arr.size), ↑j ≠ ↑i → m' j = (fun i => f (arr.get i)) j
j : ℕ
hj₁ : j < (arr.set i x).size
hj₂ : j < arr.size
⊢ f ((arr.set i x).get ⟨j, hj₁⟩) = m' ⟨j, hj₂⟩

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 arr.size
x : α
m' : Fin arr.size → β
hm₂ : ∀ (h : ↑i < arr.size), f x = m' ⟨↑i, h⟩
hm₁ : ∀ (j : Fin arr.size), ↑j ≠ ↑i → m' j = (fun i => f (arr.get i)) j
j : ℕ
hj₁ : j < (arr.set i x).size
hj₂ : j < arr.size
⊢ f ((arr.set i x).get ⟨j, hj₁⟩) = m' ⟨j, hj₂⟩
state_after: case mk
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin arr.size
x : α
m' : Fin arr.size → β
hm₂ : ∀ (h : ↑i < arr.size), f x = m' ⟨↑i, h⟩
hm₁ : ∀ (j : Fin arr.size), ↑j ≠ ↑i → m' j = (fun i => f (arr.get i)) j
j : ℕ
hj₁ : j < (arr.set i x).size
hj₂ : j < arr.size
⊢ f (arr.set i x)[j] = m' ⟨j, hj₂⟩

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

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

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

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

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

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

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 arr.size
x : α
m' : Fin arr.size → β
hm₂ : ∀ (h : ↑i < arr.size), f x = m' ⟨↑i, h⟩
hm₁ : ∀ (j : Fin arr.size), ↑j ≠ ↑i → m' j = (fun i => f (arr.get i)) j
j : ℕ
hj₁ : j < (arr.set i x).size
hj₂ : j < arr.size
h : ¬↑i = j
⊢ f (arr.set i x)[j] = m' ⟨j, hj₂⟩
state_after: case neg
α : Type u_1
β : Sort u_2
f : α → β
arr : Array α
i : Fin arr.size
x : α
m' : Fin arr.size → β
hm₂ : ∀ (h : ↑i < arr.size), f x = m' ⟨↑i, h⟩
hm₁ : ∀ (j : Fin arr.size), ↑j ≠ ↑i → m' j = (fun i => f (arr.get i)) j
j : ℕ
hj₁ : j < (arr.set i x).size
hj₂ : j < arr.size
h : ¬↑i = j
⊢ f arr[j] = (fun i => f (arr.get i)) ⟨j, hj₂⟩

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

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

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