\begin{code}
module Atom where

open import Data.Nat
open import Data.Product renaming (_×_ to _∧_)
open import Data.Sum renaming (_⊎_ to _∨_)
open import Data.Sum
open import Data.Empty
open import Relation.Nullary
open import Relation.Binary.PropositionalEquality as PropEq
open PropEq.≡-Reasoning renaming (begin_ to begin≡_;_∎ to _□)

Atom = 
--
_≟ₐ_ = _≟_
--
\end{code}

%<*swap>
\begin{code}
(_∙_)ₐ_ : Atom  Atom  Atom  Atom
 a  b )ₐ c  with c ≟ₐ a
... | yes  _             = b
... | no   _   with c ≟ₐ b
...            |  yes _  = a
...            |  no  _  = c
\end{code}
%</swap>

\begin{code}
sym≢ : {a b : Atom}  a  b  b  a
sym≢ a≢b b≡a = ⊥-elim (a≢b (sym b≡a))
--
lemma∙ₐ :   a b c 
           (c  a             a  b )ₐ c  b)   
           (c  b   c  a    a  b )ₐ c  a)   
           (c  a   c  b    a  b )ₐ c  c)
lemma∙ₐ a b c with c ≟ₐ a 
... | yes  c≡a = inj₁ (c≡a , refl)
... | no   c≢a with c ≟ₐ b
...            | yes  c≡b = inj₂ (inj₁ (c≡b , c≢a , refl)) 
...            | no   c≢b = inj₂ (inj₂ (c≢a , c≢b , refl))  
--
lemma∙ₐc≡a :   a b c  c  a   a  b )ₐ c  b
lemma∙ₐc≡a a b c c≡a with  a  b )ₐ c | lemma∙ₐ a b c
lemma∙ₐc≡a a  b  .a  c≡a | .b | inj₁ (refl , refl)               = refl 
lemma∙ₐc≡a a  b  .b  c≡a | .a | inj₂ (inj₁ (refl , c≢a , refl))  = ⊥-elim (c≢a c≡a)
lemma∙ₐc≡a a  b  c   c≡a | .c | inj₂ (inj₂ (c≢a  , c≢b , refl))  = ⊥-elim (c≢a c≡a)
--
lemma∙ₐc≡b :   a b c  c  b   a  b )ₐ c  a
lemma∙ₐc≡b a b c c≡b with  a  b )ₐ c | lemma∙ₐ a b c
lemma∙ₐc≡b a  b  .a  c≡b | .b | inj₁ (refl , refl)                = sym c≡b
lemma∙ₐc≡b a  b  .b  c≡b | .a | inj₂ (inj₁ (refl  , _ , refl))    = refl
lemma∙ₐc≡b a  b  c   c≡b | .c | inj₂ (inj₂ (_     , c≢b , refl))  = ⊥-elim (c≢b c≡b)
--
lemma∙ₐc≢a∧c≢b :   {a b c}  c  a  c  b   a  b )ₐ c  c
lemma∙ₐc≢a∧c≢b {a} {b} {c}   c≢a c≢b with  a  b )ₐ c | lemma∙ₐ a b c
lemma∙ₐc≢a∧c≢b {a} {b} {.a}  c≢a c≢b | .b | inj₁ (refl , refl)              = ⊥-elim (c≢a refl) 
lemma∙ₐc≢a∧c≢b {a} {b} {.b}  c≢a c≢b | .a | inj₂ (inj₁ (refl  , _ , refl))  = ⊥-elim (c≢b refl) 
lemma∙ₐc≢a∧c≢b {a} {b} {c}   c≢a c≢b | .c | inj₂ (inj₂ (_     , _ , refl))  = refl
--
lemma∙ₐa≢b∧a≢c∧a≢d→a≢(bc)d :   {a b c d}  a  b  a  c  a  d  a   b  c )ₐ d
lemma∙ₐa≢b∧a≢c∧a≢d→a≢(bc)d {a} {b} {c} {d} a≢b a≢c a≢d with  b  c )ₐ d | lemma∙ₐ b c d
lemma∙ₐa≢b∧a≢c∧a≢d→a≢(bc)d {a} {b} {c} .{b} a≢b a≢c a≢d | .c | inj₁ (refl , refl)              = a≢c
lemma∙ₐa≢b∧a≢c∧a≢d→a≢(bc)d {a} {b} {c} .{c} a≢b a≢c a≢d | .b | inj₂ (inj₁ (refl  , _ , refl))  = a≢b
lemma∙ₐa≢b∧a≢c∧a≢d→a≢(bc)d {a} {b} {c} {d} a≢b a≢c a≢d  | .d | inj₂ (inj₂ (_     , _ , refl))  = a≢d
--
lemma(aa)b≡b :  {a} {b}   a  a )ₐ b  b
lemma(aa)b≡b {a}   {b} with  a  a )ₐ b | lemma∙ₐ a a b
lemma(aa)b≡b {.b}  {b} | .b | inj₁ (refl , refl)          = refl
lemma(aa)b≡b {.b}  {b} | .b | inj₂ (inj₁ (refl  , _ , refl))   = refl
lemma(aa)b≡b {a}   {b} | .b | inj₂ (inj₂ (_     , _ , refl))  = refl
--
lemma(ab)(ab)c≡c :  {a} {b} {c}   a  b )ₐ  a  b )ₐ c  c
lemma(ab)(ab)c≡c {a} {b} {c} with  a  b )ₐ c | lemma∙ₐ a b c
lemma(ab)(ab)c≡c {a} {b} {.a}  | .b | inj₁ (refl , refl)              = lemma∙ₐc≡b a b b refl
lemma(ab)(ab)c≡c {a} {b} {.b}  | .a | inj₂ (inj₁ (refl , _ , refl))   = lemma∙ₐc≡a a b a refl  
lemma(ab)(ab)c≡c {a} {b} {c}   | .c | inj₂ (inj₂ (c≢a , c≢b , refl))  = lemma∙ₐc≢a∧c≢b c≢a c≢b 
--
lemma∙ₐinj : {a b c d : Atom}  c  d   a  b )ₐ c   a  b )ₐ d
lemma∙ₐinj {a} {b} {c} {d} c≢d (ab)c≡(ab)d 
           = ⊥-elim (c≢d (  begin≡ 
                              c 
                            ≡⟨ sym lemma(ab)(ab)c≡c 
                               a  b )ₐ  a  b )ₐ c
                            ≡⟨  cong ((_∙_)ₐ_ a b) (ab)c≡(ab)d  
                               a  b )ₐ  a  b )ₐ d
                            ≡⟨ lemma(ab)(ab)c≡c 
                             d
                            ))
