module Unary where

open import Data.Nat hiding (_⊔_)
open import Relation.Binary.PropositionalEquality
open import Relation.Binary.Core
open import Function
open import Agda.Primitive

data Even :   Set where
  zpair : Even zero
  spair :  {a}  Even a  Even (suc (suc a))

record  {a b} {A : Set a} (P : A  Set b) : Set (a  b) where
  constructor _,_ ; field
    witness : A
    proof   : P witness

Evenℕ : Set
Evenℕ =  Even

[_/2] : Evenℕ  
[ .zero , zpair /2] = zero
[ .(suc (suc _)) , spair proof /2] = suc [ _ , proof /2]

_≈_ :  {a b} {A : Set a} {P : A  Set b}  Rel ( P) _
_≈_ =  _≡_ on ∃.witness

uniqueEven :  {n} (p₁ p₂ : Even n)  p₁  p₂
uniqueEven zpair      zpair      = refl
uniqueEven (spair p₁) (spair p₂) = cong spair (uniqueEven p₁ p₂)

equality :  {e₁ e₂ :  Even}  e₁  e₂  e₁  e₂
equality {_ , p} {._ , p₁} refl rewrite uniqueEven p p₁ = refl