internlm/Lean-Github huggingface dataset:
Theorem: IContainer'.M.bisim
Proof state before:
case h₀
I : Type u₀
C : IContainer' I
R : (i : I) → M C i → M C i → Prop
h₀ :
  ∀ (i : I) (x y : M C i),
    R i x y →
      ∃ node k₁ k₂,
        destruct x = { fst := node, snd := k₁ } ∧
          destruct y = { fst := node, snd := k₂ } ∧ ∀ (z : B C ↑node), R (Next C (↑node) z) (k₁ z) (k₂ z)
i✝ : I
x✝ : Container.M (toContainer C)
wfx✝ : WellFormed i✝ x✝
y✝ : Container.M (toContainer C)
wfy✝ : WellFormed i✝ y✝
h₁ : R i✝ { val := x✝, property := wfx✝ } { val := y✝, property := wfy✝ }
x y : Container.M (toContainer C)
i : I
wfx : WellFormed i x
wfy : WellFormed i y
r : R i { val := x, property := wfx } { val := y, property := wfy }
⊢ ∃ node k₁ k₂,
    Container.M.destruct x = { fst := node, snd := k₁ } ∧
      Container.M.destruct y = { fst := node, snd := k₂ } ∧
        ∀ (i : Container.B (toContainer C) node),
          ∃ i_1 wfx wfy, R i_1 { val := k₁ i, property := wfx } { val := k₂ i, property := wfy }
Tactic:
have ⟨⟨node, h₄⟩, k₁, k₂, h₁, h₂, h₃⟩ := h₀ i ⟨x, wfx⟩ ⟨y, wfy⟩ r
Proof state after:
case h₀
I : Type u₀
C : IContainer' I
R : (i : I) → M C i → M C i → Prop
h₀ :
  ∀ (i : I) (x y : M C i),
    R i x y →
      ∃ node k₁ k₂,
        destruct x = { fst := node, snd := k₁ } ∧
          destruct y = { fst := node, snd := k₂ } ∧ ∀ (z : B C ↑node), R (Next C (↑node) z) (k₁ z) (k₂ z)
i✝ : I
x✝ : Container.M (toContainer C)
wfx✝ : WellFormed i✝ x✝
y✝ : Container.M (toContainer C)
wfy✝ : WellFormed i✝ y✝
h₁✝ : R i✝ { val := x✝, property := wfx✝ } { val := y✝, property := wfy✝ }
x y : Container.M (toContainer C)
i : I
wfx : WellFormed i x
wfy : WellFormed i y
r : R i { val := x, property := wfx } { val := y, property := wfy }
node : C.A
h₄ : i = Idx C node
k₁ k₂ : (y : B C ↑{ val := node, property := h₄ }) → M C (Next C (↑{ val := node, property := h₄ }) y)
h₁ : destruct { val := x, property := wfx } = { fst := { val := node, property := h₄ }, snd := k₁ }
h₂ : destruct { val := y, property := wfy } = { fst := { val := node, property := h₄ }, snd := k₂ }
h₃ : ∀ (z : B C ↑{ val := node, property := h₄ }), R (Next C (↑{ val := node, property := h₄ }) z) (k₁ z) (k₂ z)
⊢ ∃ node k₁ k₂,
    Container.M.destruct x = { fst := node, snd := k₁ } ∧
      Container.M.destruct y = { fst := node, snd := k₂ } ∧
        ∀ (i : Container.B (toContainer C) node),
          ∃ i_1 wfx wfy, R i_1 { val := k₁ i, property := wfx } { val := k₂ i, property := wfy }
Theorem: IContainer'.M.bisim
Proof state before:
case h₀
I : Type u₀
C : IContainer' I
R : (i : I) → M C i → M C i → Prop
h₀ :
  ∀ (i : I) (x y : M C i),
    R i x y →
      ∃ node k₁ k₂,
        destruct x = { fst := node, snd := k₁ } ∧
          destruct y = { fst := node, snd := k₂ } ∧ ∀ (z : B C ↑node), R (Next C (↑node) z) (k₁ z) (k₂ z)