--
lemma∙ₐcomm :  {a} {b} {c}   a  b )ₐ c   b  a )ₐ c
lemma∙ₐcomm {a} {b} {c}   with  a  b )ₐ c | lemma∙ₐ a b c
lemma∙ₐcomm {a} {b} {.a}  | .b | inj₁ (refl , refl)               = sym (lemma∙ₐc≡b b a a refl)              
lemma∙ₐcomm {a} {b} {.b}  | .a | inj₂ (inj₁ (refl , c≢a , refl))  = sym (lemma∙ₐc≡a b a b refl)              
lemma∙ₐcomm {a} {b} {c}   | .c | inj₂ (inj₂ (c≢a  , c≢b , refl))  = sym (lemma∙ₐc≢a∧c≢b c≢b c≢a) 
--
lemma∙ₐ(aa)a≡a :  {a}   a  a )ₐ a  a 
lemma∙ₐ(aa)a≡a {a} = lemma∙ₐc≡a a a a refl
--
lemma∙ₐ(ab)a≡b :  {a} {b}   a  b )ₐ a  b 
lemma∙ₐ(ab)a≡b {a} {b} = lemma∙ₐc≡a a b a refl
--
lemma∙ₐ(ab)b≡a :  {a} {b}   a  b )ₐ b  a
lemma∙ₐ(ab)b≡a {a} {b} = lemma∙ₐc≡b a b b refl
--
lemma∙ₐdistributive :  a b c d e 
   a  b )ₐ  c  d )ₐ e    a  b )ₐ c   a  b )ₐ d )ₐ  a  b )ₐ e
