在Idris中,证明函数的计算结果为True

时间:2016-01-18 23:06:46

标签: equality dependent-type idris

编辑:我发现如果我直接内联t1的定义,那么这种类型检查就好了。因此,似乎定义将t1视为一个未知变量而不是我之前的实际定义。有没有办法强迫这个?

前言:我完全意识到这不是写这个的惯用方法。我只是想明白这里发生了什么。

我编写了一个二叉树和函数elemBT的简单实现,它检查树是否包含特定元素并计算为布尔值(想想Haskell的elem函数,二进制树除外)。

t1 : BT Nat
t1 = Node 5 Nil Nil

elemBT : Eq a => a -> BT a -> Bool

> elemBT 5 t1
True : Bool

既然我知道elemBT评估为True,我希望能够写一个非常简单的陈述,通过以下方式证明这一点。

t1contains5 : elemBT 5 t1 = True
t1contains5 = Refl

出乎意料的是,这会导致统一失败。但是,我能够使用内置列表完成相同的操作。

junk : elem 5 [1,5] = True
junk = Refl

此类型按预期进行检查。为什么我的二叉树示例不能以相同的方式工作?

感谢。

1 个答案:

答案 0 :(得分:4)

我自己解决了这个问题。事实证明,在最近的某个时候(可能是2015年末),对Idris进行了更改,将任何小写,可能隐式变量视为隐含变量。如果我把T1大写,那么这个问题就完全消失了。

Github repository here

中有一些进一步的讨论