Theorem: Lean4Axiomatic.Integer.Impl.Difference.ind_diff_subst (Lean4Axiomatic/Integer/Impl/Difference/Induction.lean)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
a₁ a₂ : Difference ℕ
a_eqv : a₁ ≃ a₂
⊢ fsubst a_eqv (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
revert a₁ a₂
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
⊢ ∀ {a₁ a₂ : Difference ℕ} {a_eqv : a₁ ≃ a₂},
    fsubst a_eqv (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
⊢ ∀ {a₁ a₂ : Difference ℕ} {a_eqv : a₁ ≃ a₂},
    fsubst a_eqv (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
intro (n₁——m₁) (n₂——m₂)
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
⊢ ∀ {a_eqv : n₁——m₁ ≃ n₂——m₂},
    fsubst a_eqv (Induction.Context.ind_diff ctx (n₁——m₁)) ≃ Induction.Context.ind_diff ctx (n₂——m₂)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
⊢ ∀ {a_eqv : n₁——m₁ ≃ n₂——m₂},
    fsubst a_eqv (Induction.Context.ind_diff ctx (n₁——m₁)) ≃ Induction.Context.ind_diff ctx (n₂——m₂)
Tactic:
let a₁ := n₁——m₁
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
⊢ ∀ {a_eqv : n₁——m₁ ≃ n₂——m₂},
    fsubst a_eqv (Induction.Context.ind_diff ctx (n₁——m₁)) ≃ Induction.Context.ind_diff ctx (n₂——m₂)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
⊢ ∀ {a_eqv : n₁——m₁ ≃ n₂——m₂},
    fsubst a_eqv (Induction.Context.ind_diff ctx (n₁——m₁)) ≃ Induction.Context.ind_diff ctx (n₂——m₂)
Tactic:
let a₂ := n₂——m₂
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
⊢ ∀ {a_eqv : n₁——m₁ ≃ n₂——m₂},
    fsubst a_eqv (Induction.Context.ind_diff ctx (n₁——m₁)) ≃ Induction.Context.ind_diff ctx (n₂——m₂)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
⊢ ∀ {a_eqv : n₁——m₁ ≃ n₂——m₂},
    fsubst a_eqv (Induction.Context.ind_diff ctx (n₁——m₁)) ≃ Induction.Context.ind_diff ctx (n₂——m₂)
Tactic:
intro (_ : a₁ ≃ a₂)
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx (n₁——m₁)) ≃ Induction.Context.ind_diff ctx (n₂——m₂)

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx (n₁——m₁)) ≃ Induction.Context.ind_diff ctx (n₂——m₂)
Tactic:
show fsubst ‹a₁ ≃ a₂› (ctx.ind_diff a₁) ≃ ctx.ind_diff a₂
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
let d₁ := (n₁:Difference ℕ) - m₁
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
let d₂ := (n₂:Difference ℕ) - m₂
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
have : d₁ ≃ a₁ := sub_eqv_diff
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this : d₁ ≃ a₁
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this : d₁ ≃ a₁
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
have : d₂ ≃ a₂ := sub_eqv_diff
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝ : d₁ ≃ a₁
this : d₂ ≃ a₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝ : d₁ ≃ a₁
this : d₂ ≃ a₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
have : d₁ ≃ a₂ := Rel.trans ‹d₁ ≃ a₁› ‹a₁ ≃ a₂›
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝¹ : d₁ ≃ a₁
this✝ : d₂ ≃ a₂
this : d₁ ≃ a₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝¹ : d₁ ≃ a₁
this✝ : d₂ ≃ a₂
this : d₁ ≃ a₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
have : d₂ ≃ d₁ := Rel.trans ‹d₂ ≃ a₂› (Rel.symm ‹d₁ ≃ a₂›)
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝² : d₁ ≃ a₁
this✝¹ : d₂ ≃ a₂
this✝ : d₁ ≃ a₂
this : d₂ ≃ d₁
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝² : d₁ ≃ a₁
this✝¹ : d₂ ≃ a₂
this✝ : d₁ ≃ a₂
this : d₂ ≃ d₁
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
let od₁ := ctx.on_diff n₁ m₁
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝² : d₁ ≃ a₁
this✝¹ : d₂ ≃ a₂
this✝ : d₁ ≃ a₂
this : d₂ ≃ d₁
od₁ : motive (Coe.coe n₁ - Coe.coe m₁) := Induction.Context.on_diff n₁ m₁
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝² : d₁ ≃ a₁
this✝¹ : d₂ ≃ a₂
this✝ : d₁ ≃ a₂
this : d₂ ≃ d₁
od₁ : motive (Coe.coe n₁ - Coe.coe m₁) := Induction.Context.on_diff n₁ m₁
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
let od₂ := ctx.on_diff n₂ m₂
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝² : d₁ ≃ a₁
this✝¹ : d₂ ≃ a₂
this✝ : d₁ ≃ a₂
this : d₂ ≃ d₁
od₁ : motive (Coe.coe n₁ - Coe.coe m₁) := Induction.Context.on_diff n₁ m₁
od₂ : motive (Coe.coe n₂ - Coe.coe m₂) := Induction.Context.on_diff n₂ m₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝² : d₁ ≃ a₁
this✝¹ : d₂ ≃ a₂
this✝ : d₁ ≃ a₂
this : d₂ ≃ d₁
od₁ : motive (Coe.coe n₁ - Coe.coe m₁) := Induction.Context.on_diff n₁ m₁
od₂ : motive (Coe.coe n₂ - Coe.coe m₂) := Induction.Context.on_diff n₂ m₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
have od_subst : od₁ ≃ fsubst ‹d₂ ≃ d₁› od₂ := Rel.symm ctx.on_diff_subst
State after:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝² : d₁ ≃ a₁
this✝¹ : d₂ ≃ a₂
this✝ : d₁ ≃ a₂
this : d₂ ≃ d₁
od₁ : motive (Coe.coe n₁ - Coe.coe m₁) := Induction.Context.on_diff n₁ m₁
od₂ : motive (Coe.coe n₂ - Coe.coe m₂) := Induction.Context.on_diff n₂ m₂
od_subst : od₁ ≃ fsubst this od₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂

State before:
ℕ : Type
inst✝¹ : Natural ℕ
motive : Difference ℕ → Sort u
inst✝ : IndexedFamily motive
ctx : Induction.Context motive
n₁ m₁ n₂ m₂ : ℕ
a₁ : Difference ℕ := n₁——m₁
a₂ : Difference ℕ := n₂——m₂
x✝ : a₁ ≃ a₂
d₁ : Difference ℕ := n₁——0 - m₁——0
d₂ : Difference ℕ := n₂——0 - m₂——0
this✝² : d₁ ≃ a₁
this✝¹ : d₂ ≃ a₂
this✝ : d₁ ≃ a₂
this : d₂ ≃ d₁
od₁ : motive (Coe.coe n₁ - Coe.coe m₁) := Induction.Context.on_diff n₁ m₁
od₂ : motive (Coe.coe n₂ - Coe.coe m₂) := Induction.Context.on_diff n₂ m₂
od_subst : od₁ ≃ fsubst this od₂
⊢ fsubst x✝ (Induction.Context.ind_diff ctx a₁) ≃ Induction.Context.ind_diff ctx a₂
Tactic:
calc
  _ = fsubst ‹a₁ ≃ a₂› (ctx.ind_diff a₁)         := rfl
  _ = fsubst ‹a₁ ≃ a₂› (fsubst ‹d₁ ≃ a₁› od₁)    := rfl
  _ ≃ fsubst (Rel.trans ‹d₁ ≃ a₁› ‹a₁ ≃ a₂›) od₁ := fsubst_trans
  _ = fsubst ‹d₁ ≃ a₂› od₁                       := rfl
  _ ≃ fsubst ‹d₁ ≃ a₂› (fsubst ‹d₂ ≃ d₁› od₂)    := fsubst_substR od_subst
  _ ≃ fsubst (Rel.trans ‹d₂ ≃ d₁› ‹d₁ ≃ a₂›) od₂ := fsubst_trans
  _ = fsubst ‹d₂ ≃ a₂› od₂                       := rfl
  _ = ctx.ind_diff a₂                            := rfl
State after:
no goals