Theorem: Reactor.StrictMember.lawfulMemUpdate_object_preserved (ReactorModel/Objects/Reactor/Theorems/Hierarchical.lean)

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
rtr₂ : α
c : Component.Valued
j : ID
u : LawfulMemUpdate cpt i v rtr₁ rtr₂
h : c ≠ cpt ∨ j ≠ i
s₁ : StrictMember (Component.val c) j rtr₁
s₂ : StrictMember (Component.val c) j rtr₂
⊢ object s₁ = object s₂
Tactic:
induction s₁ generalizing rtr₂ <;> cases s₂ <;> simp [object]
State after:
case final.final
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝¹ : Component.type α (Component.val c)
a✝¹ : rtr✝{Component.val c}{j} = some o✝¹
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr✝ rtr₂
o✝ : Component.type α (Component.val c)
a✝ : rtr₂{Component.val c}{j} = some o✝
⊢ o✝¹ = o✝

case final.nested
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝ : Component.type α (Component.val c)
a✝² : rtr✝{Component.val c}{j} = some o✝
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr✝ rtr₂
j✝ : ID
rtr₂✝ : Component.type α Component.rtr
a✝¹ : StrictMember (Component.val c) j rtr₂✝
a✝ : rtr₂{Component.rtr}{j✝} = some rtr₂✝
⊢ o✝ = object a✝¹

case nested.final
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j✝ : ID
rtr₂✝ : Component.type α Component.rtr
a✝² : rtr₁✝{Component.rtr}{j✝} = some rtr₂✝
a✝¹ : StrictMember (Component.val c) j rtr₂✝
a_ih✝ :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object a✝¹ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
o✝ : Component.type α (Component.val c)
a✝ : rtr₂{Component.val c}{j} = some o✝
⊢ object a✝¹ = o✝

case nested.nested
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j✝¹ : ID
rtr₂✝¹ : Component.type α Component.rtr
a✝³ : rtr₁✝{Component.rtr}{j✝¹} = some rtr₂✝¹
a✝² : StrictMember (Component.val c) j rtr₂✝¹
a_ih✝ :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object a✝² = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j✝ : ID
rtr₂✝ : Component.type α Component.rtr
a✝¹ : StrictMember (Component.val c) j rtr₂✝
a✝ : rtr₂{Component.rtr}{j✝} = some rtr₂✝
⊢ object a✝² = object a✝¹

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝¹ : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝¹
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr✝ rtr₂
o✝ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝
⊢ o✝¹ = o✝
Tactic:
case final.final h₁ _ h₂ =>
  cases u
  case final e => simp_all [e.valued h]
  case nested e => simp_all [e (c := c) (.inl $ by simp)]
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j₂ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₂} = some rtr₂✝
⊢ object s₁ = object s₂
Tactic:
case nested.nested j₁ _ h₁ s₁ hi j₂ _ s₂ h₂ => 
  have hj : j₁ = j₂ := by 
    have hs := (nested h₁ s₁ |>.fromEquiv u.equiv).unique (nested h₂ s₂)
    simp [fromEquiv] at hs
    exact hs.left
  subst hj
  cases u
  case final e => 
    cases h₂ ▸ (e (c := .rtr) (j := j₁) (.inl $ by simp)) ▸ h₁
    simp [s₁.unique s₂]
  case nested j' _ _ u _ _ e =>
    by_cases hj : j₁ = j'
    case neg => 
      cases h₂ ▸ (e (c := .rtr) (j := j₁) (.inr hj)) ▸ h₁
      simp [s₁.unique s₂]
    case pos => 
      simp_all [hj]
      exact hi (h₁ ▸ h₂ ▸ u) _
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝ : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr✝ rtr₂
j✝ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j✝} = some rtr₂✝
⊢ o✝ = object s₂
Tactic:
case final.nested h₁ _ _ s₂ h₂ =>
  injection (final h₁ |>.fromEquiv u.equiv).unique (nested h₂ s₂)
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j✝ : ID
rtr₂✝ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j✝} = some rtr₂✝
s₁ : StrictMember (Component.val c) j rtr₂✝
a_ih✝ :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
o✝ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝
⊢ object s₁ = o✝
Tactic:
case nested.final h₁ s₁ _ _ h₂ =>
  injection (nested h₁ s₁).unique (final h₂ |>.fromEquiv $ Reactor.Equivalent.symm u.equiv)
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝¹ : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝¹
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr✝ rtr₂
o✝ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝
⊢ o✝¹ = o✝
Tactic:
cases u
State after:
case final
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝² : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝²
rtr₂ : α
o✝¹ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝¹
o✝ : Component.type α (Component.val cpt)
a✝² : rtr✝{Component.val cpt}{i} = some o✝
a✝¹ : rtr₂{Component.val cpt}{i} = some v
a✝ : rtr✝ ≃[Component.val cpt][i] rtr₂
⊢ o✝² = o✝¹