lemma∙ₐdistributive a b c d e with  c  d )ₐ e | lemma∙ₐ c d e
lemma∙ₐdistributive a  b  c  d  .c | .d | inj₁ (refl , refl)               
  with  a  b )ₐ d | lemma∙ₐ a b d
lemma∙ₐdistributive a  b  c  .a .c | .a | inj₁ (refl , refl) | .b  | inj₁ (refl , refl)              
  with  a  b )ₐ c | lemma∙ₐ a b c 
lemma∙ₐdistributive a  b  .a  .a .a | .a | inj₁ (refl , refl) | .b  | inj₁ (refl , refl) | .b  | inj₁ (refl , refl)                           
  = sym lemma∙ₐ(aa)a≡a
lemma∙ₐdistributive a  b  .b .a .b  | .a | inj₁ (refl , refl) | .b  | inj₁ (refl , refl) | .a  | inj₂ (inj₁ (refl , c≢a , refl))
  = sym (lemma∙ₐ(ab)a≡b {a} {b})
lemma∙ₐdistributive a  b  c  .a .c  | .a | inj₁ (refl , refl) | .b  | inj₁ (refl , refl) | .c  | inj₂ (inj₂ (c≢a , c≢b , refl))                         = sym (lemma∙ₐ(ab)a≡b {c} {b})
lemma∙ₐdistributive a  b  c  .b .c  | .b | inj₁ (refl , refl) | .a  | inj₂ (inj₁ (refl , d≢a , refl))               
  with  a  b )ₐ c | lemma∙ₐ a b c 
lemma∙ₐdistributive a  b  .a  .b .a | .b | inj₁ (refl , refl) | .a  | inj₂ (inj₁ (refl , d≢a , refl))  | .b | inj₁ (refl , refl)              
  = sym (lemma∙ₐ(ab)a≡b {b} {a})
lemma∙ₐdistributive a  b  .b  .b .b | .b | inj₁ (refl , refl) | .a  | inj₂ (inj₁ (refl , d≢a , refl))  | .a | inj₂ (inj₁ (refl , c≢a , refl))
  = sym (lemma∙ₐ(aa)a≡a {a})
lemma∙ₐdistributive a  b  c  .b .c  | .b | inj₁ (refl , refl) | .a  | inj₂ (inj₁ (refl , d≢a , refl))  | .c | inj₂ (inj₂ (c≢a , c≢b , refl))
  = sym (lemma∙ₐ(ab)a≡b {c} {a})
lemma∙ₐdistributive a  b  c  d  .c  | .d | inj₁ (refl , refl) | .d  | inj₂ (inj₂ (d≢a  , d≢b , refl))               
  with  a  b )ₐ c | lemma∙ₐ a b c 
lemma∙ₐdistributive a  b  .a  d  .a | .d | inj₁ (refl , refl) | .d  | inj₂ (inj₂ (d≢a  , d≢b , refl))  | .b | inj₁ (refl , refl)              
  = sym (lemma∙ₐ(ab)a≡b {b} {d})
lemma∙ₐdistributive a  b  .b  d  .b  | .d | inj₁ (refl , refl) | .d  | inj₂ (inj₂ (d≢a  , d≢b , refl)) | .a | inj₂ (inj₁ (refl , c≢a , refl))   
  = sym (lemma∙ₐ(ab)a≡b {a} {d})
