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

Andreas Abel andreas.abel at ifi.lmu.de
Mon Mar 10 19:27:40 CET 2014


Just a quick comment:  In intensional type theory, e.g. Agda,

   if t then a else a

is not definitionally equal to

   a

hence, the error.

On 10.03.2014 16:54, Konstantin Tretjakov wrote:
> 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) → ...)
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>


-- 
Andreas Abel  <><      Du bist der geliebte Mensch.

Depeartment of Computer Science and Engineering
Chalmers and Gothenburg University, Sweden

andreas.abel at gu.se
http://www2.tcs.ifi.lmu.de/~abel/


More information about the Agda mailing list