case nested
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝¹ : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝¹
rtr₂ : α
o✝ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝
j✝ : ID
n₁✝ n₂✝ : Component.type α Component.rtr
a✝³ : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝² : rtr✝{Component.rtr}{j✝} = some n₁✝
a✝¹ : rtr₂{Component.rtr}{j✝} = some n₂✝
a✝ : rtr✝ ≃[Component.rtr][j✝] rtr₂
⊢ o✝¹ = o✝

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝² : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝²
rtr₂ : α
o✝¹ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝¹
o✝ : Component.type α (Component.val cpt)
a✝¹ : rtr✝{Component.val cpt}{i} = some o✝
a✝ : rtr₂{Component.val cpt}{i} = some v
e : rtr✝ ≃[Component.val cpt][i] rtr₂
⊢ o✝² = o✝¹
Tactic:
case final e => simp_all [e.valued h]
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝¹ : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝¹
rtr₂ : α
o✝ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝
j✝ : ID
n₁✝ n₂✝ : Component.type α Component.rtr
a✝² : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr✝{Component.rtr}{j✝} = some n₁✝
a✝ : rtr₂{Component.rtr}{j✝} = some n₂✝
e : rtr✝ ≃[Component.rtr][j✝] rtr₂
⊢ o✝¹ = o✝
Tactic:
case nested e => simp_all [e (c := c) (.inl $ by simp)]
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝² : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝²
rtr₂ : α
o✝¹ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝¹
o✝ : Component.type α (Component.val cpt)
a✝¹ : rtr✝{Component.val cpt}{i} = some o✝
a✝ : rtr₂{Component.val cpt}{i} = some v
e : rtr✝ ≃[Component.val cpt][i] rtr₂
⊢ o✝² = o✝¹
Tactic:
simp_all [e.valued h]
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝¹ : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝¹
rtr₂ : α
o✝ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝
j✝ : ID
n₁✝ n₂✝ : Component.type α Component.rtr
a✝² : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr✝{Component.rtr}{j✝} = some n₁✝
a✝ : rtr₂{Component.rtr}{j✝} = some n₂✝
e : rtr✝ ≃[Component.rtr][j✝] rtr₂
⊢ o✝¹ = o✝
Tactic:
simp_all [e (c := c) (.inl $ by simp)]
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝¹ : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝¹
rtr₂ : α
o✝ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝
j✝ : ID
n₁✝ n₂✝ : Component.type α Component.rtr
a✝² : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr✝{Component.rtr}{j✝} = some n₁✝
a✝ : rtr₂{Component.rtr}{j✝} = some n₂✝
e : rtr✝ ≃[Component.rtr][j✝] rtr₂
⊢ Component.val c ≠ Component.rtr
Tactic:
simp
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j₂ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₂} = some rtr₂✝
⊢ object s₁ = object s₂
Tactic:
have hj : j₁ = j₂ := by 
  have hs := (nested h₁ s₁ |>.fromEquiv u.equiv).unique (nested h₂ s₂)
  simp [fromEquiv] at hs
  exact hs.left
State after:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j₂ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₂} = some rtr₂✝
hj : j₁ = j₂
⊢ object s₁ = object s₂

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j₂ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₂} = some rtr₂✝
hj : j₁ = j₂
⊢ object s₁ = object s₂
Tactic:
subst hj
State after:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
⊢ object s₁ = object s₂

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
⊢ object s₁ = object s₂
Tactic:
cases u
State after:
case final
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
o✝ : Component.type α (Component.val cpt)
a✝² : rtr₁✝{Component.val cpt}{i} = some o✝
a✝¹ : rtr₂{Component.val cpt}{i} = some v
a✝ : rtr₁✝ ≃[Component.val cpt][i] rtr₂
⊢ object s₁ = object s₂

