module Demo where
data Bool : Set where
True : Bool
False : Bool
not : Bool -> Bool
not True = False
not False = True
if_then_else_ : Bool -> Bool -> Bool -> Bool
if True then t else e = t
if False then t else e = e
data Nat : Set where
Zero : Nat
Succ : Nat → Nat
_+_ : Nat → Nat → Nat
Zero + y = y
Succ x + y = Succ (x + y)
{-# BUILTIN NATURAL Nat #-}
cond : ∀ {a : Set} -> Bool -> a -> a -> a
cond True t e = t
cond False t e = e
test : Nat
test = cond True 3 45
id : ∀ {a : Set} -> a -> a
id x = x
data List (a : Set) : Set where
Nil : List a
Cons : a -> List a -> List a
_++_ : {a : Set} -> List a -> List a -> List a
Nil ++ ys = ys
Cons x xs ++ ys = Cons x (xs ++ ys)
xs : List Nat
xs = Cons 3 (Cons 4 (Cons 5 Nil))
map : {a b : Set} -> (a -> b) -> List a -> List b
map f Nil = Nil
map f (Cons x xs) = Cons (f x) (map f xs)
data Maybe (a : Set) : Set where
Nothing : Maybe a
Just : a -> Maybe a
_!!_ : {a : Set} -> List a -> Nat -> Maybe a
Nil !! Zero = Nothing
Cons x xs !! Zero = Just x
Nil !! Succ i = Nothing
Cons x xs !! Succ i = xs !! i
length : {a : Set} -> List a -> Nat
length Nil = Zero
length (Cons x xs) = Succ (length xs)
data _<_ : Nat -> Nat -> Set where
Base : forall {n} -> Zero < Succ n
Step : ∀ {n m} -> n < m -> Succ n < Succ m
lemma : 3 < 6
lemma = Step (Step (Step Base))
impossible : {a : Set} -> (n : Nat) -> n < Zero -> a
impossible n ()
lookup : {a : Set} -> (n : Nat) -> (xs : List a) -> n < length xs -> a
lookup n Nil ()
lookup Zero (Cons x xs) p = x
lookup (Succ n) (Cons x xs) (Step p) = lookup n xs p
data Vec (a : Set) : Nat -> Set where
Nil : Vec a Zero
Cons : {n : Nat} -> a -> Vec a n -> Vec a (Succ n)
head : {a : Set} -> (xs : List a) -> 0 < length xs -> a
head Nil ()
head (Cons x xs) p = x
vhead : {a : Set} {n : Nat} -> Vec a (Succ n) -> a
vhead (Cons x xs) = x
vlookup : {a : Set} {n : Nat} -> Vec a n -> (m : Nat) -> m < n -> a
vlookup Nil m ()
vlookup (Cons x xs) Zero p = x
vlookup (Cons x xs) (Succ n) (Step p) = vlookup xs n p
data Fin : Nat -> Set where
FZero : {n : Nat} -> Fin (Succ n)
FSucc : {n : Nat} -> Fin n -> Fin (Succ n)
vlookup' : {a : Set} {n : Nat} -> Vec a n -> Fin n -> a
vlookup' (Cons x xs) FZero = x
vlookup' (Cons x xs) (FSucc i) = vlookup' xs i
vappend : (a : Set) (n m : Nat) -> Vec a n -> Vec a m -> Vec a (n + m)
vappend a .Zero m Nil ys = {!!}
vappend a .(Succ k) m (Cons {k} x xs) ys = {!!}
data _==_ : Nat -> Nat -> Set where
Refl : {n : Nat} -> n == n
q : 1 == 1
q = Refl
r : (0 + (1 + 2)) == (3 + 0)
r = Refl
q' : (n : Nat) -> (Zero + n) == n
q' n = Refl
sym : (x y : Nat) -> x == y -> y == x
sym x .x Refl = Refl
trans : {x y z : Nat} -> x == y -> y == z -> x == z
trans Refl q = q
cong : {x y : Nat} -> (f : Nat -> Nat) -> x == y -> f x == f y
cong f Refl = Refl
plus-zero : (n : Nat) -> (n + Zero) == n
plus-zero Zero = Refl
plus-zero (Succ n) = let ih = plus-zero n in cong Succ ih
infixr 2 _⟨_⟩_
_⟨_⟩_ : (x : Nat) -> { y z : Nat} -> x == y -> y == z -> x == z
_⟨_⟩_ x = trans
_■ : forall x -> x == x
_■ x = Refl
plus-zero' : (n : Nat) -> (n + Zero) == n
plus-zero' Zero = Refl
plus-zero' (Succ n) =
(Succ n) + Zero
⟨ Refl ⟩
Succ (n + Zero)
⟨ cong Succ (plus-zero' n) ⟩
Succ n ■
foo : (x y : Nat) -> x == (y + 4) -> (y + 4) == x
foo .(y + 4) y Refl = Refl
data Either (a b : Set) : Set where
Inl : a -> Either a b
Inr : b -> Either a b
data Empty : Set where
Not : Set -> Set
Not a = a -> Empty
bar : Not (0 == 1)
bar ()
zs-lemma : (y : Nat) -> (Not (Zero == Succ y))
zs-lemma y ()
eq : (x y : Nat) -> Either (x == y) (Not (x == y))
eq Zero Zero = Inl Refl
eq Zero (Succ y) = Inr (λ () )
eq (Succ x) Zero = Inr (λ ())
eq (Succ x) (Succ y) with eq x y
eq (Succ .y) (Succ y)| Inl Refl = {!!}
... | Inr q = Inr (\sxy -> q (h sxy))
where
h : {x y : Nat} -> Succ x == Succ y -> x == y
h Refl = Refl
filter : {a : Set} -> (a -> Bool) -> List a -> List a
filter p Nil = Nil
filter p (Cons x xs) with p x
filter p (Cons x xs) | True = Cons x (filter p xs)
filter p (Cons x xs) | False = filter p xs
data SubList {a : Set} : List a -> List a -> Set where
Base : {xs : List a} -> SubList Nil xs
Keep : forall {x xs ys} -> SubList xs ys -> SubList (Cons x xs) (Cons x ys)
Drop : forall {y xs ys} -> SubList xs ys -> SubList xs (Cons y ys)
exampleSL : SubList (Cons 1 Nil) (Cons 2 (Cons 1 (Cons 3 Nil)))
exampleSL = Drop (Keep Base)
filter-lemma : {a : Set} -> (p : a -> Bool) -> (xs : List a) -> SubList (filter p xs) xs
filter-lemma p Nil = Base
filter-lemma p (Cons x xs) with p x
filter-lemma p (Cons x xs) | True = Keep (filter-lemma p xs)
filter-lemma p (Cons x xs) | False = Drop (filter-lemma p xs)
baz : (x y : Nat) -> (y + 4) == (x + 4) -> x == y
baz x y p with y + 4 | x + 4
baz x y Refl | xp | .xp = {!!}