l3lab/ntp-mathlib huggingface dataset:
theorem map_iInf₂ [InfSet α] [InfSet β] [sInfHomClass F α β] (f : F) (g : ∀ i, κ i → α) :
    f (⨅ (i) (j), g i j) = ⨅ (i) (j), f (g i j) := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : InfSet α
inst✝¹ : InfSet β
inst✝ : sInfHomClass F α β
f : F
g : (i : ι) → κ i → α
⊢ f (⨅ i, ⨅ j, g i j) = ⨅ i, ⨅ j, f (g i j)

Next tactic:
simp_rw [map_iInf]
instance (priority := 100) sSupHomClass.toSupBotHomClass [CompleteLattice α]
    [CompleteLattice β] [sSupHomClass F α β] : SupBotHomClass F α β :=
  {  ‹sSupHomClass F α β› with
    map_sup := fun f a b => by
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : sSupHomClass F α β
src✝ : sSupHomClass F α β := inst✝
f : F
a b : α
⊢ f (a ⊔ b) = f a ⊔ f b

Next tactic:
rw [← sSup_pair, map_sSup]
instance (priority := 100) sSupHomClass.toSupBotHomClass [CompleteLattice α]
    [CompleteLattice β] [sSupHomClass F α β] : SupBotHomClass F α β :=
  {  ‹sSupHomClass F α β› with
    map_sup := fun f a b => by
      rw [← sSup_pair, map_sSup]
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : sSupHomClass F α β
src✝ : sSupHomClass F α β := inst✝
f : F
a b : α
⊢ sSup (⇑f '' {a, b}) = f a ⊔ f b

Next tactic:
simp only [Set.image_pair, sSup_insert, sSup_singleton]
instance (priority := 100) sSupHomClass.toSupBotHomClass [CompleteLattice α]
    [CompleteLattice β] [sSupHomClass F α β] : SupBotHomClass F α β :=
  {  ‹sSupHomClass F α β› with
    map_sup := fun f a b => by
      rw [← sSup_pair, map_sSup]
      simp only [Set.image_pair, sSup_insert, sSup_singleton]
    map_bot := fun f => by
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : sSupHomClass F α β
src✝ : sSupHomClass F α β := inst✝
f : F
⊢ f ⊥ = ⊥

Next tactic:
rw [← sSup_empty, map_sSup, Set.image_empty]
instance (priority := 100) sSupHomClass.toSupBotHomClass [CompleteLattice α]
    [CompleteLattice β] [sSupHomClass F α β] : SupBotHomClass F α β :=
  {  ‹sSupHomClass F α β› with
    map_sup := fun f a b => by
      rw [← sSup_pair, map_sSup]
      simp only [Set.image_pair, sSup_insert, sSup_singleton]
    map_bot := fun f => by
      rw [← sSup_empty, map_sSup, Set.image_empty]
      -- Porting note: rw [sSup_empty] does not work, but exact sSup_empty does?
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : sSupHomClass F α β
src✝ : sSupHomClass F α β := inst✝
f : F
⊢ sSup ∅ = ⊥

Next tactic:
exact sSup_empty
instance (priority := 100) sInfHomClass.toInfTopHomClass [CompleteLattice α]
    [CompleteLattice β] [sInfHomClass F α β] : InfTopHomClass F α β :=
  { ‹sInfHomClass F α β› with
    map_inf := fun f a b => by
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : sInfHomClass F α β
src✝ : sInfHomClass F α β := inst✝
f : F
a b : α
⊢ f (a ⊓ b) = f a ⊓ f b

Next tactic:
rw [← sInf_pair, map_sInf, Set.image_pair]
instance (priority := 100) sInfHomClass.toInfTopHomClass [CompleteLattice α]
    [CompleteLattice β] [sInfHomClass F α β] : InfTopHomClass F α β :=
  { ‹sInfHomClass F α β› with
    map_inf := fun f a b => by
      rw [← sInf_pair, map_sInf, Set.image_pair]
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : sInfHomClass F α β
src✝ : sInfHomClass F α β := inst✝
f : F
a b : α
⊢ sInf {f a, f b} = f a ⊓ f b

Next tactic:
simp only [Set.image_pair, sInf_insert, sInf_singleton]
instance (priority := 100) sInfHomClass.toInfTopHomClass [CompleteLattice α]
    [CompleteLattice β] [sInfHomClass F α β] : InfTopHomClass F α β :=
  { ‹sInfHomClass F α β› with
    map_inf := fun f a b => by
      rw [← sInf_pair, map_sInf, Set.image_pair]
      simp only [Set.image_pair, sInf_insert, sInf_singleton]
    map_top := fun f => by
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : sInfHomClass F α β
src✝ : sInfHomClass F α β := inst✝
f : F
⊢ f ⊤ = ⊤

Next tactic:
rw [← sInf_empty, map_sInf, Set.image_empty]
instance (priority := 100) sInfHomClass.toInfTopHomClass [CompleteLattice α]
    [CompleteLattice β] [sInfHomClass F α β] : InfTopHomClass F α β :=
  { ‹sInfHomClass F α β› with
    map_inf := fun f a b => by
      rw [← sInf_pair, map_sInf, Set.image_pair]
      simp only [Set.image_pair, sInf_insert, sInf_singleton]
    map_top := fun f => by
      rw [← sInf_empty, map_sInf, Set.image_empty]
      -- Porting note: rw [sInf_empty] does not work, but exact sInf_empty does?
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : sInfHomClass F α β
src✝ : sInfHomClass F α β := inst✝
f : F
⊢ sInf ∅ = ⊤

Next tactic:
exact sInf_empty
instance (priority := 100) OrderIsoClass.tosSupHomClass [CompleteLattice α]
    [CompleteLattice β] [OrderIsoClass F α β] : sSupHomClass F α β :=
  { show OrderHomClass F α β from inferInstance with
    map_sSup := fun f s =>
      eq_of_forall_ge_iff fun c => by
        

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : OrderIsoClass F α β
src✝ : OrderHomClass F α β :=
  let_fun this := inferInstance;
  this
f : F
s : Set α
c : β
⊢ f (sSup s) ≤ c ↔ sSup (⇑f '' s) ≤ c

Next tactic:
simp only [← le_map_inv_iff, sSup_le_iff, Set.ball_image_iff]
instance (priority := 100) OrderIsoClass.tosInfHomClass [CompleteLattice α]
    [CompleteLattice β] [OrderIsoClass F α β] : sInfHomClass F α β :=
  { show OrderHomClass F α β from inferInstance with
    map_sInf := fun f s =>
      eq_of_forall_le_iff fun c => by
        

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝² : CompleteLattice α
inst✝¹ : CompleteLattice β
inst✝ : OrderIsoClass F α β
src✝ : OrderHomClass F α β :=
  let_fun this := inferInstance;
  this
f : F
s : Set α
c : β
⊢ c ≤ f (sInf s) ↔ c ≤ sInf (⇑f '' s)

Next tactic:
simp only [← map_inv_le_iff, le_sInf_iff, Set.ball_image_iff]
instance : sSupHomClass (sSupHom α β) α β
    where
  coe := sSupHom.toFun
  coe_injective' f g h := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : SupSet α
inst✝² : SupSet β
inst✝¹ : SupSet γ
inst✝ : SupSet δ
f g : sSupHom α β
h : f.toFun = g.toFun
⊢ f = g

Next tactic:
cases f
instance : sSupHomClass (sSupHom α β) α β
    where
  coe := sSupHom.toFun
  coe_injective' f g h := by cases f; 

Proof state:
case mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : SupSet α
inst✝² : SupSet β
inst✝¹ : SupSet γ
inst✝ : SupSet δ
g : sSupHom α β
toFun✝ : α → β
map_sSup'✝ : ∀ (s : Set α), toFun✝ (sSup s) = sSup (toFun✝ '' s)
h : { toFun := toFun✝, map_sSup' := map_sSup'✝ }.toFun = g.toFun
⊢ { toFun := toFun✝, map_sSup' := map_sSup'✝ } = g

Next tactic:
cases g
instance : sSupHomClass (sSupHom α β) α β
    where
  coe := sSupHom.toFun
  coe_injective' f g h := by cases f; cases g; 

Proof state:
case mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : SupSet α
inst✝² : SupSet β
inst✝¹ : SupSet γ
inst✝ : SupSet δ
toFun✝¹ : α → β
map_sSup'✝¹ : ∀ (s : Set α), toFun✝¹ (sSup s) = sSup (toFun✝¹ '' s)
toFun✝ : α → β
map_sSup'✝ : ∀ (s : Set α), toFun✝ (sSup s) = sSup (toFun✝ '' s)
h : { toFun := toFun✝¹, map_sSup' := map_sSup'✝¹ }.toFun = { toFun := toFun✝, map_sSup' := map_sSup'✝ }.toFun
⊢ { toFun := toFun✝¹, map_sSup' := map_sSup'✝¹ } = { toFun := toFun✝, map_sSup' := map_sSup'✝ }

Next tactic:
congr
/-- `id` as a `sSupHom`. -/
protected def id : sSupHom α α :=
  ⟨id, fun s => by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : SupSet α
inst✝² : SupSet β
inst✝¹ : SupSet γ
inst✝ : SupSet δ
s : Set α
⊢ id (sSup s) = sSup (id '' s)

Next tactic:
rw [id, Set.image_id]
/-- Composition of `sSupHom`s as a `sSupHom`. -/
def comp (f : sSupHom β γ) (g : sSupHom α β) : sSupHom α γ
    where
  toFun := f ∘ g
  map_sSup' s := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : SupSet α
inst✝² : SupSet β
inst✝¹ : SupSet γ
inst✝ : SupSet δ
f : sSupHom β γ
g : sSupHom α β
s : Set α
⊢ (⇑f ∘ ⇑g) (sSup s) = sSup (⇑f ∘ ⇑g '' s)

Next tactic:
rw [comp_apply, map_sSup, map_sSup, Set.image_image]
/-- Composition of `sSupHom`s as a `sSupHom`. -/
def comp (f : sSupHom β γ) (g : sSupHom α β) : sSupHom α γ
    where
  toFun := f ∘ g
  map_sSup' s := by rw [comp_apply, map_sSup, map_sSup, Set.image_image]; 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : SupSet α
inst✝² : SupSet β
inst✝¹ : SupSet γ
inst✝ : SupSet δ
f : sSupHom β γ
g : sSupHom α β
s : Set α
⊢ sSup ((fun x => f (g x)) '' s) = sSup (⇑f ∘ ⇑g '' s)

Next tactic:
simp only [Function.comp]
@[simp]
theorem cancel_left {g : sSupHom β γ} {f₁ f₂ : sSupHom α β} (hg : Injective g) :
    g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
  ⟨fun h => ext fun a => hg <| by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : SupSet α
inst✝² : SupSet β
inst✝¹ : SupSet γ
inst✝ : SupSet δ
g : sSupHom β γ
f₁ f₂ : sSupHom α β
hg : Injective ⇑g
h : comp g f₁ = comp g f₂
a : α
⊢ g (f₁ a) = g (f₂ a)

Next tactic:
rw [← comp_apply, h, comp_apply]
instance : Bot (sSupHom α β) :=
  ⟨⟨fun _ => ⊥, fun s => by
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝ : SupSet α
x✝ : CompleteLattice β
s : Set α
⊢ (fun x => ⊥) (sSup s) = sSup ((fun x => ⊥) '' s)

Next tactic:
obtain rfl | hs := s.eq_empty_or_nonempty
instance : Bot (sSupHom α β) :=
  ⟨⟨fun _ => ⊥, fun s => by
      obtain rfl | hs := s.eq_empty_or_nonempty
      · 

Proof state:
case inl
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝ : SupSet α
x✝ : CompleteLattice β
⊢ (fun x => ⊥) (sSup ∅) = sSup ((fun x => ⊥) '' ∅)

Next tactic:
rw [Set.image_empty, sSup_empty]
instance : Bot (sSupHom α β) :=
  ⟨⟨fun _ => ⊥, fun s => by
      obtain rfl | hs := s.eq_empty_or_nonempty
      · rw [Set.image_empty, sSup_empty]
      · 

Proof state:
case inr
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝ : SupSet α
x✝ : CompleteLattice β
s : Set α
hs : Set.Nonempty s
⊢ (fun x => ⊥) (sSup s) = sSup ((fun x => ⊥) '' s)

Next tactic:
rw [hs.image_const, sSup_singleton]
instance : sInfHomClass (sInfHom α β) α β
    where
  coe := sInfHom.toFun
  coe_injective' f g h := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : InfSet α
inst✝² : InfSet β
inst✝¹ : InfSet γ
inst✝ : InfSet δ
f g : sInfHom α β
h : f.toFun = g.toFun
⊢ f = g

Next tactic:
cases f
instance : sInfHomClass (sInfHom α β) α β
    where
  coe := sInfHom.toFun
  coe_injective' f g h := by cases f; 

Proof state:
case mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : InfSet α
inst✝² : InfSet β
inst✝¹ : InfSet γ
inst✝ : InfSet δ
g : sInfHom α β
toFun✝ : α → β
map_sInf'✝ : ∀ (s : Set α), toFun✝ (sInf s) = sInf (toFun✝ '' s)
h : { toFun := toFun✝, map_sInf' := map_sInf'✝ }.toFun = g.toFun
⊢ { toFun := toFun✝, map_sInf' := map_sInf'✝ } = g

Next tactic:
cases g
instance : sInfHomClass (sInfHom α β) α β
    where
  coe := sInfHom.toFun
  coe_injective' f g h := by cases f; cases g; 

Proof state:
case mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : InfSet α
inst✝² : InfSet β
inst✝¹ : InfSet γ
inst✝ : InfSet δ
toFun✝¹ : α → β
map_sInf'✝¹ : ∀ (s : Set α), toFun✝¹ (sInf s) = sInf (toFun✝¹ '' s)
toFun✝ : α → β
map_sInf'✝ : ∀ (s : Set α), toFun✝ (sInf s) = sInf (toFun✝ '' s)
h : { toFun := toFun✝¹, map_sInf' := map_sInf'✝¹ }.toFun = { toFun := toFun✝, map_sInf' := map_sInf'✝ }.toFun
⊢ { toFun := toFun✝¹, map_sInf' := map_sInf'✝¹ } = { toFun := toFun✝, map_sInf' := map_sInf'✝ }

Next tactic:
congr
/-- `id` as an `sInfHom`. -/
protected def id : sInfHom α α :=
  ⟨id, fun s => by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : InfSet α
inst✝² : InfSet β
inst✝¹ : InfSet γ
inst✝ : InfSet δ
s : Set α
⊢ id (sInf s) = sInf (id '' s)

Next tactic:
rw [id, Set.image_id]
/-- Composition of `sInfHom`s as a `sInfHom`. -/
def comp (f : sInfHom β γ) (g : sInfHom α β) : sInfHom α γ
    where
  toFun := f ∘ g
  map_sInf' s := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : InfSet α
inst✝² : InfSet β
inst✝¹ : InfSet γ
inst✝ : InfSet δ
f : sInfHom β γ
g : sInfHom α β
s : Set α
⊢ (⇑f ∘ ⇑g) (sInf s) = sInf (⇑f ∘ ⇑g '' s)

Next tactic:
rw [comp_apply, map_sInf, map_sInf, Set.image_image]
/-- Composition of `sInfHom`s as a `sInfHom`. -/
def comp (f : sInfHom β γ) (g : sInfHom α β) : sInfHom α γ
    where
  toFun := f ∘ g
  map_sInf' s := by rw [comp_apply, map_sInf, map_sInf, Set.image_image]; 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : InfSet α
inst✝² : InfSet β
inst✝¹ : InfSet γ
inst✝ : InfSet δ
f : sInfHom β γ
g : sInfHom α β
s : Set α
⊢ sInf ((fun x => f (g x)) '' s) = sInf (⇑f ∘ ⇑g '' s)

Next tactic:
simp only [Function.comp]
@[simp]
theorem cancel_left {g : sInfHom β γ} {f₁ f₂ : sInfHom α β} (hg : Injective g) :
    g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
  ⟨fun h => ext fun a => hg <| by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : InfSet α
inst✝² : InfSet β
inst✝¹ : InfSet γ
inst✝ : InfSet δ
g : sInfHom β γ
f₁ f₂ : sInfHom α β
hg : Injective ⇑g
h : comp g f₁ = comp g f₂
a : α
⊢ g (f₁ a) = g (f₂ a)

Next tactic:
rw [← comp_apply, h, comp_apply]
instance : Top (sInfHom α β) :=
  ⟨⟨fun _ => ⊤, fun s => by
      

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝¹ : InfSet α
inst✝ : CompleteLattice β
s : Set α
⊢ (fun x => ⊤) (sInf s) = sInf ((fun x => ⊤) '' s)

Next tactic:
obtain rfl | hs := s.eq_empty_or_nonempty
instance : Top (sInfHom α β) :=
  ⟨⟨fun _ => ⊤, fun s => by
      obtain rfl | hs := s.eq_empty_or_nonempty
      · 

Proof state:
case inl
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝¹ : InfSet α
inst✝ : CompleteLattice β
⊢ (fun x => ⊤) (sInf ∅) = sInf ((fun x => ⊤) '' ∅)

Next tactic:
rw [Set.image_empty, sInf_empty]
instance : Top (sInfHom α β) :=
  ⟨⟨fun _ => ⊤, fun s => by
      obtain rfl | hs := s.eq_empty_or_nonempty
      · rw [Set.image_empty, sInf_empty]
      · 

Proof state:
case inr
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝¹ : InfSet α
inst✝ : CompleteLattice β
s : Set α
hs : Set.Nonempty s
⊢ (fun x => ⊤) (sInf s) = sInf ((fun x => ⊤) '' s)

Next tactic:
rw [hs.image_const, sInf_singleton]
instance : FrameHomClass (FrameHom α β) α β
    where
  coe f := f.toFun
  coe_injective' f g h := by
    

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : CompleteLattice α
inst✝² : CompleteLattice β
inst✝¹ : CompleteLattice γ
inst✝ : CompleteLattice δ
f g : FrameHom α β
h : (fun f => f.toFun) f = (fun f => f.toFun) g
⊢ f = g

Next tactic:
obtain ⟨⟨⟨_, _⟩, _⟩, _⟩ := f
instance : FrameHomClass (FrameHom α β) α β
    where
  coe f := f.toFun
  coe_injective' f g h := by
    obtain ⟨⟨⟨_, _⟩, _⟩, _⟩ := f
    

Proof state:
case mk.mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : CompleteLattice α
inst✝² : CompleteLattice β
inst✝¹ : CompleteLattice γ
inst✝ : CompleteLattice δ
g : FrameHom α β
toFun✝ : α → β
map_inf'✝ : ∀ (a b : α), toFun✝ (a ⊓ b) = toFun✝ a ⊓ toFun✝ b
map_top'✝ : InfHom.toFun { toFun := toFun✝, map_inf' := map_inf'✝ } ⊤ = ⊤
map_sSup'✝ :
  ∀ (s : Set α),
    InfHom.toFun { toInfHom := { toFun := toFun✝, map_inf' := map_inf'✝ }, map_top' := map_top'✝ }.toInfHom (sSup s) =
      sSup ({ toInfHom := { toFun := toFun✝, map_inf' := map_inf'✝ }, map_top' := map_top'✝ }.toInfHom.toFun '' s)
h :
  (fun f => f.toFun)
      { toInfTopHom := { toInfHom := { toFun := toFun✝, map_inf' := map_inf'✝ }, map_top' := map_top'✝ },
        map_sSup' := map_sSup'✝ } =
    (fun f => f.toFun) g
⊢ { toInfTopHom := { toInfHom := { toFun := toFun✝, map_inf' := map_inf'✝ }, map_top' := map_top'✝ },
      map_sSup' := map_sSup'✝ } =
    g

Next tactic:
obtain ⟨⟨⟨_, _⟩, _⟩, _⟩ := g
instance : FrameHomClass (FrameHom α β) α β
    where
  coe f := f.toFun
  coe_injective' f g h := by
    obtain ⟨⟨⟨_, _⟩, _⟩, _⟩ := f
    obtain ⟨⟨⟨_, _⟩, _⟩, _⟩ := g
    

Proof state:
case mk.mk.mk.mk.mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : CompleteLattice α
inst✝² : CompleteLattice β
inst✝¹ : CompleteLattice γ
inst✝ : CompleteLattice δ
toFun✝¹ : α → β
map_inf'✝¹ : ∀ (a b : α), toFun✝¹ (a ⊓ b) = toFun✝¹ a ⊓ toFun✝¹ b
map_top'✝¹ : InfHom.toFun { toFun := toFun✝¹, map_inf' := map_inf'✝¹ } ⊤ = ⊤
map_sSup'✝¹ :
  ∀ (s : Set α),
    InfHom.toFun { toInfHom := { toFun := toFun✝¹, map_inf' := map_inf'✝¹ }, map_top' := map_top'✝¹ }.toInfHom
        (sSup s) =
      sSup ({ toInfHom := { toFun := toFun✝¹, map_inf' := map_inf'✝¹ }, map_top' := map_top'✝¹ }.toInfHom.toFun '' s)
toFun✝ : α → β
map_inf'✝ : ∀ (a b : α), toFun✝ (a ⊓ b) = toFun✝ a ⊓ toFun✝ b
map_top'✝ : InfHom.toFun { toFun := toFun✝, map_inf' := map_inf'✝ } ⊤ = ⊤
map_sSup'✝ :
  ∀ (s : Set α),
    InfHom.toFun { toInfHom := { toFun := toFun✝, map_inf' := map_inf'✝ }, map_top' := map_top'✝ }.toInfHom (sSup s) =
      sSup ({ toInfHom := { toFun := toFun✝, map_inf' := map_inf'✝ }, map_top' := map_top'✝ }.toInfHom.toFun '' s)
h :
  (fun f => f.toFun)
      { toInfTopHom := { toInfHom := { toFun := toFun✝¹, map_inf' := map_inf'✝¹ }, map_top' := map_top'✝¹ },
        map_sSup' := map_sSup'✝¹ } =
    (fun f => f.toFun)
      { toInfTopHom := { toInfHom := { toFun := toFun✝, map_inf' := map_inf'✝ }, map_top' := map_top'✝ },
        map_sSup' := map_sSup'✝ }
⊢ { toInfTopHom := { toInfHom := { toFun := toFun✝¹, map_inf' := map_inf'✝¹ }, map_top' := map_top'✝¹ },
      map_sSup' := map_sSup'✝¹ } =
    { toInfTopHom := { toInfHom := { toFun := toFun✝, map_inf' := map_inf'✝ }, map_top' := map_top'✝ },
      map_sSup' := map_sSup'✝ }

Next tactic:
congr
@[simp]
theorem cancel_left {g : FrameHom β γ} {f₁ f₂ : FrameHom α β} (hg : Injective g) :
    g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
  ⟨fun h => ext fun a => hg <| by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : CompleteLattice α
inst✝² : CompleteLattice β
inst✝¹ : CompleteLattice γ
inst✝ : CompleteLattice δ
g : FrameHom β γ
f₁ f₂ : FrameHom α β
hg : Injective ⇑g
h : comp g f₁ = comp g f₂
a : α
⊢ g (f₁ a) = g (f₂ a)

Next tactic:
rw [← comp_apply, h, comp_apply]
instance : CompleteLatticeHomClass (CompleteLatticeHom α β) α β
    where
  coe f := f.toFun
  coe_injective' f g h := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : CompleteLattice α
inst✝² : CompleteLattice β
inst✝¹ : CompleteLattice γ
inst✝ : CompleteLattice δ
f g : CompleteLatticeHom α β
h : (fun f => f.toFun) f = (fun f => f.toFun) g
⊢ f = g

Next tactic:
obtain ⟨⟨_, _⟩, _⟩ := f
instance : CompleteLatticeHomClass (CompleteLatticeHom α β) α β
    where
  coe f := f.toFun
  coe_injective' f g h := by obtain ⟨⟨_, _⟩, _⟩ := f; 

Proof state:
case mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : CompleteLattice α
inst✝² : CompleteLattice β
inst✝¹ : CompleteLattice γ
inst✝ : CompleteLattice δ
g : CompleteLatticeHom α β
toFun✝ : α → β
map_sInf'✝ : ∀ (s : Set α), toFun✝ (sInf s) = sInf (toFun✝ '' s)
map_sSup'✝ :
  ∀ (s : Set α),
    sInfHom.toFun { toFun := toFun✝, map_sInf' := map_sInf'✝ } (sSup s) =
      sSup ({ toFun := toFun✝, map_sInf' := map_sInf'✝ }.toFun '' s)
h :
  (fun f => f.toFun) { tosInfHom := { toFun := toFun✝, map_sInf' := map_sInf'✝ }, map_sSup' := map_sSup'✝ } =
    (fun f => f.toFun) g
⊢ { tosInfHom := { toFun := toFun✝, map_sInf' := map_sInf'✝ }, map_sSup' := map_sSup'✝ } = g

Next tactic:
obtain ⟨⟨_, _⟩, _⟩ := g
instance : CompleteLatticeHomClass (CompleteLatticeHom α β) α β
    where
  coe f := f.toFun
  coe_injective' f g h := by obtain ⟨⟨_, _⟩, _⟩ := f; obtain ⟨⟨_, _⟩, _⟩ := g; 

Proof state:
case mk.mk.mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : CompleteLattice α
inst✝² : CompleteLattice β
inst✝¹ : CompleteLattice γ
inst✝ : CompleteLattice δ
toFun✝¹ : α → β
map_sInf'✝¹ : ∀ (s : Set α), toFun✝¹ (sInf s) = sInf (toFun✝¹ '' s)
map_sSup'✝¹ :
  ∀ (s : Set α),
    sInfHom.toFun { toFun := toFun✝¹, map_sInf' := map_sInf'✝¹ } (sSup s) =
      sSup ({ toFun := toFun✝¹, map_sInf' := map_sInf'✝¹ }.toFun '' s)
toFun✝ : α → β
map_sInf'✝ : ∀ (s : Set α), toFun✝ (sInf s) = sInf (toFun✝ '' s)
map_sSup'✝ :
  ∀ (s : Set α),
    sInfHom.toFun { toFun := toFun✝, map_sInf' := map_sInf'✝ } (sSup s) =
      sSup ({ toFun := toFun✝, map_sInf' := map_sInf'✝ }.toFun '' s)
h :
  (fun f => f.toFun) { tosInfHom := { toFun := toFun✝¹, map_sInf' := map_sInf'✝¹ }, map_sSup' := map_sSup'✝¹ } =
    (fun f => f.toFun) { tosInfHom := { toFun := toFun✝, map_sInf' := map_sInf'✝ }, map_sSup' := map_sSup'✝ }
⊢ { tosInfHom := { toFun := toFun✝¹, map_sInf' := map_sInf'✝¹ }, map_sSup' := map_sSup'✝¹ } =
    { tosInfHom := { toFun := toFun✝, map_sInf' := map_sInf'✝ }, map_sSup' := map_sSup'✝ }

Next tactic:
congr
@[simp]
theorem cancel_left {g : CompleteLatticeHom β γ} {f₁ f₂ : CompleteLatticeHom α β}
    (hg : Injective g) : g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
  ⟨fun h => ext fun a => hg <| by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
inst✝³ : CompleteLattice α
inst✝² : CompleteLattice β
inst✝¹ : CompleteLattice γ
inst✝ : CompleteLattice δ
g : CompleteLatticeHom β γ
f₁ f₂ : CompleteLatticeHom α β
hg : Injective ⇑g
h : comp g f₁ = comp g f₂
a : α
⊢ g (f₁ a) = g (f₂ a)

Next tactic:
rw [← comp_apply, h, comp_apply]
/-- `Set.preimage` as a complete lattice homomorphism.

See also `sSupHom.setImage`. -/
def setPreimage (f : α → β) : CompleteLatticeHom (Set β) (Set α)
    where
  toFun := preimage f
  map_sSup' s := preimage_sUnion.trans <| by simp only [Set.sSup_eq_sUnion, Set.sUnion_image]
  map_sInf' s := preimage_sInter.trans <| by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
ι : Sort u_6
κ : ι → Sort u_7
f : α → β
s : Set (Set β)
⊢ ⋂ t ∈ s, f ⁻¹' t = sInf (preimage f '' s)

Next tactic:
simp only [Set.sInf_eq_sInter, Set.sInter_image]