/-- The directed limit glues together the structures along the embeddings. -/
def setoid [DirectedSystem G fun i j h => f i j h] [IsDirected ι (· ≤ ·)] : Setoid (Σˣ f) where
  r := fun ⟨i, x⟩ ⟨j, y⟩ => ∃ (k : ι) (ik : i ≤ k) (jk : j ≤ k), f i k ik x = f j k jk y
  iseqv :=
    ⟨fun ⟨i, x⟩ => ⟨i, refl i, refl i, rfl⟩, @fun ⟨i, x⟩ ⟨j, y⟩ ⟨k, ik, jk, h⟩ =>
      ⟨k, jk, ik, h.symm⟩,
      @fun ⟨i, x⟩ ⟨j, y⟩ ⟨k, z⟩ ⟨ij, hiij, hjij, hij⟩ ⟨jk, hjjk, hkjk, hjk⟩ => by
        obtain ⟨ijk, hijijk, hjkijk⟩ := directed_of (· ≤ ·) ij jk
        refine' ⟨ijk, le_trans hiij hijijk, le_trans hkjk hjkijk, _⟩
        rw [← DirectedSystem.map_map, hij, DirectedSystem.map_map]
        

Proof state:
case intro.intro
L : Language
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → Structure L (G i)
f : (i j : ι) → i ≤ j → G i ↪[L] G j
inst✝¹ : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
x✝⁴ x✝³ x✝² : Σˣ f
i : ι
x : (fun i => G i) i
j : ι
y : (fun i => G i) j
x✝¹ :
  match { fst := i, snd := x } with
  | { fst := i, snd := x } =>
    match { fst := j, snd := y } with
    | { fst := j, snd := y } => ∃ k, ∃ (ik : i ≤ k) (jk : j ≤ k), (f i k ik) x = (f j k jk) y
k : ι
z : (fun i => G i) k
x✝ :
  match { fst := j, snd := y } with
  | { fst := i, snd := x } =>
    match { fst := k, snd := z } with
    | { fst := j, snd := y } => ∃ k, ∃ (ik : i ≤ k) (jk : j ≤ k), (f i k ik) x = (f j k jk) y
ij : ι
hiij : i ≤ ij
hjij : j ≤ ij
hij : (f i ij hiij) x = (f j ij hjij) y
jk : ι
hjjk : j ≤ jk
hkjk : k ≤ jk
hjk : (f j jk hjjk) y = (f k jk hkjk) z
ijk : ι
hijijk : ij ≤ ijk
hjkijk : jk ≤ ijk
⊢ (f j ijk (_ : j ≤ ijk)) y = (f k ijk (_ : k ≤ ijk)) z
case intro.intro.hjk
L : Language
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → Structure L (G i)
f : (i j : ι) → i ≤ j → G i ↪[L] G j
inst✝¹ : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
x✝⁴ x✝³ x✝² : Σˣ f
i : ι
x : (fun i => G i) i
j : ι
y : (fun i => G i) j
x✝¹ :
  match { fst := i, snd := x } with
  | { fst := i, snd := x } =>
    match { fst := j, snd := y } with
    | { fst := j, snd := y } => ∃ k, ∃ (ik : i ≤ k) (jk : j ≤ k), (f i k ik) x = (f j k jk) y
k : ι
z : (fun i => G i) k
x✝ :
  match { fst := j, snd := y } with
  | { fst := i, snd := x } =>
    match { fst := k, snd := z } with
    | { fst := j, snd := y } => ∃ k, ∃ (ik : i ≤ k) (jk : j ≤ k), (f i k ik) x = (f j k jk) y
ij : ι
hiij : i ≤ ij
hjij : j ≤ ij
hij : (f i ij hiij) x = (f j ij hjij) y
jk : ι
hjjk : j ≤ jk
hkjk : k ≤ jk
hjk : (f j jk hjjk) y = (f k jk hkjk) z
ijk : ι
hijijk : ij ≤ ijk
hjkijk : jk ≤ ijk
⊢ ij ≤ ijk
case intro.intro.hjk
L : Language
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → Structure L (G i)
f : (i j : ι) → i ≤ j → G i ↪[L] G j
inst✝¹ : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
x✝⁴ x✝³ x✝² : Σˣ f
i : ι
x : (fun i => G i) i
j : ι
y : (fun i => G i) j
x✝¹ :
  match { fst := i, snd := x } with
  | { fst := i, snd := x } =>
    match { fst := j, snd := y } with
    | { fst := j, snd := y } => ∃ k, ∃ (ik : i ≤ k) (jk : j ≤ k), (f i k ik) x = (f j k jk) y
k : ι
z : (fun i => G i) k
x✝ :
  match { fst := j, snd := y } with
  | { fst := i, snd := x } =>
    match { fst := k, snd := z } with
    | { fst := j, snd := y } => ∃ k, ∃ (ik : i ≤ k) (jk : j ≤ k), (f i k ik) x = (f j k jk) y
ij : ι
hiij : i ≤ ij
hjij : j ≤ ij
hij : (f i ij hiij) x = (f j ij hjij) y
jk : ι
hjjk : j ≤ jk
hkjk : k ≤ jk
hjk : (f j jk hjjk) y = (f k jk hkjk) z
ijk : ι
hijijk : ij ≤ ijk
hjkijk : jk ≤ ijk
⊢ ij ≤ ijk
case intro.intro.hjk
L : Language
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → Structure L (G i)
f : (i j : ι) → i ≤ j → G i ↪[L] G j
inst✝¹ : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
x✝⁴ x✝³ x✝² : Σˣ f
i : ι
x : (fun i => G i) i
j : ι
y : (fun i => G i) j
x✝¹ :
  match { fst := i, snd := x } with
  | { fst := i, snd := x } =>
    match { fst := j, snd := y } with
    | { fst := j, snd := y } => ∃ k, ∃ (ik : i ≤ k) (jk : j ≤ k), (f i k ik) x = (f j k jk) y
k : ι
z : (fun i => G i) k
x✝ :
  match { fst := j, snd := y } with
  | { fst := i, snd := x } =>
    match { fst := k, snd := z } with
    | { fst := j, snd := y } => ∃ k, ∃ (ik : i ≤ k) (jk : j ≤ k), (f i k ik) x = (f j k jk) y
ij : ι
hiij : i ≤ ij
hjij : j ≤ ij
hij : (f i ij hiij) x = (f j ij hjij) y
jk : ι
hjjk : j ≤ jk
hkjk : k ≤ jk
hjk : (f j jk hjjk) y = (f k jk hkjk) z
ijk : ι
hijijk : ij ≤ ijk
hjkijk : jk ≤ ijk
⊢ ij ≤ ijk

Next tactic:
symm