Agda-2.3.2.2: test/succeed/Injectivity.agda
-- Simple test to check if constraint solving for injective
-- functions is working.
module Injectivity where
data Nat : Set where
zero : Nat
suc : Nat -> Nat
_+_ : Nat -> Nat -> Nat
zero + m = m
suc n + m = suc (n + m)
{-# BUILTIN NATURAL Nat #-}
{-# BUILTIN ZERO zero #-}
{-# BUILTIN SUC suc #-}
{-# BUILTIN NATPLUS _+_ #-}
infixr 40 _::_
data List (A : Set) : Set where
[] : List A
_::_ : A -> List A -> List A
foldr : {A B : Set} -> (A -> B -> B) -> B -> List A -> B
foldr f z [] = z
foldr f z (x :: xs) = f x (foldr f z xs)
data U : Set where
nat : U
list : U -> U
El : U -> Set
El nat = Nat
El (list a) = List (El a)
sum : {a : U} -> El a -> Nat
sum {nat} n = n
sum {list a} xs = foldr (\a b -> sum a + b) zero xs
data _==_ {A : Set}(x : A) : A -> Set where
refl : x == x
test₁ = sum (1 :: 2 :: 3 :: [])
ok₁ : test₁ == 6
ok₁ = refl
test₂ = sum ((1 :: []) :: (3 :: 5 :: []) :: [])
ok₂ : test₂ == 9
ok₂ = refl