Jakub Opršal, 15–24 March 2026.
Updated on 8 June 2026 by Tom de Jong to use minimal library imports.

In this file, I want to explore another of Taylor's results from [1]. Namely,
the following lemma.

LEMMA (Taylor, 1977).
  Let X be a topological space with an n-ary operation t satysfying a
  non-trivial idempotent Maltsev condition, then π₁(X, x₀) is abelian for all
  x₀ ∈ X.

This file explores a ternary case of Taylor's operation that is sufficiently
general that simplifications, like those for majority and Maltsev operations,
would not apply here.

The equations are called *ternary weak near-unanimity*. Briefly, they can be
described as similar to majority, except that the three substitutions do not
necessarily return a projection, but just a same value depending on both
x and y, i.e.,

  w (x, x, y) = w (x, y, x) = w (y, x, x)

It should be also noted that [2] contains a simple special case of Taylor's
equation, namely the binary case.

The proof here follows roughly the line that we outlined in [Lemma 2.12, 3],
although I need to prove that certain 'subgrupoids' are normal, which is not
necessary in the case of topological algebras with strictly idempotent
operations. Curiously, this fact was noted in Taylor's original paper [p. 515, 1].

[1] Walter Taylor. Varieties obeying homotopy laws. Can. J. Math., XXIX(3):
    498–527, 1977. https://doi.org/10.4153/CJM-1977-054-9.
[2] Tom de Jong. AlgebraicStructuresForcingSethood.CommutativeLoopSpaces.lagda,
    18 March 2026.
[3] Sebastian Meyer and Jakub Opršal. A topological proof of the Hell–Nešetřil
    dichotomy. https://arxiv.org/abs/2409.12627v2

WARNING!  I have used this exercise to learn some intricacies of Agda, so the
 code below is quite rough. I am leaving it as is, with proofs of symmetric
 cases being quite distinct, for the record of my progress with Agda.

\begin{code}

