module Fib where data ⊥ : Set where infix 30 ¬_ ¬_ : Set → Set ¬ a = a → ⊥ record ⊤ : Set where infixr 40 _⊎_ data _⊎_ (a b : Set) : Set where inl : a → a ⊎ b inr : b → a ⊎ b data Maybe (a : Set) : Set where nothing : Maybe a just : a → Maybe a infixr 30 _,_ data Σ (a : Set) (P : a → Set) : Set where _,_ : (x : a) (w : P x) → Σ a P π₁ : ∀{a} {P : a → Set} → Σ a P → a π₁ (x , _) = x π₂ : ∀{a} {P : a → Set} → (p : Σ a P) → P (π₁ p) π₂ (_ , w) = w infixr 30 _×_ _×_ : Set → Set → Set a × b = Σ a (λ _ → b) data Acc {a : Set} (_<_ : a → a → Set) : a → Set where acc : ∀{x} → (∀{y} → y < x → Acc _<_ y) → Acc _<_ x wf-induction : ∀{a : Set} {_<_ : a → a → Set} {P : a → Set} → (∀{y} → (∀{z} → z < y → P z) → P y) → {x : a} → Acc _<_ x → P x wf-induction Φ (acc f) = Φ (λ z ℕ {-# BUILTIN NATURAL ℕ #-} {-# BUILTIN ZERO zero #-} {-# BUILTIN SUC suc #-} infixl 50 _+_ _+_ : ℕ -> ℕ -> ℕ zero + n = n (suc m) + n = suc (m + n) {-# BUILTIN NATPLUS _+_ #-} infixl 50 _-_ _-_ : ℕ → ℕ → Maybe ℕ m - zero = just m zero - suc n = nothing suc m - suc n = m - n infix 45 _≤_ data _≤_ : ℕ → ℕ → Set where z≤k : ∀{k} → zero ≤ k s≤s : ∀{m n} → m ≤ n → suc m ≤ suc n infix 45 _<_ _<_ : ℕ → ℕ → Set m < n = suc m ≤ n ≤-refl : ∀{i} → i ≤ i ≤-refl {zero} = z≤k ≤-refl {suc i} = s≤s ≤-refl ≤-trans : ∀{i j k} → i ≤ j → j ≤ k → i ≤ k ≤-trans z≤k j≤k = z≤k ≤-trans (s≤s i≤j) (s≤s j≤k) = s≤s (≤-trans i≤j j≤k) ≤-step : ∀{i j} → i ≤ j → i ≤ suc j ≤-step {zero} _ = z≤k ≤-step {suc i} (s≤s i≤j) = s≤s (≤-step i≤j) <-step : ∀{i j} → suc i < j → i < j <-step (s≤s i