packages feed

idris-0.9.9: test/reg012/reg012.lidr

> total soElim            :  (C : (b : Bool) -> so b -> Type) ->
>                            C True oh                       ->
>                            (b : Bool) -> (s : so b) -> (C b s)
> soElim C coh .True .oh  =  coh

> soFalseElim             :  so False -> a
> soFalseElim x           =  FalseElim (soElim C () False x)
>                            where
>                            C : (b : Bool) -> so b -> Type
>                            C True s = ()
>                            C False s = _|_

> soTrue                  :  so b -> b = True
> soTrue {b = False} x    =  soFalseElim x
> soTrue {b = True}  x    =  refl
                             
> class Eq alpha => ReflEqEq alpha where
>   reflexive_eqeq : (a : alpha) -> so (a == a)

> modifyFun : (Eq alpha) => 
>             (alpha -> beta) -> 
>             (alpha, beta) -> 
>             (alpha -> beta)
> modifyFun f (a, b) a' = if a' == a then b else f a'

> modifyFunLemma : (ReflEqEq alpha) => 
>                  (f : alpha -> beta) ->
>                  (ab : (alpha, beta)) ->
>                  modifyFun f ab (fst ab) = snd ab
> modifyFunLemma f (a,b) = 
>   rewrite soTrue (reflexive_eqeq a) in refl

   replace {P = \ z => boolElim (a == a) b (f a) = boolElim z b (f a)} 
           (soTrue (reflexive_eqeq a)) refl