证明两个值与case语句相等

时间:2017-11-07 01:18:06

标签: pattern-matching typechecking idris unification

以下示例使用Bi package中的Data.Bin

import Data.Bin

foo : (x, y : Bin) -> Dec (binCompare x y = LT)
foo x y = case binCompare x y of
    LT => Yes (C1 ?hole1)
    EQ => ...
    GT => ...

:t ?hole1
binCompare x y = LT

如何在处理binCompare x y = LT案件时获得LT的证明?

1 个答案:

答案 0 :(得分:5)

您需要使用view代替case

  

由于类型可以依赖于值,因此某些参数的形式可以由其他参数的值确定。

所以下面的版本按预期工作:

foo : (x, y : Bin) -> Dec (binCompare x y = LT)
foo x y with (binCompare x y)
  foo x y | LT = Yes Refl
  foo x y | EQ = ?q_2
  foo x y | GT = ?q_3