module Prelude where
open import Agda.Primitive public
ℓ₀ : Level
ℓ₀ = lzero
ℓ₁ : Level
ℓ₁ = lsuc ℓ₀
ℓ₂ : Level
ℓ₂ = lsuc ℓ₁
record LiftSet {l l' : Level} (A : Set l) : Set (l ⊔ l') where
  constructor ↑set
  field ↓set : A
open LiftSet public
record LiftProp {l l' : Level} (P : Prop l) : Set (l ⊔ l') where
  constructor ↑prop
  field ↓prop : P
open LiftProp public
id :
 {l : Level}
 {A : Set l}
 → 
 A → A
id x = x
K :
 {l m : Level}
 {A : Set l}
 (B : Set m)
 → 
 A → B → A
K _ x _ = x
infixr 5 _∘_
_∘_ :
  {l m n : Level}
  {A : Set l}
  {B : A → Set m}
  {C : (x : A) → B x → Set n}
  (g : {x : A}(y : B x) → C x y)
  (f : (x : A) → B x)
  → 
  (x : A) → C x (f x)
(g ∘ f) x = g (f x)
data 𝟘 {l : Level} : Set l where
𝟘e :
  {l m : Level}
  {A : 𝟘 {l} → Set m}
  → 
  ∀ x → A x
