[Agda] Question regarding a simple "dependently typed IF-THEN-ELSE"

Konstantin Tretjakov kt at ut.ee
Mon Mar 10 16:54:12 CET 2014


Hello,

suppose I would like to be able to use if-then-else in something like the following:

   f t = if t then true else zero

My current attempt at doing it (Agda 2.3.0.1, Windows) is this:

--------------------------------
module Test1 where

postulate
   Level  : Set
   lze    : Level
   lsu    : Level -> Level
   lmax   : Level -> Level -> Level

{-# BUILTIN LEVEL         Level  #-}
{-# BUILTIN LEVELZERO     lze    #-}
{-# BUILTIN LEVELSUC      lsu    #-}
{-# BUILTIN LEVELMAX      lmax   #-}


data Bool : Set where
   true false : Bool

data ℕ : Set  where
   zero : ℕ
   suc : ℕ → ℕ

{- Set level of the return type of the if-then-else operator -}
if[Level]_then_else_ : Bool → Level → Level → Level
if[Level] true then x else y = x
if[Level] false then x else y = y

{- Return type of the if-then-else operator -}
if[Set*]_then_else_ : ∀ {i j} (t : Bool) → Set i → Set j → Set (if[Level] t then i else j)
if[Set*] true then A else B = A
if[Set*] false then A else B = B

{- Define the actual if-then-else operator -}
if_then_else_ : ∀ {i j}{A : Set i}{B : Set j}(t : Bool) → A → B → (if[Set*] t then A else B)
if true then x else y = x
if false then x else y = y


{- The test -}
f : (t : Bool) → if[Set*] t then Bool else ℕ
f t = if t then true else zero
--------------------------------

This seems to work fine. However, the version, where I use the "most general" 
if_then_else_ in the type declaration, i.e.:

   f : (t : Bool) → if t then Bool else ℕ
   f t = if t then true else zero

would not go through, reporting that:

   if[Set*] t then Set else Set !=< Set (_53 t) of type
   Set (if[Level] t then lsu lze else lsu lze)
   when checking that the expression if t then Bool else ℕ has type
   Set (_53 t)

I do not understand the reason for this behaviour. Is it a bug of the version I am using, 
or am I misunderstanding something here? After all, simply writing

g1 : Set
g1 = if[Set*] true then Bool else ℕ
g2 : Set
g2 = if true then Bool else ℕ

seems to work totally fine.


Thank you,
K.


PS: A couple of optional noob questions, once I'm at it:
* Is it possible to somehow verify that g1 == g2 in the last code snippet above?
* Is there a possibility to do pattern-matching on type expressions in Agda?
(e.g.
  f: (t = true) → ...
  f: (t = false) → ...)


More information about the Agda mailing list