i✝ : I
x✝ : Container.M (toContainer C)
wfx✝ : WellFormed i✝ x✝
y✝ : Container.M (toContainer C)
wfy✝ : WellFormed i✝ y✝
h₁✝ : R i✝ { val := x✝, property := wfx✝ } { val := y✝, property := wfy✝ }
x y : Container.M (toContainer C)
i : I
wfx : WellFormed i x
wfy : WellFormed i y
r : R i { val := x, property := wfx } { val := y, property := wfy }
node : C.A
h₄ : i = Idx C node
k₁ k₂ : (y : B C ↑{ val := node, property := h₄ }) → M C (Next C (↑{ val := node, property := h₄ }) y)
h₁ : destruct { val := x, property := wfx } = { fst := { val := node, property := h₄ }, snd := k₁ }
h₂ : destruct { val := y, property := wfy } = { fst := { val := node, property := h₄ }, snd := k₂ }
h₃ : ∀ (z : B C ↑{ val := node, property := h₄ }), R (Next C (↑{ val := node, property := h₄ }) z) (k₁ z) (k₂ z)
⊢ ∃ node k₁ k₂,
    Container.M.destruct x = { fst := node, snd := k₁ } ∧
      Container.M.destruct y = { fst := node, snd := k₂ } ∧
        ∀ (i : Container.B (toContainer C) node),
          ∃ i_1 wfx wfy, R i_1 { val := k₁ i, property := wfx } { val := k₂ i, property := wfy }
Tactic:
have h₁ := lift_destruct_eq _ _ _ _ h₁
Proof state after:
case h₀
I : Type u₀
C : IContainer' I
R : (i : I) → M C i → M C i → Prop
h₀ :
  ∀ (i : I) (x y : M C i),
    R i x y →
      ∃ node k₁ k₂,
        destruct x = { fst := node, snd := k₁ } ∧
          destruct y = { fst := node, snd := k₂ } ∧ ∀ (z : B C ↑node), R (Next C (↑node) z) (k₁ z) (k₂ z)
i✝ : I
x✝ : Container.M (toContainer C)
wfx✝ : WellFormed i✝ x✝
y✝ : Container.M (toContainer C)
wfy✝ : WellFormed i✝ y✝
h₁✝¹ : R i✝ { val := x✝, property := wfx✝ } { val := y✝, property := wfy✝ }
x y : Container.M (toContainer C)
i : I
wfx : WellFormed i x
wfy : WellFormed i y
r : R i { val := x, property := wfx } { val := y, property := wfy }
node : C.A
h₄ : i = Idx C node
k₁ k₂ : (y : B C ↑{ val := node, property := h₄ }) → M C (Next C (↑{ val := node, property := h₄ }) y)
h₁✝ : destruct { val := x, property := wfx } = { fst := { val := node, property := h₄ }, snd := k₁ }
h₂ : destruct { val := y, property := wfy } = { fst := { val := node, property := h₄ }, snd := k₂ }
h₃ : ∀ (z : B C ↑{ val := node, property := h₄ }), R (Next C (↑{ val := node, property := h₄ }) z) (k₁ z) (k₂ z)
h₁ :
  Container.M.destruct x =
    { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₁ }.fst,
      snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₁ } x) }
⊢ ∃ node k₁ k₂,
    Container.M.destruct x = { fst := node, snd := k₁ } ∧
      Container.M.destruct y = { fst := node, snd := k₂ } ∧
        ∀ (i : Container.B (toContainer C) node),
          ∃ i_1 wfx wfy, R i_1 { val := k₁ i, property := wfx } { val := k₂ i, property := wfy }
