Theorem: SimpleGraph.adjMatrix_pow_apply_eq_card_walk
File: Mathlib/Combinatorics/SimpleGraph/AdjMatrix.lean

tactic: rw [card_set_walk_length_eq]
state_before: V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
u v : V
⊢ (adjMatrix α G ^ n) u v = ↑(Fintype.card ↑{p | p.length = n})
state_after: V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
u v : V
⊢ (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card

tactic: induction' n with n ih generalizing u v
state_before: V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
u v : V
⊢ (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
state_after: case zero
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
u v : V
⊢ (adjMatrix α G ^ 0) u v = ↑(G.finsetWalkLength 0 u v).card

case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ (adjMatrix α G ^ (n + 1)) u v = ↑(G.finsetWalkLength (n + 1) u v).card

tactic: obtain rfl | h := eq_or_ne u v <;> simp [finsetWalkLength, *]
state_before: case zero
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
u v : V
⊢ (adjMatrix α G ^ 0) u v = ↑(G.finsetWalkLength 0 u v).card
state_after: no goals

tactic: simp only [pow_succ', finsetWalkLength, ih, adjMatrix_mul_apply]
state_before: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ (adjMatrix α G ^ (n + 1)) u v = ↑(G.finsetWalkLength (n + 1) u v).card
state_after: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ∑ x ∈ G.neighborFinset u, ↑(G.finsetWalkLength n x v).card =
    ↑(univ.biUnion fun w =>
          Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑w) v)).card

tactic: rw [Finset.card_biUnion]
state_before: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ∑ x ∈ G.neighborFinset u, ↑(G.finsetWalkLength n x v).card =
    ↑(univ.biUnion fun w =>
          Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑w) v)).card
state_after: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ∑ x ∈ G.neighborFinset u, ↑(G.finsetWalkLength n x v).card =
    ↑(∑ u_1 : ↑(G.neighborSet u),
        (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑u_1) v)).card)

case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ∀ x ∈ univ,
    ∀ y ∈ univ,
      x ≠ y →
        Disjoint (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑x) v))
          (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑y) v))

tactic: norm_cast
state_before: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ∑ x ∈ G.neighborFinset u, ↑(G.finsetWalkLength n x v).card =
    ↑(∑ u_1 : ↑(G.neighborSet u),
        (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑u_1) v)).card)
state_after: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ↑(∑ x ∈ G.neighborFinset u, (G.finsetWalkLength n x v).card) =
    ↑(∑ u_1 : ↑(G.neighborSet u),
        (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑u_1) v)).card)

tactic: simp only [Nat.cast_sum, card_map, neighborFinset_def]
state_before: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ↑(∑ x ∈ G.neighborFinset u, (G.finsetWalkLength n x v).card) =
    ↑(∑ u_1 : ↑(G.neighborSet u),
        (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑u_1) v)).card)
state_after: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ∑ x ∈ (G.neighborSet u).toFinset, ↑(G.finsetWalkLength n x v).card =
    ∑ x : ↑(G.neighborSet u), ↑(G.finsetWalkLength n (↑x) v).card

tactic: apply Finset.sum_toFinset_eq_subtype
state_before: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ∑ x ∈ (G.neighborSet u).toFinset, ↑(G.finsetWalkLength n x v).card =
    ∑ x : ↑(G.neighborSet u), ↑(G.finsetWalkLength n (↑x) v).card
state_after: no goals

tactic: rintro ⟨x, hx⟩ - ⟨y, hy⟩ - hxy
state_before: case succ
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v : V
⊢ ∀ x ∈ univ,
    ∀ y ∈ univ,
      x ≠ y →
        Disjoint (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑x) v))
          (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑y) v))
state_after: case succ.mk.mk
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
⊢ Disjoint (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨x, hx⟩) v))
    (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨y, hy⟩) v))

tactic: rw [disjoint_iff_inf_le]
state_before: case succ.mk.mk
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
⊢ Disjoint (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨x, hx⟩) v))
    (Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨y, hy⟩) v))
state_after: case succ.mk.mk
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
⊢ Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨x, hx⟩) v) ⊓
      Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨y, hy⟩) v) ≤
    ⊥

tactic: intro p hp
state_before: case succ.mk.mk
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
⊢ Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨x, hx⟩) v) ⊓
      Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨y, hy⟩) v) ≤
    ⊥
state_after: case succ.mk.mk
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
p : G.Walk u v
hp :
  p ∈
    Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨x, hx⟩) v) ⊓
      Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨y, hy⟩) v)
⊢ p ∈ ⊥

tactic: simp only [inf_eq_inter, mem_inter, mem_map, Function.Embedding.coeFn_mk, exists_prop] at hp
state_before: case succ.mk.mk
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
p : G.Walk u v
hp :
  p ∈
    Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨x, hx⟩) v) ⊓
      Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑⟨y, hy⟩) v)
⊢ p ∈ ⊥
state_after: case succ.mk.mk
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
p : G.Walk u v
hp : (∃ a ∈ G.finsetWalkLength n x v, Walk.cons ⋯ a = p) ∧ ∃ a ∈ G.finsetWalkLength n y v, Walk.cons ⋯ a = p
⊢ p ∈ ⊥

tactic: obtain ⟨⟨px, _, rfl⟩, ⟨py, hpy, hp⟩⟩ := hp
state_before: case succ.mk.mk
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
p : G.Walk u v
hp : (∃ a ∈ G.finsetWalkLength n x v, Walk.cons ⋯ a = p) ∧ ∃ a ∈ G.finsetWalkLength n y v, Walk.cons ⋯ a = p
⊢ p ∈ ⊥
state_after: case succ.mk.mk.intro.intro.intro.intro.intro
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
px : G.Walk x v
left✝ : px ∈ G.finsetWalkLength n x v
py : G.Walk y v
hpy : py ∈ G.finsetWalkLength n y v
hp : Walk.cons ⋯ py = Walk.cons ⋯ px
⊢ Walk.cons ⋯ px ∈ ⊥

tactic: cases hp
state_before: case succ.mk.mk.intro.intro.intro.intro.intro
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
y : V
hy : y ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨y, hy⟩
px : G.Walk x v
left✝ : px ∈ G.finsetWalkLength n x v
py : G.Walk y v
hpy : py ∈ G.finsetWalkLength n y v
hp : Walk.cons ⋯ py = Walk.cons ⋯ px
⊢ Walk.cons ⋯ px ∈ ⊥
state_after: case succ.mk.mk.intro.intro.intro.intro.intro.refl
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
px : G.Walk x v
left✝ : px ∈ G.finsetWalkLength n x v
hy : x ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨x, hy⟩
hpy : px ∈ G.finsetWalkLength n x v
⊢ Walk.cons ⋯ px ∈ ⊥

tactic: simp at hxy
state_before: case succ.mk.mk.intro.intro.intro.intro.intro.refl
V : Type u_1
α : Type u_2
β : Type u_3
G : SimpleGraph V
inst✝³ : DecidableRel G.Adj
inst✝² : Fintype V
inst✝¹ : DecidableEq V
inst✝ : Semiring α
n : ℕ
ih : ∀ (u v : V), (adjMatrix α G ^ n) u v = ↑(G.finsetWalkLength n u v).card
u v x : V
hx : x ∈ G.neighborSet u
px : G.Walk x v
left✝ : px ∈ G.finsetWalkLength n x v
hy : x ∈ G.neighborSet u
hxy : ⟨x, hx⟩ ≠ ⟨x, hy⟩
hpy : px ∈ G.finsetWalkLength n x v
⊢ Walk.cons ⋯ px ∈ ⊥
state_after: no goals