lemma∙ₐdistributive a  b  c  d  .c  | .d | inj₁ (refl , refl) | .d  | inj₂ (inj₂ (d≢a  , d≢b , refl))  | .c | inj₂ (inj₂ (c≢a , c≢b , refl))
  = sym (lemma∙ₐ(ab)a≡b {c} {d})
lemma∙ₐdistributive a  b  c  d  .d | .c | inj₂ (inj₁ (refl , d≢c , refl)) 
  with  a  b )ₐ c | lemma∙ₐ a b c 
lemma∙ₐdistributive a  b  .a  d  .d | .a | inj₂ (inj₁ (refl , d≢a , refl)) | .b | inj₁ (refl , refl)              
  with  a  b )ₐ d | lemma∙ₐ a b d 
lemma∙ₐdistributive a  b  .a  d  .d | .a | inj₂ (inj₁ (refl , d≢a , refl)) | .b | inj₁ (refl , refl) | _  | inj₁ (d≡a , _)               
  = ⊥-elim (d≢a d≡a)
lemma∙ₐdistributive a  b  .a  .b  .a | .a | inj₂ (inj₁ (refl , b≢a , refl)) | .b | inj₁ (refl , refl) | .a | inj₂ (inj₁ (refl , _ , refl))
  = sym (lemma∙ₐ(ab)b≡a {b} {a})
lemma∙ₐdistributive a  b  .a  d  .d | .a | inj₂ (inj₁ (refl , d≢a , refl)) | .b | inj₁ (refl , refl) | .d | inj₂ (inj₂ (_ , d≢b , refl))
  = sym (lemma∙ₐ(ab)b≡a {b} {d})
lemma∙ₐdistributive a  b  .b  d  .d | .b | inj₂ (inj₁ (refl , d≢b , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl))   
  with  a  b )ₐ d | lemma∙ₐ a b d 
lemma∙ₐdistributive a  b  .b  .a  .a | .b | inj₂ (inj₁ (refl , a≢b , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl)) | .b  | inj₁ (refl , refl)
  = sym (lemma∙ₐ(ab)b≡a {a} {b})
lemma∙ₐdistributive a  b  .b  d  .d | .b | inj₂ (inj₁ (refl , d≢b , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl)) | _   | inj₂ (inj₁ (d≡b , _ , _))  
  = ⊥-elim (d≢b d≡b)
lemma∙ₐdistributive a  b  .b  d  .d | .b | inj₂ (inj₁ (refl , d≢b , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl)) | .d | inj₂ (inj₂ (_ , d≢a , refl))  
  = sym (lemma∙ₐ(ab)b≡a {a} {d})
lemma∙ₐdistributive a  b  c  d  .d | .c | inj₂ (inj₁ (refl  , d≢c , refl)) | .c | inj₂ (inj₂ (c≢a , c≢b , refl))
  with  a  b )ₐ d | lemma∙ₐ a b d 
lemma∙ₐdistributive a  b  c  .a  .a | .c | inj₂ (inj₁ (refl  , a≢c , refl)) | .c | inj₂ (inj₂ (c≢a , c≢b , refl)) | .b  | inj₁ (refl , refl)
  = sym (lemma∙ₐ(ab)b≡a {c} {b})
lemma∙ₐdistributive a  b  c  .b  .b | .c | inj₂ (inj₁ (refl  , b≢c , refl)) | .c | inj₂ (inj₂ (c≢a , c≢b , refl)) | .a   | inj₂ (inj₁ (refl , d≢a , refl))  
  = sym (lemma∙ₐ(ab)b≡a {c} {a})
lemma∙ₐdistributive a  b  c  d  .d | .c | inj₂ (inj₁ (refl  , d≢c , refl)) | .c | inj₂ (inj₂ (c≢a , c≢b , refl)) | .d | inj₂ (inj₂ (d≢b , d≢a , refl))  
  = sym (lemma∙ₐ(ab)b≡a {c} {d})
