-- Mathlib/Combinatorics/SimpleGraph/Walk.lean
theorem concatRec_concat {u v w : V} (p : G.Walk u v) (h : G.Adj v w) :
    @concatRec _ _ motive @Hnil @Hconcat _ _ (p.concat h) =
      Hconcat p h (concatRec @Hnil @Hconcat p)

Proof state:
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ ⋯ ▸ concatRecAux Hnil Hconcat (p.concat h).reverse = Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse)

Tactic:
apply eq_of_heq

Result:
case h
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (⋯ ▸ concatRecAux Hnil Hconcat (p.concat h).reverse) (Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse))

Proof state:
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (Hconcat p.reverse.reverse ⋯ (concatRecAux Hnil Hconcat p.reverse))
    (Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse))

Tactic:
congr <;> simp [heq_rec_iff_heq]

Result:
no goals

Proof state:
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (concatRecAux Hnil Hconcat (cons ⋯ p.reverse)) (Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse))

Tactic:
rw [concatRecAux, rec_heq_iff_heq]

Result:
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (Hconcat p.reverse.reverse ⋯ (concatRecAux Hnil Hconcat p.reverse))
    (Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse))

Proof state:
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ concatRec Hnil Hconcat (p.concat h) = Hconcat p h (concatRec Hnil Hconcat p)

Tactic:
simp only [concatRec]

Result:
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ ⋯ ▸ concatRecAux Hnil Hconcat (p.concat h).reverse = Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse)

Proof state:
case h
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (⋯ ▸ concatRecAux Hnil Hconcat (p.concat h).reverse) (Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse))

Tactic:
apply rec_heq_of_heq

Result:
case h.h
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (concatRecAux Hnil Hconcat (p.concat h).reverse) (Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse))

Proof state:
case e_8.h
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ (p.concat h).reverse = cons ⋯ p.reverse

Tactic:
simp

Result:
no goals

Proof state:
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (concatRecAux Hnil Hconcat (p.concat h).reverse) (concatRecAux Hnil Hconcat (cons ⋯ p.reverse))

Tactic:
congr

Result:
case e_8.h
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ (p.concat h).reverse = cons ⋯ p.reverse

Proof state:
case h.h
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (concatRecAux Hnil Hconcat (p.concat h).reverse) (Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse))

Tactic:
trans concatRecAux @Hnil @Hconcat (cons h.symm p.reverse)

Result:
V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (concatRecAux Hnil Hconcat (p.concat h).reverse) (concatRecAux Hnil Hconcat (cons ⋯ p.reverse))

V : Type u
G : SimpleGraph V
motive : (u v : V) → G.Walk u v → Sort u_1
Hnil : {u : V} → motive u u nil
Hconcat : {u v w : V} → (p : G.Walk u v) → (h : G.Adj v w) → motive u v p → motive u w (p.concat h)
u v w : V
p : G.Walk u v
h : G.Adj v w
⊢ HEq (concatRecAux Hnil Hconcat (cons ⋯ p.reverse)) (Hconcat p h (⋯ ▸ concatRecAux Hnil Hconcat p.reverse))