𝟘e ()
data 𝔹 : Set where
  true false : 𝔹
{-# BUILTIN BOOL  𝔹  #-}
{-# BUILTIN TRUE  true  #-}
{-# BUILTIN FALSE false #-}
data ⊤ {l : Level} : Prop l where
  instance ⊤i : ⊤
data ⊥ {l : Level} : Prop l where
infix 3 ¬_
¬_ : {l : Level} → Prop l → Prop l
¬_ {l} P = P → ⊥ {l}
infix 4 _≣_
data _≣_
  {l : Level}
  {A : Set l}
  : 
  {B : Set l}(x : A)(y : B) → Prop l
  where
  instance refl : {x : A} → x ≣ x
{-# BUILTIN REWRITE _≣_ #-}
≣irrel :
 {l : Level}
 {P Q : Prop l}
 {p : P}
 {q : Q}
 → 
 P ≣ Q → ↑prop{l}{l} p ≣ ↑prop  q
≣irrel refl = refl
≣typ :
  {l : Level}
  {A B : Set l}
  {x : A}
  {y : B}
  → 
  x ≣ y → A ≣ B
≣typ refl = refl
coeₚ : {l : Level}{P Q : Prop l} → P ≣ Q → P → Q
coeₚ refl x = x
coeₚ⁻¹ : {l : Level}{P Q : Prop l} → P ≣ Q → Q → P
coeₚ⁻¹ refl x = x
ap :
  {l m : Level}
  {A : Set l}
  {B : A → Set m}
  (f : (x : A) → B x)
  {x y : A}
  (_ : x ≣ y)
  → 
  f x ≣ f y
ap _ refl = refl
ap₂ :
  {l m n : Level}
  {A : Set l}
  {B : A → Set m}
  {C : (x : A) → B x → Set n}
  (f : (x : A)(y : B x) → C x y)
  {x x' : A}
  (_ : x ≣ x')
  {y : B x}
  {y' : B x'}
  (_ : y ≣ y')
  → 
  f x y ≣ f x' y'
ap₂ _ refl refl = refl
trans :
  {l : Level}
  {A B C : Set l}
  {x : A}
  {y : B}
  {z : C}
  (q : y ≣ z)
  (p : x ≣ y)
  → 
  x ≣ z
trans refl p = p
infixl 5 _;_
_;_ :
  {l : Level}
  {A B C : Set l}
  {x : A}
  {y : B}
  {z : C}
  (p : x ≣ y)
  (q : y ≣ z)
  → 
  x ≣ z
p ; refl = p
symm :
  {l : Level}
  {A B : Set l}
  {x : A}
  {y : B}
  (p : x ≣ y)
  → 
  y ≣ x
symm refl = refl
substp :
  {l m : Level}
  {A  A' : Set l}
  {P : A → Prop m}
  {P' : A' → Prop m}
  (_ : P ≣ P')
  {x : A}
  {x' : A'}
  (_ : x ≣ x')
  → 
  P x → P' x'
substp e e' p with ≣typ e'
substp refl refl p | refl = p
substp₂ :
  {l m n : Level}
  {A A' : Set l}
  {B B' : Set m}
  {P : A → B → Prop n}
  {P' : A' → B' → Prop n}
  (_ : P ≣ P')
  {x : A}
  {x' : A'}
  {y : B}
  {y' : B'}
  (_ : x ≣ x')
  (_ : y ≣ y')
  → 
  P x y → P' x' y'
substp₂ e e' e'' p with ≣typ e' | ≣typ e''
substp₂ refl refl refl p | refl | refl = p
infix  1 proof_
proof_ :
  {l : Level}
  {A B : Set l}
  {x : A}
  {y : B}
  → 
  x ≣ y → x ≣ y
proof p = p
infixr 2 _=[_]_
_=[_]_ :
  {l : Level}
  {A B C : Set l}
  (x : A)
  {y : B}
  {z : C}
  → 
  x ≣ y → y ≣ z → x ≣ z
_ =[ p ] q = trans q p
infix  3 _qed
_qed :
  {l : Level}
  {A : Set l}
  (x : A)
  → 
  x ≣ x
_ qed = refl
infix 4 _≡_
_≡_ : {l : Level}{A : Set l}(x y : A) → Prop l
_≡_ = _≣_
infixr 3 _∧_
data _∧_ {l m : Level}(P : Prop l)(Q : Prop m) : Prop (l ⊔ m) where
  ∧i : P → Q → P ∧ Q
∧e₁ :
  {l m : Level}
  {P : Prop l}
  {Q : Prop m}
  → 
  P ∧ Q → P
∧e₁ (∧i p _) = p
∧e₂ :
  {l m : Level}
  {P : Prop l}
  {Q : Prop m}
  → 
  P ∧ Q → Q
∧e₂ (∧i _ q) = q
infix 3 _↔_
_↔_ : {l : Level} → Prop l → Prop l → Prop l
P ↔ Q = (P → Q) ∧ (Q → P)
infix  1 ∃
data ∃ {l m : Level}(A : Set l)(P : A → Prop m) : Prop (l ⊔ m) where
  ∃i : (x : A)(p : P x) → ∃ A P
syntax ∃ A (λ x → P) = ∃ x ∶ A , P
infix  1 ∃!
∃! : {l m : Level}(A : Set l)(P : A → Prop m) → Prop (l ⊔ m)
∃! A P = ∃ x ∶ A , (P x ∧ ∀(x' : A) → P x' → x ≡ x')
syntax ∃! A (λ x → P) = ∃! x ∶ A , P
infix  1 ⋀
data ⋀ {l m : Level}(P : Prop l)(Q : P → Prop m) : Prop (l ⊔ m) where
  ⋀i : (x : P)(p : Q x) → ⋀ P Q
syntax ⋀ P (λ p → Q) = ⋀ p ∶ P , Q
⋀e₁ :
  {l m : Level}
  {P : Prop l}
  {Q : P → Prop m}
  → 
  ⋀ P Q → P
⋀e₁ (⋀i p _) = p
⋀e₂ :
  {l m : Level}
  {P : Prop l}
  {Q : P → Prop m}
  (⋀pq : ⋀ P Q)
  → 
  Q (⋀e₁ ⋀pq)
⋀e₂ (⋀i _ q) = q
infixr 1 _∨_
data _∨_ {l m : Level}(P : Prop l)(Q : Prop m) : Prop (l ⊔ m) where
  ∨i₁ : P → P ∨ Q
  ∨i₂ : Q → P ∨ Q
case :
  {l m : Level}
  {A : Set l}
  {B : A → Set m}
  (x : A)
  (f : (x : A) → B x)
  → 
  B x
case x f  = f x
casep :
  {l m : Level}
  {A : Set l}
  {P : A → Prop m}
  (x : A)
  (p : (x : A) → P x)
  → 
  P x
casep x p  = p x
match :
  {l m : Level}
  {P : Prop l}
  {Q : P → Prop m}
  (p : P)
  (q : ∀ p → Q p)
  → 
  Q p
match p q  = q p
infixl 4 _∣_
record set
  {l m : Level}
  (A : Set l)
  (P : A → Prop m)
  : 
  Set (l ⊔ m)
  where
  constructor _∣_
  field
    el : A
    pf : P el
open set public
syntax set A (λ x → P) = set x ∶ A , P
setext :
  {l m : Level}
  {A : Set l}
  {P : A → Prop m}
  {z z' : set A P}
  (_ : el z ≡ el z')
  → 
  z ≡ z'
setext {z = _ ∣ _} {_ ∣ _} refl = refl
injection :
  {l m : Level}
  {A : Set l}
  {B : Set m}
  (f : A → B)
  → 
  Prop (l ⊔ m)
injection f = ∀{x x'} → f x ≡ f x' → x ≡ x'
surjection :
  {l m : Level}
  {A : Set l}
  {B : Set m}
  (q : B → A)
  → 
  Prop (l ⊔ m)
surjection q = ∀ x → ∃ y ∶ _ , q y ≡ x
Bij :
  {l m : Level}
  {A : Set l}
  {B : Set m}
  (f : A → B)
  → 
  Prop (l ⊔ m)
Bij f = injection f ∧ surjection f
∏ :
  {l m : Level}
  (A : Set l)
  (B : A → Set m)
  → 
  Set (l ⊔ m)
∏ A B = (x : A) → B x
syntax ∏ A (λ x → B) = ∏ x ∶ A , B
infixr 4 _,_
record ∑ {l m : Level}(A : Set l)(B : A → Set m) : Set(l ⊔ m) where
  constructor _,_
  field
    π₁ : A
    π₂ : B π₁
{-# BUILTIN SIGMA ∑ #-}
open ∑ public
infix 2 ∑-syntax
∑-syntax : {l m : Level}(A : Set l) → (A → Set m) → Set (l ⊔ m)
∑-syntax = ∑
syntax ∑-syntax A (λ x → B) = ∑ x ∶ A , B
pair :
  {l m : Level}
  {A : Set l}
  (B : A → Set m)
  (x : A)
  (_ : B x)
  → 
  ∑ A B
pair _ x y = (x , y)
∑ext :
  {l m : Level}
  {A : Set l}
  {B : A → Set m}
  {x x' : A}
  {y : B x}
  {y' : B x'}
  (_ : x ≡ x')
  (_ : y ≣ y')
  → 
  pair B x y ≡ pair B x' y'
∑ext refl refl = refl
∑heq₁ :
  {l m : Level}
  {A A' : Set l}
  {B : A → Set m}
  {B' : A' → Set m}
  {x : A}
  {x' : A'}
  {y : B x}
  {y' : B' x'}
  (_ : A ≡ A')
  (_ : B ≣ B')
  (_ : pair B x y ≣ pair B' x' y')
  → 
  x ≣ x'
∑heq₁ refl refl refl = refl
∑heq₂ :
  {l m : Level}
  {A A' : Set l}
  {B : A → Set m}
  {B' : A' → Set m}
  {x : A}
  {x' : A'}
  {y : B x}
  {y' : B' x'}
  (_ : A ≡ A')
  (_ : B ≣ B')
  (_ : pair B x y ≣ pair B' x' y')
  → 
  y ≣ y'
∑heq₂ refl refl refl = refl
record ∑ₚ {l m : Level}(P : Prop l)(B : P → Set m) : Set(l ⊔ m) where
  constructor _,_
  field
    π₁ : P
    π₂ : B π₁
open ∑ₚ public
infix 2 ∑ₚ-syntax
∑ₚ-syntax : {l m : Level}(P : Prop l) → (P → Set m) → Set (l ⊔ m)
∑ₚ-syntax = ∑ₚ
syntax ∑ₚ-syntax P (λ p → B) = ∑ₚ p ∶ P , B
pairₚ :
  {l m : Level}
  {P : Prop l}
  (B : P → Set m)
  (x : P)
  (_ : B x)
  → 
  ∑ₚ P B
pairₚ _ x y = (x , y)
∑ₚheq :
  {l m : Level}
  {P P' : Prop l}
  {B : P → Set m}
  {B' : P' → Set m}
  {x : P}
  {x' : P'}
  {y : B x}
  {y' : B' x'}
  (_ : P ≡ P')
  (_ : B ≣ B')
  (_ : pairₚ B x y ≣ pairₚ B' x' y')
  → 
  y ≣ y'
∑ₚheq refl refl refl = refl
infixr 5 _×_
_×_ : {l m : Level} → Set l → Set m → Set (l ⊔ m)
A × B = ∑ A (λ _ → B)
record 𝟙 : Set where
  instance constructor tt
{-# BUILTIN UNIT 𝟙 #-}
⟦_⟧ : {l : Level} → Prop l → Set l
⟦ p ⟧ = set _ ∶ 𝟙 , p
infixr 1 _⊎_
data _⊎_ {l m : Level}(A : Set l)(B : Set m) : Set (l ⊔ m) where
  ι₁ : (x : A) → A ⊎ B
  ι₂ : (y : B) → A ⊎ B
data ℕ : Set where
  zero : ℕ
  suc  : (n : ℕ) → ℕ
{-# BUILTIN NATURAL ℕ #-}
pattern _+1 n = suc n
infix 4 _≐_
_≐_ : ℕ → ℕ → 𝔹
zero ≐ zero     = true
zero ≐ (n +1)   = false
(m +1) ≐ zero   = false
(m +1) ≐ (n +1) = m ≐ n
decidableℕ : (m n : ℕ) → m ≡ n ∨ ¬(m ≡ n)
decidableℕ zero zero                         = ∨i₁ refl
decidableℕ zero (n +1)                       = ∨i₂ λ{()}
decidableℕ (m +1) zero                       = ∨i₂ λ{()}
decidableℕ (m +1) (n +1) with decidableℕ m n
...                      | ∨i₁ refl          = ∨i₁ refl
...                      | ∨i₂ p             = ∨i₂ λ{refl → p refl}
infixr 6 _∷_
data List {l : Level}(A : Set l) : Set l where
  []  : List A
  _∷_ : (x : A)(xs : List A) → List A
{-# BUILTIN LIST List #-}
module _
  {l m : Level}
  {A : Set l}
  {B : A → Set m}
  (f : (x : A) → B x)
  where
  ker : Set (l ⊔ m)
  ker = set (x , x') ∶ A × A , (f x ≣ f x')
  πker₁ : ker → A
  πker₁ ((x , _) ∣ _) = x
  πker₂ : ker → A
  πker₂ ((_ , x') ∣ _) = x'
  eqker : (z : ker) → f (πker₁ z) ≣ f (πker₂ z)
  eqker ((_ , _) ∣ e) = e