case nested
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
j✝ : ID
n₁✝ n₂✝ : Component.type α Component.rtr
a✝³ : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝² : rtr₁✝{Component.rtr}{j✝} = some n₁✝
a✝¹ : rtr₂{Component.rtr}{j✝} = some n₂✝
a✝ : rtr₁✝ ≃[Component.rtr][j✝] rtr₂
⊢ object s₁ = object s₂

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
o✝ : Component.type α (Component.val cpt)
a✝¹ : rtr₁✝{Component.val cpt}{i} = some o✝
a✝ : rtr₂{Component.val cpt}{i} = some v
e : rtr₁✝ ≃[Component.val cpt][i] rtr₂
⊢ object s₁ = object s₂
Tactic:
case final e => 
  cases h₂ ▸ (e (c := .rtr) (j := j₁) (.inl $ by simp)) ▸ h₁
  simp [s₁.unique s₂]
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
⊢ object s₁ = object s₂
Tactic:
case nested j' _ _ u _ _ e =>
  by_cases hj : j₁ = j'
  case neg => 
    cases h₂ ▸ (e (c := .rtr) (j := j₁) (.inr hj)) ▸ h₁
    simp [s₁.unique s₂]
  case pos => 
    simp_all [hj]
    exact hi (h₁ ▸ h₂ ▸ u) _
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j₂ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₂} = some rtr₂✝
⊢ j₁ = j₂
Tactic:
have hs := (nested h₁ s₁ |>.fromEquiv u.equiv).unique (nested h₂ s₂)
State after:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j₂ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₂} = some rtr₂✝
hs : fromEquiv ⋯ (nested h₁ s₁) = nested h₂ s₂
⊢ j₁ = j₂

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j₂ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₂} = some rtr₂✝
hs : fromEquiv ⋯ (nested h₁ s₁) = nested h₂ s₂
⊢ j₁ = j₂
Tactic:
simp [fromEquiv] at hs
State after:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j₂ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₂} = some rtr₂✝
hs : j₁ = j₂ ∧ Exists.choose ⋯ = rtr₂✝ ∧ HEq (fromEquiv ⋯ s₁) s₂
⊢ j₁ = j₂

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
j₂ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₂} = some rtr₂✝
hs : j₁ = j₂ ∧ Exists.choose ⋯ = rtr₂✝ ∧ HEq (fromEquiv ⋯ s₁) s₂
⊢ j₁ = j₂
Tactic:
exact hs.left
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
o✝ : Component.type α (Component.val cpt)
a✝¹ : rtr₁✝{Component.val cpt}{i} = some o✝
a✝ : rtr₂{Component.val cpt}{i} = some v
e : rtr₁✝ ≃[Component.val cpt][i] rtr₂
⊢ object s₁ = object s₂
Tactic:
cases h₂ ▸ (e (c := .rtr) (j := j₁) (.inl $ by simp)) ▸ h₁
State after:
case refl
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝
s₁ : StrictMember (Component.val c) j rtr₂✝
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
o✝ : Component.type α (Component.val cpt)
a✝¹ : rtr₁✝{Component.val cpt}{i} = some o✝
a✝ : rtr₂{Component.val cpt}{i} = some v
e : rtr₁✝ ≃[Component.val cpt][i] rtr₂
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
⊢ object s₁ = object s₂

State before:
case refl
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝
s₁ : StrictMember (Component.val c) j rtr₂✝
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
o✝ : Component.type α (Component.val cpt)
a✝¹ : rtr₁✝{Component.val cpt}{i} = some o✝
a✝ : rtr₂{Component.val cpt}{i} = some v
e : rtr₁✝ ≃[Component.val cpt][i] rtr₂
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
⊢ object s₁ = object s₂
Tactic:
simp [s₁.unique s₂]
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
o✝ : Component.type α (Component.val cpt)
a✝¹ : rtr₁✝{Component.val cpt}{i} = some o✝
a✝ : rtr₂{Component.val cpt}{i} = some v
e : rtr₁✝ ≃[Component.val cpt][i] rtr₂
⊢ Component.rtr ≠ Component.val cpt
Tactic:
simp
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
⊢ object s₁ = object s₂
Tactic:
by_cases hj : j₁ = j'
State after:
case pos
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : j₁ = j'
⊢ object s₁ = object s₂