lemma∙ₐdistributive a  b  c  d  e  | .e | inj₂ (inj₂ (e≢c   , e≢d , refl))
  with  a  b )ₐ e | lemma∙ₐ a b e
lemma∙ₐdistributive a  b  c  d  .a  | .a | inj₂ (inj₂ (a≢c   , a≢d , refl)) | .b | inj₁ (refl , refl)
  with  a  b )ₐ c | lemma∙ₐ a b c
lemma∙ₐdistributive a  b  c  d  .a  | .a | inj₂ (inj₂ (a≢c   , a≢d , refl)) | .b | inj₁ (refl , refl) | _ | inj₁ (c≡a , _)
  = ⊥-elim (a≢c (sym c≡a))
lemma∙ₐdistributive a  b  .b  d  .a  | .a | inj₂ (inj₂ (a≢b   , a≢d , refl)) | .b | inj₁ (refl , refl) | .a | inj₂ (inj₁ (refl , c≢a , refl))
  with  a  b )ₐ d | lemma∙ₐ a b d
lemma∙ₐdistributive a  b  .b  d  .a  | .a | inj₂ (inj₂ (a≢b   , a≢d , refl)) | .b | inj₁ (refl , refl) | .a | inj₂ (inj₁ (refl , c≢a , refl))
  | _ | inj₁ (d≡a , _)
  = ⊥-elim (a≢d (sym d≡a))
lemma∙ₐdistributive a  b  .b  .b  .a  | .a | inj₂ (inj₂ (a≢b   , _ , refl)) | .b | inj₁ (refl , refl) | .a | inj₂ (inj₁ (refl , c≢a , refl))
  | .a | inj₂ (inj₁ (refl , d≢a , refl))
  = sym (lemma(aa)b≡b)
lemma∙ₐdistributive a  b  .b  d  .a  | .a | inj₂ (inj₂ (a≢b   , a≢d , refl)) | .b | inj₁ (refl , refl) | .a | inj₂ (inj₁ (refl , c≢a , refl))
  | .d | inj₂ (inj₂ (d≢a , d≢b , refl))
  = sym (lemma∙ₐc≢a∧c≢b (sym≢ a≢b) (sym≢ d≢b))
lemma∙ₐdistributive a  b  c  d  .a  | .a | inj₂ (inj₂ (a≢c   , a≢d , refl)) | .b | inj₁ (refl , refl) | .c | inj₂ (inj₂ (c≢b , c≢a , refl))
  with  a  b )ₐ d | lemma∙ₐ a b d
lemma∙ₐdistributive a  b  c  d  .a  | .a | inj₂ (inj₂ (a≢c   , a≢d , refl)) | .b | inj₁ (refl , refl) | .c | inj₂ (inj₂ (c≢b , c≢a , refl))
  | _ | inj₁ (d≡a , _)
  = ⊥-elim (a≢d (sym d≡a))
lemma∙ₐdistributive a  b  c  .b  .a  | .a | inj₂ (inj₂ (a≢c   , a≢b , refl)) | .b | inj₁ (refl , refl) | .c | inj₂ (inj₂ (c≢a , c≢b , refl))
  | .a | inj₂ (inj₁ (refl , _ , refl))
  = sym (lemma∙ₐc≢a∧c≢b (sym≢ c≢b) (sym≢ a≢b))
lemma∙ₐdistributive a  b  c  d  .a  | .a | inj₂ (inj₂ (a≢c   , a≢d , refl)) | .b | inj₁ (refl , refl) | .c | inj₂ (inj₂ (c≢a , c≢b , refl))
  | .d | inj₂ (inj₂ (d≢a , d≢b , refl))
  = sym (lemma∙ₐc≢a∧c≢b (sym≢ c≢b) (sym≢ d≢b))
lemma∙ₐdistributive a  b  c  d  .b  | .b | inj₂ (inj₂ (b≢c   , b≢d , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl))
  with  a  b )ₐ c | lemma∙ₐ a b c
