packages feed

Agda-2.3.2.2: test/succeed/Issue558b.agda

module Issue558b where

data Nat : Set where
  Z : Nat
  S : Nat → Nat

data _≡_ {A : Set} (a : A) : A → Set where
  Refl : a ≡ a

plus : Nat → Nat → Nat
plus Z n = n
plus (S n) m = S (plus n m)

data Addable (τ : Set) : Set where
  addable : (τ → τ → τ) → Addable τ

plus' : {τ : Set} → Addable τ → τ → τ → τ
plus' (addable p) = p

record ⊤ : Set where

module AddableM {τ : Set} {a : ⊤} (a : Addable τ) where
  _+_ : τ → τ → τ
  _+_ = plus' a

-- record Addable (τ : Set) : Set where
--  constructor addable
--  field
--   _+_ : τ → τ → τ

open module AddableIFS {t : Set} {a : ⊤} {{r : Addable t}} = AddableM {t} r

data CommAddable (τ : Set) {a : ⊤} : Set where
 commAddable : (addable : Addable τ) → ((a b : τ) → (a + b) ≡ (b + a)) → CommAddable τ

private
  addableCA' : {τ : Set} (ca : CommAddable τ) → Addable τ
  addableCA' (commAddable a _) = a

  comm' : {τ : Set} (ca : CommAddable τ) →
          let a = addableCA' ca in (a b : τ) → (a + b) ≡ (b + a)
  comm' (commAddable _ c) = c

module CommAddableM {τ : Set} {a : ⊤} (ca : CommAddable τ) where
  addableCA : Addable τ
  addableCA = addableCA' ca

  comm : (a b : τ) → (a + b) ≡ (b + a)
  comm = comm' ca

natAdd : Addable Nat
natAdd = addable plus

postulate commPlus : (a b : Nat) → plus a b ≡ plus b a

commNatAdd : CommAddable Nat
commNatAdd = commAddable natAdd commPlus

open CommAddableM {{...}}

test : (Z + Z) ≡ Z
test = comm Z Z

a : {x y : Nat} → (S (S Z) + (x + y)) ≡ ((x + y) + S (S Z))
a {x}{y} = comm (S (S Z)) (x + y)