Theorem: IContainer'.M.bisim
Proof state before:
case h₀
I : Type u₀
C : IContainer' I
R : (i : I) → M C i → M C i → Prop
h₀ :
  ∀ (i : I) (x y : M C i),
    R i x y →
      ∃ node k₁ k₂,
        destruct x = { fst := node, snd := k₁ } ∧
          destruct y = { fst := node, snd := k₂ } ∧ ∀ (z : B C ↑node), R (Next C (↑node) z) (k₁ z) (k₂ z)
i✝ : I
x✝ : Container.M (toContainer C)
wfx✝ : WellFormed i✝ x✝
y✝ : Container.M (toContainer C)
wfy✝ : WellFormed i✝ y✝
h₁✝¹ : R i✝ { val := x✝, property := wfx✝ } { val := y✝, property := wfy✝ }
x y : Container.M (toContainer C)
i : I
wfx : WellFormed i x
wfy : WellFormed i y
r : R i { val := x, property := wfx } { val := y, property := wfy }
node : C.A
h₄ : i = Idx C node
k₁ k₂ : (y : B C ↑{ val := node, property := h₄ }) → M C (Next C (↑{ val := node, property := h₄ }) y)
h₁✝ : destruct { val := x, property := wfx } = { fst := { val := node, property := h₄ }, snd := k₁ }
h₂✝ : destruct { val := y, property := wfy } = { fst := { val := node, property := h₄ }, snd := k₂ }
h₃ : ∀ (z : B C ↑{ val := node, property := h₄ }), R (Next C (↑{ val := node, property := h₄ }) z) (k₁ z) (k₂ z)
h₁ :
  Container.M.destruct x =
    { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₁ }.fst,
      snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₁ } x) }
h₂ :
  Container.M.destruct y =
    { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₂ }.fst,
      snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₂ } x) }
wfx' :
  ∀ (x_1 : B C (Container.M.destruct ↑{ val := x, property := wfx }).fst),
    WellFormed (Next C (Container.M.destruct ↑{ val := x, property := wfx }).fst x_1)
      (PSigma.snd (Container.M.destruct ↑{ val := x, property := wfx }) x_1)
wfy' :
  ∀ (x : B C (Container.M.destruct ↑{ val := y, property := wfy }).fst),
    WellFormed (Next C (Container.M.destruct ↑{ val := y, property := wfy }).fst x)
      (PSigma.snd (Container.M.destruct ↑{ val := y, property := wfy }) x)
a : B C node
⊢ R (Next C node a) { val := ↑(k₁ a), property := (_ : WellFormed (Next C node a) ((fun a => ↑(k₁ a)) a)) }
    { val := ↑(k₂ a), property := (_ : WellFormed (Next C node a) ((fun x => ↑(k₂ x)) a)) }
Tactic:
exact h₃ a
Proof state after:
no goals
Theorem: IContainer'.M.bisim
Proof state before:
I : Type u₀
C : IContainer' I
R : (i : I) → M C i → M C i → Prop
h₀ :
  ∀ (i : I) (x y : M C i),
    R i x y →
      ∃ node k₁ k₂,
        destruct x = { fst := node, snd := k₁ } ∧
          destruct y = { fst := node, snd := k₂ } ∧ ∀ (z : B C ↑node), R (Next C (↑node) z) (k₁ z) (k₂ z)
i✝ : I
x✝ : Container.M (toContainer C)
wfx✝ : WellFormed i✝ x✝
y✝ : Container.M (toContainer C)
wfy✝ : WellFormed i✝ y✝
h₁✝¹ : R i✝ { val := x✝, property := wfx✝ } { val := y✝, property := wfy✝ }
x y : Container.M (toContainer C)
i : I
wfx : WellFormed i x
wfy : WellFormed i y
r : R i { val := x, property := wfx } { val := y, property := wfy }
node : C.A
h₄ : i = Idx C node
k₁ k₂ : (y : B C ↑{ val := node, property := h₄ }) → M C (Next C (↑{ val := node, property := h₄ }) y)
h₁✝ : destruct { val := x, property := wfx } = { fst := { val := node, property := h₄ }, snd := k₁ }
h₂✝ : destruct { val := y, property := wfy } = { fst := { val := node, property := h₄ }, snd := k₂ }
h₃ : ∀ (z : B C ↑{ val := node, property := h₄ }), R (Next C (↑{ val := node, property := h₄ }) z) (k₁ z) (k₂ z)
h₁ :
  Container.M.destruct x =
    { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₁ }.fst,
      snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₁ } x) }