case neg
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : ¬j₁ = j'
⊢ object s₁ = object s₂

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : ¬j₁ = j'
⊢ object s₁ = object s₂
Tactic:
case neg => 
  cases h₂ ▸ (e (c := .rtr) (j := j₁) (.inr hj)) ▸ h₁
  simp [s₁.unique s₂]
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : j₁ = j'
⊢ object s₁ = object s₂
Tactic:
case pos => 
  simp_all [hj]
  exact hi (h₁ ▸ h₂ ▸ u) _
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : ¬j₁ = j'
⊢ object s₁ = object s₂
Tactic:
cases h₂ ▸ (e (c := .rtr) (j := j₁) (.inr hj)) ▸ h₁
State after:
case refl
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝
s₁ : StrictMember (Component.val c) j rtr₂✝
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : ¬j₁ = j'
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
⊢ object s₁ = object s₂

State before:
case refl
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝
s₁ : StrictMember (Component.val c) j rtr₂✝
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : ¬j₁ = j'
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
⊢ object s₁ = object s₂
Tactic:
simp [s₁.unique s₂]
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j₁} = some rtr₂✝¹
s₁ : StrictMember (Component.val c) j rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j₁} = some rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some n₁✝
a✝ : rtr₂{Component.rtr}{j'} = some n₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : j₁ = j'
⊢ object s₁ = object s₂
Tactic:
simp_all [hj]
State after:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
s₁ : StrictMember (Component.val c) j rtr₂✝¹
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
h : ¬c = cpt ∨ ¬j = i
h₁ : n₁✝ = rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
h₂ : n₂✝ = rtr₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some rtr₂✝¹
a✝ : rtr₂{Component.rtr}{j'} = some rtr₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : j₁ = j'
⊢ object s₁ = object s₂

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
rtr₁✝ : α
j₁ : ID
rtr₂✝¹ : Component.type α Component.rtr
s₁ : StrictMember (Component.val c) j rtr₂✝¹
rtr₂ : α
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
j' : ID
n₁✝ n₂✝ : Component.type α Component.rtr
u : LawfulMemUpdate cpt i v n₁✝ n₂✝
h : ¬c = cpt ∨ ¬j = i
h₁ : n₁✝ = rtr₂✝¹
hi :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝¹ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
h₂ : n₂✝ = rtr₂✝
a✝¹ : rtr₁✝{Component.rtr}{j'} = some rtr₂✝¹
a✝ : rtr₂{Component.rtr}{j'} = some rtr₂✝
e : rtr₁✝ ≃[Component.rtr][j'] rtr₂
hj : j₁ = j'
⊢ object s₁ = object s₂
Tactic:
exact hi (h₁ ▸ h₂ ▸ u) _
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr✝ : α
o✝ : Component.type α (Component.val c)
h₁ : rtr✝{Component.val c}{j} = some o✝
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr✝ rtr₂
j✝ : ID
rtr₂✝ : Component.type α Component.rtr
s₂ : StrictMember (Component.val c) j rtr₂✝
h₂ : rtr₂{Component.rtr}{j✝} = some rtr₂✝
⊢ o✝ = object s₂
Tactic:
injection (final h₁ |>.fromEquiv u.equiv).unique (nested h₂ s₂)
State after:
no goals

State before:
α : Type
inst✝ : Hierarchical α
rtr rtr₁ : α
cpt : Component.Valued
i : ID
v : Value
c : Component.Valued
j : ID
h : c ≠ cpt ∨ j ≠ i
rtr₁✝ : α
j✝ : ID
rtr₂✝ : Component.type α Component.rtr
h₁ : rtr₁✝{Component.rtr}{j✝} = some rtr₂✝
s₁ : StrictMember (Component.val c) j rtr₂✝
a_ih✝ :
  ∀ {rtr₂ : α},
    LawfulMemUpdate cpt i v rtr₂✝ rtr₂ → ∀ (s₂ : StrictMember (Component.val c) j rtr₂), object s₁ = object s₂
rtr₂ : α
u : LawfulMemUpdate cpt i v rtr₁✝ rtr₂
o✝ : Component.type α (Component.val c)
h₂ : rtr₂{Component.val c}{j} = some o✝
⊢ object s₁ = o✝
Tactic:
injection (nested h₁ s₁).unique (final h₂ |>.fromEquiv $ Reactor.Equivalent.symm u.equiv)
State after:
no goals