-- Copyright (c) 2014 Microsoft Corporation. All rights reserved.
-- Released under Apache 2.0 license as described in the file LICENSE.
-- Author: Leonardo de Moura
import logic.core.eq
open eq_ops

namespace binary
  context
    parameter {A : Type}
    parameter f : A → A → A
    infixl `*`:75 := f
    definition commutative := ∀{a b}, a*b = b*a
    definition associative := ∀{a b c}, (a*b)*c = a*(b*c)
  end

  context
    parameter {A : Type}
    parameter {f : A → A → A}
    hypothesis H_comm : commutative f
    hypothesis H_assoc : associative f
    infixl `*`:75 := f
    theorem left_comm : ∀a b c, a*(b*c) = b*(a*c) :=
    take a b c, calc
      a*(b*c) = (a*b)*c  : H_assoc⁻¹
        ...   = (b*a)*c  : {H_comm}
        ...   = b*(a*c)  : H_assoc

    theorem right_comm : ∀a b c, (a*b)*c = (a*c)*b :=
    take a b c, calc
      (a*b)*c = a*(b*c) : H_assoc
        ...   = a*(c*b) : {H_comm}
        ...   = (a*c)*b : H_assoc⁻¹
  end
end binary