h₂ :
  Container.M.destruct y =
    { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₂ }.fst,
      snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₂ } x) }
wfx' :
  ∀
    (x :
      B C
        { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₁ }.fst,
            snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₁ } x) }.fst),
    WellFormed
      (Next C
        { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₁ }.fst,
            snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₁ } x) }.fst
        x)
      (PSigma.snd
        { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₁ }.fst,
          snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₁ } x) }
        x)
wfy' :
  ∀ (x : B C (Container.M.destruct ↑{ val := y, property := wfy }).fst),
    WellFormed (Next C (Container.M.destruct ↑{ val := y, property := wfy }).fst x)
      (PSigma.snd (Container.M.destruct ↑{ val := y, property := wfy }) x)
a : B C node
⊢ WellFormed (Next C node a) ↑(k₁ a)
Tactic:
apply wfx'
Proof state after:
no goals
Theorem: IContainer'.M.bisim
Proof state before:
I : Type u₀
C : IContainer' I
R : (i : I) → M C i → M C i → Prop
h₀ :
  ∀ (i : I) (x y : M C i),
    R i x y →
      ∃ node k₁ k₂,
        destruct x = { fst := node, snd := k₁ } ∧
          destruct y = { fst := node, snd := k₂ } ∧ ∀ (z : B C ↑node), R (Next C (↑node) z) (k₁ z) (k₂ z)
i✝ : I
x✝ : Container.M (toContainer C)
wfx✝ : WellFormed i✝ x✝
y✝ : Container.M (toContainer C)
wfy✝ : WellFormed i✝ y✝
h₁✝¹ : R i✝ { val := x✝, property := wfx✝ } { val := y✝, property := wfy✝ }
x y : Container.M (toContainer C)
i : I
wfx : WellFormed i x
wfy : WellFormed i y
r : R i { val := x, property := wfx } { val := y, property := wfy }
node : C.A
h₄ : i = Idx C node
k₁ k₂ : (y : B C ↑{ val := node, property := h₄ }) → M C (Next C (↑{ val := node, property := h₄ }) y)
h₁✝ : destruct { val := x, property := wfx } = { fst := { val := node, property := h₄ }, snd := k₁ }
h₂✝ : destruct { val := y, property := wfy } = { fst := { val := node, property := h₄ }, snd := k₂ }
h₃ : ∀ (z : B C ↑{ val := node, property := h₄ }), R (Next C (↑{ val := node, property := h₄ }) z) (k₁ z) (k₂ z)
h₁ :
  Container.M.destruct x =
    { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₁ }.fst,
      snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₁ } x) }
h₂ :
  Container.M.destruct y =
    { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₂ }.fst,
      snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₂ } x) }
wfx' :
  ∀ (x_1 : B C (Container.M.destruct ↑{ val := x, property := wfx }).fst),
    WellFormed (Next C (Container.M.destruct ↑{ val := x, property := wfx }).fst x_1)
      (PSigma.snd (Container.M.destruct ↑{ val := x, property := wfx }) x_1)
wfy' :
  ∀
    (x :
      B C
        { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₂ }.fst,
            snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₂ } x) }.fst),
    WellFormed
      (Next C
        { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₂ }.fst,
            snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₂ } x) }.fst
        x)
      (PSigma.snd
        { fst := ↑{ fst := { val := node, property := h₄ }, snd := k₂ }.fst,
          snd := fun x => ↑(Sigma.snd { fst := { val := node, property := h₄ }, snd := k₂ } x) }
        x)