{-# OPTIONS --safe --without-K #-}
module AlgebraicStructuresForcingSethood.WeakNearUnanimity where

open import MLTT.Universes
open import MLTT.Id
open import MLTT.Sigma
open import UF.Base using
  ( ap₂
  ; ap₃
  ; ap₃-∙
  ; ap₃-∙'
  ; ap₃-⁻¹
  ; refl-left-neutral
  ; ∙assoc
  ; =-congr
  ; =-congr-refl
  ; =-congr-∙
  ; =-congr-cancel
  ; =-congr-ap₃
  ; right-inverse
  )

private
 sym = _⁻¹

\end{code}

We will need to use that `ap f` is onto in the sense that every path

  q : f a a = f a a

is of the form ap f q' q' q' for a suitably chosen q' : a = a. This is done
similarly as what Tom de Jong did in the binary case [2]; I will use a
rectangle like this:

  f a a ==idem== a ==idem== f a a
    |            |            |
    q      =>    q'         f q' q'
    |            |            |
  f a a ==idem== a ==idem== f a a

where q' is chosen so that the left square commutes. The required equality
`q = ap f q' q'` follows from the fact that top and bottom simplify to refl.

\begin{code}

module ternary-idempotent
       {A    : 𝓤 ̇ }
       (f    : A  A  A  A)
       (idem : (x : A)  f x x x  x)
       where

 idem^ : {a b : A}
        (p : a  b)
        =-congr (idem a) (idem b) (ap₃ f p p p)  p
 idem^ refl = =-congr-refl (idem _)

 ap₃-onto : {a : A}
           (p : f a a a  f a a a)
           Σ p'  a  a , ap₃ f p' p' p'  p
 ap₃-onto {a} p = p' , hp
  where
   p' = =-congr (idem a) (idem a) p
   hp = =-congr-cancel (idem a) (idem a) (idem^ p')

\end{code}

Now, we get to the fun part! The key idea is that for any binary operation f,
elements of the form `ap f p refl` and `ap f refl q` commute. We apply this to
three different binary operations defined from `w`. Furthermore, we use
Taylor's identities to smuggle the last part through by equating it to an
element that commutes.

\begin{code}

module ternary-wnu (A    : 𝓤 ̇ )
                   (w    : A  A  A  A)
                   (idem : (a : A)  w a a a  a)
                   (wnu₁ : (a b : A)  w a a b  w b a a)
                   (wnu₂ : (a b : A)  w a a b  w a b a)
                   where

 w' : {a : A}  a  a  a  a  a  a  w a a a  w a a a
 w' = ap₃ w

 base-1 : {a : A}
         (p₀ p₁ p₂ : a  a)
         w' p₀ refl refl  w' refl p₁ p₂  w' refl p₁ p₂  w' p₀ refl refl
 base-1 p₀ p₁ p₂ =
  w' p₀ refl refl  w' refl p₁ p₂    =⟨ sym I 
  w' p₀ p₁ p₂                        =⟨ II 
  w' refl p₁ p₂  w' p₀ refl refl    
   where
    I = ap₃-∙' w p₀ refl refl p₁ refl p₂ refl
               (sym refl-left-neutral) (sym refl-left-neutral)
    II = ap₃-∙' w refl p₀ p₁ refl p₂ refl (sym refl-left-neutral) refl refl

 base-2 : {a : A}
         (p₀ p₁ p₂ : a  a)
         w' refl p₁ refl  w' p₀ refl p₂  w' p₀ refl p₂  w' refl p₁ refl
 base-2 p₀ p₁ p₂ =
  w' refl p₁ refl  w' p₀ refl p₂    =⟨ sym I 
  w' p₀ p₁ p₂                        =⟨ II 
  w' p₀ refl p₂  w' refl p₁ refl    
   where
    I = ap₃-∙' w refl p₀ p₁ refl refl p₂
               (sym refl-left-neutral) refl (sym refl-left-neutral)
    II = ap₃-∙' w p₀ refl refl p₁ p₂ refl refl (sym refl-left-neutral) refl

 base-3 : {a : A}
         (p₀ p₁ p₂ : a  a)
         w' refl refl p₂  w' p₀ p₁ refl  w' p₀ p₁ refl  w' refl refl p₂
 base-3 p₀ p₁ p₂ =
  w' refl refl p₂  w' p₀ p₁ refl    =⟨ sym I 
  w' p₀ p₁ p₂                        =⟨ II 
  w' p₀ p₁ refl  w' refl refl p₂    
   where
    I = ap₃-∙' w refl p₀ refl p₁ p₂ refl (sym refl-left-neutral)
               (sym refl-left-neutral) refl
    II = ap₃-∙' w p₀ refl p₁ refl refl p₂ refl refl (sym refl-left-neutral)

 open ternary-idempotent w idem

 wnu₁^ : {a a' b b' : A}
        (p : a  a') (q : b  b')
        ap₃ w p p q  wnu₁ a' b'  wnu₁ a b  ap₃ w q p p
 wnu₁^ {a = a} {b = b} refl refl = refl-left-neutral

 wnu₂^ : {a a' b b' : A} (p : a  b) (p' : a'  b')
         ap₃ w p p' p  =-congr (wnu₂ a a') (wnu₂ b b') (ap₃ w p p p')
 wnu₂^ refl refl = sym (=-congr-refl (wnu₂ _ _))

 reduce₁ : {a : A} (q : a  a)
          Σ q'  a  a , Σ q''  a  a , w' q q q  w' refl q' q''
 reduce₁ {a} q = q' , q'' , eq
  where
   e = pr₁ (ap₃-onto (wnu₁ a a))
   he : w' e e e  wnu₁ a a
   he = pr₂ (ap₃-onto (wnu₁ a a))

   eq' : w' q q refl  w' refl (e  q  sym e) (e  q  sym e)
   eq' = w' q q refl                                =⟨ I 
         w' q q refl  (ε  ε')                     =⟨ II 
         (w' q q refl  ε)  ε'                     =⟨ III 
         (ε  w' refl q q)  ε'                     =⟨ IV 
         w' e e e  w' refl q q  sym (w' e e e)    =⟨ V 
         w' e e e  w' refl q q  w' e' e' e'       =⟨ VI 
         w' e (e  q) (e  q)    w' e' e' e'       =⟨ VII 
         w' (e  e') (e  q  e') (e  q  e')      =⟨ VIII 
         w' refl  (e  q  e') (e  q  e')         
    where
     ε = wnu₁ a a
     ε' = sym ε
     e' = sym e

     I = ap  p  w' q q refl  p) (right-inverse ε)
     II = sym (∙assoc (w' q q refl) ε ε')
     III = ap  p  p  ε') (wnu₁^ q refl)
     IV = ap  p  p  w' refl q q  sym p) (sym he)
     V = ap  p  w' e e e  w' refl q q  p) (sym (ap₃-⁻¹ w e e e))
     VI = ap  p  p  w' e' e' e') (sym (ap₃-∙ w e refl e q e q))
     VII = sym (ap₃-∙ w e e' (e  q) e' (e  q) e')
     VIII = ap  p  w' p (e  q  e') (e  q  e')) (sym (right-inverse e))

   q' = e  q  sym e
   q'' = e  q  sym e  q
   eq : w' q q q  w' refl q' q''
   eq = w' q q q                             =⟨ I 
        w' (q  refl) (q  refl) (refl  q)  =⟨ II 
        w' q q refl  w' refl refl q         =⟨ III 
        w' refl q' q'  w' refl refl q       =⟨ IV 
        w' refl (q'  refl) (q'  q)         =⟨ refl 
        w' refl q' q''                       
    where
     I = sym (ap₃ w' refl refl refl-left-neutral)
     II = ap₃-∙ w q refl q refl refl q
     III = ap  p  p  w' refl refl q) eq'
     IV = sym (ap₃-∙ w refl refl q' refl q' q)

 commutes₁ : {a : A}
            (p q : a  a)
            w' p refl refl  w' q q q  w' q q q  w' p refl refl
 commutes₁ p q =
  w' p refl refl  w' q q q                        =⟨ I 
  w' p refl refl  w' refl q' q''                  =⟨ base-1 p q' q'' 
  w' refl q' q''  w' p refl refl                  =⟨ II 
  w' q q q        w' p refl refl                  
   where
    q'  = pr₁ (reduce₁ q)
    q'' = pr₁ (pr₂ (reduce₁ q))
    he : w' q q q  w' refl q' q''
    he  = pr₂ (pr₂ (reduce₁ q))

    I = ap  -  w' p refl refl  -) he
    II = sym (ap  -  -  w' p refl refl) he)

 reduce₂ : {a : A} (q : a  a)
          Σ q'  a  a , Σ q''  a  a , w' q q q  w'  q' refl q''
 reduce₂ {a} q = q , q'' , hq
  where
   e : a  a
   e = pr₁ (ap₃-onto (wnu₂ a a))

   he : wnu₂ a a  ap₃ w e e e
   he = sym (pr₂ (ap₃-onto (wnu₂ a a)))

   q'' = q  (=-congr e e q)

   use-wnu₂ : ap₃ w refl q refl  ap₃ w refl refl (=-congr e e q)
   use-wnu₂ =
    ap₃ w refl q refl                                              =⟨ I 
    =-congr (wnu₂ a a) (wnu₂ a a) (ap₃ w refl refl q)             =⟨ II 
    =-congr (ap₃ w e e e) (ap₃ w e e e) (ap₃ w refl refl q)       =⟨ III 
    ap₃ w (=-congr e e refl) (=-congr e e refl) (=-congr e e q) =⟨ IV 
    ap₃ w refl refl (=-congr e e q)                               
     where
      I = wnu₂^ refl q
      II = ap  -  =-congr - - (ap₃ w refl refl q)) he
      III = =-congr-ap₃ w e e refl e e refl e e q
      IV = ap₂  - y  ap₃ w - - y) (=-congr-refl e) refl

   hq : ap₃ w q q q  ap₃ w q refl q''
   hq =
    ap₃ w q q q                                       =⟨ I 
    ap₃ w q refl q  ap₃ w refl q refl                =⟨ II 
    ap₃ w q refl q  ap₃ w refl refl (=-congr e e q) =⟨ III 
    ap₃ w q refl q''                                  
     where
      I = ap₃-∙' w q refl refl q q refl refl (sym refl-left-neutral) refl
      II = ap  -  ap₃ w q refl q  -) use-wnu₂
      III = sym (ap₃-∙' w q refl refl refl q (=-congr e e q) refl refl refl)

 commutes₂ : {a : A}
            (p q : a  a)
            w' refl p refl  w' q q q  w' q q q  w' refl p refl
 commutes₂ p q =
  w' refl p refl  w' q q q                   =⟨ I 
  w' refl p refl  w' q' refl q''             =⟨ base-2 q' p q'' 
  w' q' refl q''  w' refl p refl             =⟨ II 
  w' q q q        w' refl p refl             
   where
    q'  = pr₁ (reduce₂ q)
    q'' = pr₁ (pr₂ (reduce₂ q))
    hq  = pr₂ (pr₂ (reduce₂ q))

    I = ap (w' refl p refl ∙_) hq
    II = ap (_∙ w' refl p refl) (sym hq)

 reduce₃ : {a : A} (q : a  a)
          Σ q'  a  a , Σ q''  a  a , w' q q q  w'  q' q'' refl
 reduce₃ {a} q = (=-congr e e q) , (q  (=-congr e e q)) , hq
  where
   e : a  a
   e = pr₁ (ap₃-onto (wnu₂ a a))

   he : wnu₂ a a  ap₃ w e e e
   he = sym (pr₂ (ap₃-onto (wnu₂ a a)))

   use-wnu₂' : ap₃ w q refl q  ap₃ w (=-congr e e q) (=-congr e e q) refl
   use-wnu₂' =
    ap₃ w q refl q                                             =⟨ wnu₂^ q refl 
    =-congr (wnu₂ a a) (wnu₂ a a) (ap₃ w q q refl)             =⟨ II 
    =-congr (ap₃ w e e e) (ap₃ w e e e) (ap₃ w q q refl)       =⟨ III 
    ap₃ w (=-congr e e q) (=-congr e e q) (=-congr e e refl) =⟨ IV 
    ap₃ w (=-congr e e q) (=-congr e e q) refl                
     where
      II = ap  -  =-congr - - (ap₃ w q q refl)) he
      III = =-congr-ap₃ w e e q e e q e e refl
      IV = ap₂  x y  ap₃ w x x y) refl (=-congr-refl e)

   hq : ap₃ w q q q  ap₃ w (=-congr e e q) (q  =-congr e e q) refl
   hq =
    ap₃ w q q q                                                      =⟨ I 
    ap₃ w refl q refl  ap₃ w q refl q                               =⟨ II 
    ap₃ w refl q refl  ap₃ w (=-congr e e q) (=-congr e e q) refl =⟨ III 
    ap₃ w (=-congr e e q) (q  (=-congr e e q)) refl               
     where
      I = ap₃-∙' w refl q q refl refl q (sym refl-left-neutral)
                 refl (sym refl-left-neutral)
      II = ap  -  ap₃ w refl q refl  -) use-wnu₂'
      III = sym (ap₃-∙' w refl (=-congr e e q) q (=-congr e e q) refl refl
                        (sym refl-left-neutral) refl refl)

 commutes₃ : {a : A}
            (p q : a  a)
            w' refl refl p  w' q q q  w' q q q  w' refl refl p
 commutes₃ p q =
  w' refl refl p  w' q q q        =⟨ ap  -  w' refl refl p  -) hq 
  w' refl refl p  w' q' q'' refl  =⟨ base-3 q' q'' p 
  w' q' q'' refl  w' refl refl p  =⟨ ap  -  -  w' refl refl p) (sym hq) 
  w' q q q        w' refl refl p  
   where
    q'  = pr₁ (reduce₃ q)
    q'' = pr₁ (pr₂ (reduce₃ q))
    hq  = pr₂ (pr₂ (reduce₃ q))

 ap₃-homo-w' : {a : A} {p q r : a  a} {p' q' r' p'' q'' r'' : a  a}
               (p^ : p  p'  p'') (q^ : q  q'  q'') (r^ : r  r'  r'')
              w' p q r  w' p' q' r'  w' p'' q'' r''
 ap₃-homo-w' {a} {p} {q} {r} {p'} {q'} {r'} {p''} {q''} {r''} p^ q^ r^ =
  w' p q r                            =⟨ ap₃ w' p^ q^ r^ 
  w' (p'  p'') (q'  q'') (r'  r'') =⟨ ap₃-∙ w p' p'' q' q'' r' r'' 
  w' p' q' r'  w' p'' q'' r''        

 image-of-w'-commutes : {a : A}
            (p q : a  a)
            w' p p p  w' q q q  w' q q q  w' p p p
 image-of-w'-commutes {a} p q =
  w' p p p  w' q q q                                               =⟨ I 
  w' refl p p  w' p refl refl  w' q q q                           =⟨ IIa 
  w' refl p p  (w' p refl refl  w' q q q)                         =⟨ IIb 
  w' refl p p  (w' q q q  w' p refl refl)                         =⟨ IIc 
  w' refl p p  w' q q q  w' p refl refl                           =⟨ III 
  w' refl refl p  w' refl p refl  w' q q q  w' p refl refl       =⟨ IVa 
  w' refl refl p  (w' refl p refl  w' q q q)  w' p refl refl     =⟨ IVb 
  w' refl refl p  (w' q q q  w' refl p refl)  w' p refl refl     =⟨ IVc 
  w' refl refl p  w' q q q  w' refl p refl  w' p refl refl       =⟨ Va 
  w' refl refl p  w' q q q  (w' refl p refl  w' p refl refl)     =⟨ Vb 
  w' refl refl p  w' q q q  w' p p refl                           =⟨ VI 
  w' q q q  w' refl refl p  w' p p refl                           =⟨ VII 
  w' q q q  (w' refl refl p  w' p p refl)                         =⟨ sym VIII 
  w' q q q  w' p p p                                               
   where
    refl∙p : p  refl  p
    refl∙p = sym refl-left-neutral

    I = ap (_∙ w' q q q) (ap₃-homo-w' {p'' = p} refl∙p refl refl)
    IIa = ∙assoc (w' refl p p) (w' p refl refl) (w' q q q)
    IIb = ap (w' refl p p ∙_) (commutes₁ p q)
    IIc = sym (∙assoc (w' refl p p) (w' q q q) (w' p refl refl))
    III = ap (_∙ w' p refl refl)
             (ap (_∙ w' q q q) (ap₃-homo-w' {q'' = p} refl refl∙p refl))
    IVa = ap (_∙ w' p refl refl)
             (∙assoc (w' refl refl p) (w' refl p refl) (w' q q q))
    IVb = ap  -  w' refl refl p  -  w' p refl refl) (commutes₂ p q)
    IVc = ap (_∙ w' p refl refl)
             (sym (∙assoc (w' refl refl p) (w' q q q) (w' refl p refl)))
    Va = ∙assoc (w' refl refl p  w' q q q)
                (w' refl p refl)
                (w' p refl refl)
    Vb = ap (w' refl refl p  w' q q q ∙_)
            (sym (ap₃-homo-w' {p'' = p} refl∙p refl refl))
    VI = ap (_∙ w' p p refl) (commutes₃ p q)
    VII = ∙assoc (w' q q q) (w' refl refl p) (w' p p refl)
    VIII = ap (w' q q q ∙_)
              (ap₃-homo-w' {p'' = p} {q'' = p} refl∙p refl∙p refl)

 Ωw-idem : {a b : A}  (p : a  b)  =-congr (idem a) (idem b) (ap₃ w p p p)  p
 Ωw-idem refl = =-congr-refl (idem _)

 taylors-lemma : {a : A}  (p q : a  a)  p  q  q  p
 taylors-lemma {a} p q =
  p  q                                            =⟨ sym (dissolve p q) 
  =-congr (idem a) (idem a) (w' p p p  w' q q q) =⟨ see-above 
  =-congr (idem a) (idem a) (w' q q q  w' p p p) =⟨ dissolve q p 
  q  p                                            
   where
    dissolve : (p' q' : a  a)
              =-congr (idem a) (idem a) (w' p' p' p'  w' q' q' q')  p'  q'
    dissolve p' q' =
       =-congr-∙ (idem a) (idem a) (idem a) (ap₃ w p' p' p') (ap₃ w q' q' q')
      ap₂ _∙_ (Ωw-idem p') (Ωw-idem q')

    see-above = ap (=-congr (idem a) (idem a)) (image-of-w'-commutes p q)

\end{code}