[Agda] Question regarding a simple "dependently typed
IF-THEN-ELSE"
Konstantin Tretjakov
kt at ut.ee
Tue Mar 11 00:02:18 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
I guess this means I cannot assert equality between [if true then a else b] and a, right?
OK, but my main question is still different. Namely, why is it possible to define
f : (t : Bool) → if[Set*] t then Bool else ℕ
but not
f : (t : Bool) → if t then Bool else ℕ
where the only difference between if and if[Set*] is that the former is defined for
(Bool, A: Set i, B: Set j)
and the latter - for
(Bool, Set i, Set j)
K.
>
> 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
>>
>
>
More information about the Agda
mailing list