a : B C node
⊢ WellFormed (Next C node a) ↑(k₂ a)
Tactic:
apply wfy'
Proof state after:
no goals
Theorem: IContainer.M.wf_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf : WellFormed i m
⊢ ∀
    (x :
      B C (Container.M.destruct ↑{ val := m, property := wf }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf }).fst.snd),
    WellFormed
      (N C (Container.M.destruct ↑{ val := m, property := wf }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf }).fst.snd x)
      (PSigma.snd (Container.M.destruct ↑{ val := m, property := wf }) x)
Tactic:
simp only [WellFormed, PWellFormed] at wf
Proof state after:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf : ↑(pgfp (WellFormedF C)) ⊥ i m
⊢ ∀
    (x :
      B C (Container.M.destruct ↑{ val := m, property := wf }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf }).fst.snd),
    WellFormed
      (N C (Container.M.destruct ↑{ val := m, property := wf }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf }).fst.snd x)
      (PSigma.snd (Container.M.destruct ↑{ val := m, property := wf }) x)
Theorem: IContainer.M.wf_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf : ↑(pgfp (WellFormedF C)) ⊥ i m
⊢ ∀
    (x :
      B C (Container.M.destruct ↑{ val := m, property := wf }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf }).fst.snd),
    WellFormed
      (N C (Container.M.destruct ↑{ val := m, property := wf }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf }).fst.snd x)
      (PSigma.snd (Container.M.destruct ↑{ val := m, property := wf }) x)
Tactic:
rw [←pgfp.unfold] at wf
Proof state after:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (⊥ ⊔ ↑(pgfp (WellFormedF C)) ⊥) i m
⊢ ∀
    (x :
      B C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd),
    WellFormed
      (N C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd x)
      (PSigma.snd (Container.M.destruct ↑{ val := m, property := wf✝ }) x)
Theorem: IContainer.M.wf_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (⊥ ⊔ ↑(pgfp (WellFormedF C)) ⊥) i m
⊢ ∀
    (x :
      B C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd),
    WellFormed
      (N C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd x)
      (PSigma.snd (Container.M.destruct ↑{ val := m, property := wf✝ }) x)
Tactic:
simp only [CompleteLattice.bot_sup] at wf
Proof state after:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
⊢ ∀
    (x :
      B C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd),
    WellFormed
      (N C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd x)
      (PSigma.snd (Container.M.destruct ↑{ val := m, property := wf✝ }) x)
Theorem: IContainer.M.wf_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
⊢ ∀
    (x :
      B C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd),
    WellFormed
      (N C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd x)
      (PSigma.snd (Container.M.destruct ↑{ val := m, property := wf✝ }) x)
Tactic:
have ⟨_, y⟩ := wf
Proof state after:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
left✝ : (Container.M.destruct m).fst.fst = i
y :
  ∀ (x : B C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd),
    ↑(pgfp (WellFormedF C)) ⊥ (N C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd x)
      (PSigma.snd (Container.M.destruct m) x)
⊢ ∀
    (x :
      B C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd),
    WellFormed
      (N C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd x)
      (PSigma.snd (Container.M.destruct ↑{ val := m, property := wf✝ }) x)
Theorem: IContainer.M.wf_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
left✝ : (Container.M.destruct m).fst.fst = i
y :
  ∀ (x : B C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd),
    ↑(pgfp (WellFormedF C)) ⊥ (N C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd x)
      (PSigma.snd (Container.M.destruct m) x)
