{-# language DataKinds #-} {-# language ExplicitForAll #-} {-# language KindSignatures #-} {-# language TypeOperators #-} module Arithmetic.Equal ( symmetric , plusR , plusL ) where import Arithmetic.Unsafe (type (:=:)(Eq)) import GHC.TypeNats (type (+)) symmetric :: (m :=: n) -> (n :=: m) symmetric :: (m :=: n) -> n :=: m symmetric m :=: n Eq = n :=: m forall (a :: Nat) (b :: Nat). a :=: b Eq plusL :: forall c m n. (m :=: n) -> (c + m :=: c + n) plusL :: (m :=: n) -> (c + m) :=: (c + n) plusL m :=: n Eq = (c + m) :=: (c + n) forall (a :: Nat) (b :: Nat). a :=: b Eq plusR :: forall c m n. (m :=: n) -> (m + c :=: n + c) plusR :: (m :=: n) -> (m + c) :=: (n + c) plusR m :=: n Eq = (m + c) :=: (n + c) forall (a :: Nat) (b :: Nat). a :=: b Eq