lemma∙ₐdistributive a  b  .a  d  .b  | .b | inj₂ (inj₂ (_  , b≢d , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl))  | .b | inj₁ (refl , refl)
  with  a  b )ₐ d | lemma∙ₐ a b d
lemma∙ₐdistributive a  b  .a  .a  .b  | .b | inj₂ (inj₂ (_  , _ , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl))  | .b | inj₁ (refl , refl)
  | .b | inj₁ (refl , refl)
  = sym (lemma(aa)b≡b) 
lemma∙ₐdistributive a  b  .a  d  .b  | .b | inj₂ (inj₂ (_  , b≢d , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl))  | .b | inj₁ (refl , refl)
  | _ | inj₂ (inj₁ (d≡b , _ , _))
  = ⊥-elim (b≢d (sym d≡b))
lemma∙ₐdistributive a  b  .a  d  .b  | .b | inj₂ (inj₂ (_  , b≢d , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl))  | .d | inj₁ (refl , refl)
  | .d | inj₂ (inj₂ (d≢a , d≢b , refl))
  = sym (lemma∙ₐc≢a∧c≢b (sym≢ b≢a) (sym≢ d≢a)) 
lemma∙ₐdistributive a  b  c  d  .b  | .b | inj₂ (inj₂ (b≢c   , b≢d , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl)) | _  | inj₂ (inj₁ (c≡b , _ , _))
  = ⊥-elim (b≢c (sym c≡b))
lemma∙ₐdistributive a  b  c  d  .b  | .b | inj₂ (inj₂ (b≢c   , b≢d , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl)) | .c  |  inj₂ (inj₂ (c≢b , c≢a , refl))
  with  a  b )ₐ d | lemma∙ₐ a b d
lemma∙ₐdistributive a  b  c  .a  .b  | .b | inj₂ (inj₂ (b≢c   , _ , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl)) | .c  |  inj₂ (inj₂ (c≢a , c≢b , refl)) | .b | inj₁ (refl , refl)
  = sym (lemma∙ₐc≢a∧c≢b (sym≢ c≢a) (sym≢ b≢a))   
lemma∙ₐdistributive a  b  c  d  .b  | .b | inj₂ (inj₂ (b≢c   , b≢d , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl)) | .c  |  inj₂ (inj₂ (c≢b , c≢a , refl)) | _ | inj₂ (inj₁ (d≡b , _)) 
  = ⊥-elim (b≢d (sym d≡b))
lemma∙ₐdistributive a  b  c  d  .b  | .b | inj₂ (inj₂ (b≢c   , b≢d , refl)) | .a | inj₂ (inj₁ (refl , b≢a , refl)) | .c  |  inj₂ (inj₂ (c≢a , c≢b , refl)) | .d | inj₂ (inj₂ (d≢a , d≢b , refl)) 
  = sym (lemma∙ₐc≢a∧c≢b (sym≢ c≢a) (sym≢ d≢a))    