⊢ ∀
    (x :
      B C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd),
    WellFormed
      (N C (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
        (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.snd x)
      (PSigma.snd (Container.M.destruct ↑{ val := m, property := wf✝ }) x)
Tactic:
exact y
Proof state after:
no goals
Theorem: IContainer.M.index_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf : WellFormed i m
⊢ i = (Container.M.destruct ↑{ val := m, property := wf }).fst.fst
Tactic:
simp only [WellFormed, PWellFormed] at wf
Proof state after:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf : ↑(pgfp (WellFormedF C)) ⊥ i m
⊢ i = (Container.M.destruct ↑{ val := m, property := wf }).fst.fst
Theorem: IContainer.M.index_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf : ↑(pgfp (WellFormedF C)) ⊥ i m
⊢ i = (Container.M.destruct ↑{ val := m, property := wf }).fst.fst
Tactic:
rw [←pgfp.unfold] at wf
Proof state after:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (⊥ ⊔ ↑(pgfp (WellFormedF C)) ⊥) i m
⊢ i = (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
Theorem: IContainer.M.index_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (⊥ ⊔ ↑(pgfp (WellFormedF C)) ⊥) i m
⊢ i = (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
Tactic:
simp only [CompleteLattice.bot_sup] at wf
Proof state after:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
⊢ i = (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
Theorem: IContainer.M.index_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
⊢ i = (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
Tactic:
have ⟨x, _⟩ := wf
Proof state after:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
x : (Container.M.destruct m).fst.fst = i
right✝ :
  ∀ (x : B C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd),
    ↑(pgfp (WellFormedF C)) ⊥ (N C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd x)
      (PSigma.snd (Container.M.destruct m) x)
⊢ i = (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
Theorem: IContainer.M.index_destruct
Proof state before:
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
x : (Container.M.destruct m).fst.fst = i
right✝ :
  ∀ (x : B C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd),
    ↑(pgfp (WellFormedF C)) ⊥ (N C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd x)
      (PSigma.snd (Container.M.destruct m) x)
⊢ i = (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst
Tactic:
apply Eq.symm
Proof state after:
case h
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
x : (Container.M.destruct m).fst.fst = i
right✝ :
  ∀ (x : B C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd),
    ↑(pgfp (WellFormedF C)) ⊥ (N C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd x)
      (PSigma.snd (Container.M.destruct m) x)
⊢ (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst = i
Theorem: IContainer.M.index_destruct
Proof state before:
case h
I : Type u₀
C : IContainer I
i : I
x✝ : M C i
m : Container.M (toContainer C)
wf✝ : ↑(pgfp (WellFormedF C)) ⊥ i m
wf : ↑(WellFormedF C) (↑(pgfp (WellFormedF C)) ⊥) i m
x : (Container.M.destruct m).fst.fst = i
right✝ :
  ∀ (x : B C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd),
    ↑(pgfp (WellFormedF C)) ⊥ (N C (Container.M.destruct m).fst.fst (Container.M.destruct m).fst.snd x)
      (PSigma.snd (Container.M.destruct m) x)
⊢ (Container.M.destruct ↑{ val := m, property := wf✝ }).fst.fst = i
Tactic:
exact x
Proof state after:
no goals
Theorem: IContainer.M.bisim
Proof state before:
I : Type u₀
C : IContainer I
R : (i : I) → M C i → M C i → Prop
h₀ :
  ∀ (i : I) (x y : M C i),
    R i x y →
      ∃ node k₁ k₂,
        destruct x = { fst := node, snd := k₁ } ∧
          destruct y = { fst := node, snd := k₂ } ∧ ∀ (z : B C i node), R (N C i node z) (k₁ z) (k₂ z)
i : I
⊢ ∀ (x y : M C i), R i x y → x = y
Tactic:
intro ⟨x, wfx⟩ ⟨y, wfy⟩ h₁
Proof state after:
I : Type u₀
C : IContainer I
R : (i : I) → M C i → M C i → Prop
h₀ :
  ∀ (i : I) (x y : M C i),
    R i x y →
      ∃ node k₁ k₂,
        destruct x = { fst := node, snd := k₁ } ∧
          destruct y = { fst := node, snd := k₂ } ∧ ∀ (z : B C i node), R (N C i node z) (k₁ z) (k₂ z)
i : I
x : Container.M (toContainer C)
wfx : WellFormed i x
y : Container.M (toContainer C)
wfy : WellFormed i y
h₁ : R i { val := x, property := wfx } { val := y, property := wfy }
⊢ { val := x, property := wfx } = { val := y, property := wfy }