module Tutorial where
data ℕ : Set where
zero : ℕ
suc : ℕ → ℕ
data List {a} (A : Set a) : Set a where
[] : List A
_∷_ : A → List A → List A
infixr 20 _∷_
data Vec {a} (A : Set a) : ℕ → Set a where
[] : Vec A zero
_∷_ : ∀ {n} → A → Vec A n → Vec A (suc n)
data Even : ℕ → Set where
z-even : Even zero
s-even : ∀ {n} → Even n → Even (suc (suc n))
six : ℕ
six = suc (suc (suc (suc (suc (suc zero)))))
6-even : Even six
6-even = s-even (s-even (s-even z-even))
data dummy {a b} : Set a → Set b where
_+_ : ℕ → ℕ → ℕ
zero + b = b
(suc a) + b = suc (a + b)
size : ∀ {a} {A : Set a} → List A → ℕ
size [] = zero
size (hd ∷ tl) = suc (size tl)
myList : List ℕ
myList = zero ∷ []
sizeImp : ℕ
sizeImp = size myList
sizeExp : ℕ
sizeExp = size {A = ℕ} myList
_++_ : ∀ {a} {A : Set a} → List A → List A → List A
[] ++ l = l
(hd ∷ tl) ++ l = hd ∷ (tl ++ l)
data _≡_ {a} {A : Set a} (x : A) : A → Set where
refl : x ≡ x
cong : ∀ {a b} {A : Set a} {B : Set b} {x y} (f : A → B) → x ≡ y → f x ≡ f y
cong f refl = refl
≡size : ∀ {a} {A : Set a} {l l₁ : List A} → (size l + size l₁) ≡ size (l ++ l₁)
≡size {l = []} = refl
≡size {l = hd ∷ tl} = cong suc (≡size {l = tl})
_++̬_ : ∀ {n n₁ a} {A : Set a} → Vec A n → Vec A n₁ → Vec A (n + n₁)
[] ++̬ v₂ = v₂
(x ∷ v₁) ++̬ v₂ = x ∷ (v₁ ++̬ v₂)
data ⊥ : Set where
¬ : ∀ {a} → Set a → Set a
¬ A = A → ⊥
data Dec {a} (A : Set a) : Set a where
yes : (p : A) → Dec A
no : (¬p : ¬ A) → Dec A
dec≡ : ∀ {x y : ℕ} → Dec (x ≡ y)
dec≡ {zero} {zero} = yes refl
dec≡ {zero} {suc y} = no (λ ())
dec≡ {suc x} {zero} = no (λ ())
dec≡ {suc x} {suc y} with dec≡ {x} {y}
dec≡ {suc x} {suc y} | yes x≡y = yes (cong suc x≡y)
dec≡ {suc x} {suc y} | no ¬x≡y = no (λ {refl → (¬x≡y refl)})