lemma∙ₐdistributive a  b  c  d  e  | .e | inj₂ (inj₂ (e≢c   , e≢d , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  with  a  b )ₐ c | lemma∙ₐ a b c
lemma∙ₐdistributive a  b  .a  d  e  | .e | inj₂ (inj₂ (_   , e≢d , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .b | inj₁ (refl , refl) 
  with  a  b )ₐ d | lemma∙ₐ a b d
lemma∙ₐdistributive a  b  .a  .a  e  | .e | inj₂ (inj₂ (_   , _ , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl)) 
  | .b | inj₁ (refl , refl) | .b | inj₁ (refl , refl) 
  = sym (lemma(aa)b≡b) 
lemma∙ₐdistributive a  b  .a  .b  e  | .e | inj₂ (inj₂ (_   , _ , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .b | inj₁ (refl , refl) | .a | inj₂ (inj₁ (refl , b≢a , refl)) 
  = sym (lemma∙ₐc≢a∧c≢b e≢b e≢a)
lemma∙ₐdistributive a  b  .a  d  e  | .e | inj₂ (inj₂ (_   , e≢d , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .b | inj₁ (refl , refl) | .d | inj₂ (inj₂ (d≢a , d≢b , refl))
  = sym (lemma∙ₐc≢a∧c≢b e≢b e≢d)
lemma∙ₐdistributive a  b  .b  d  e  | .e | inj₂ (inj₂ (_   , e≢d , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .a | inj₂ (inj₁ (refl , c≢a , refl)) 
  with  a  b )ₐ d | lemma∙ₐ a b d
lemma∙ₐdistributive a  b  .b  .a  e  | .e | inj₂ (inj₂ (_   , _ , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .a | inj₂ (inj₁ (refl , c≢a , refl)) | . b | inj₁ (refl , refl)
  = sym (lemma∙ₐc≢a∧c≢b e≢a e≢b )
lemma∙ₐdistributive a  b  .b  .b  e  | .e | inj₂ (inj₂ (_   , _ , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .a | inj₂ (inj₁ (refl , c≢a , refl)) | .a  | inj₂ (inj₁ (refl , b≢a , refl))
  = sym lemma(aa)b≡b 
lemma∙ₐdistributive a  b  .b  d  e  | .e | inj₂ (inj₂ (_   , e≢d , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .a | inj₂ (inj₁ (refl , c≢a , refl)) | .d  | inj₂ (inj₂ (d≢a , d≢b , refl))
  = sym (lemma∙ₐc≢a∧c≢b e≢a e≢d )
lemma∙ₐdistributive a  b  c  d  e  | .e | inj₂ (inj₂ (e≢c   , e≢d , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .c | inj₂ (inj₂ (c≢a , c≢b , refl))  
  with  a  b )ₐ d | lemma∙ₐ a b d
lemma∙ₐdistributive a  b  c  .a  e  | .e | inj₂ (inj₂ (e≢c   , _ , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .c | inj₂ (inj₂ (c≢a , c≢b , refl)) | .b | inj₁ (refl , refl)
  = sym (lemma∙ₐc≢a∧c≢b e≢c e≢b)
lemma∙ₐdistributive a  b  c  .b  e  | .e | inj₂ (inj₂ (e≢c   , _ , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .c | inj₂ (inj₂ (c≢a , c≢b , refl)) | .a | inj₂ (inj₁ (refl , d≢a , refl))
  = sym (lemma∙ₐc≢a∧c≢b e≢c e≢a)
lemma∙ₐdistributive a  b  c  d  e  | .e | inj₂ (inj₂ (e≢c   , e≢d , refl))  | .e | inj₂ (inj₂ (e≢a , e≢b , refl))
  | .c | inj₂ (inj₂ (c≢a , c≢b , refl)) | .d | inj₂ (inj₂ (d≢a , d≢b , refl))
  = sym (lemma∙ₐc≢a∧c≢b e≢c e≢d)
--
lemma∙ₐcancel : {a b c d : Atom}  d  b  d  c   c  b )ₐ  a  c )ₐ d   a  b )ₐ d
lemma∙ₐcancel {a} {b} {c} {d} d≢b d≢c 
  with d ≟ₐ a
... | no _ with d ≟ₐ c
...        | yes d≡c                 = ⊥-elim (d≢c d≡c)
...        | no _  with d ≟ₐ c
...                | yes d≡c         = ⊥-elim (d≢c d≡c)
...                | no _ with d ≟ₐ b
...                       | yes d≡b  = ⊥-elim (d≢b d≡b)
...                       | no _     = refl
lemma∙ₐcancel {a} {b} {c} {.a} a≢b a≢c 
    | yes refl with c ≟ₐ c
...            | yes _               = refl
...            | no c≢c              = ⊥-elim (c≢c refl)
\end{code}