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