Idris 中的依赖元组?

Dependent Tuple in Idris?

在 Idris 中使用“**”语法糖很容易写下依赖对:

data Positive : Int -> Type where
    OneIsPositive : Positive 1
    SucIsPositive : Positive i -> Positive (i+1)

data IsEven : Int -> Type where
    ZeroIsEven : IsEven 0
    Add2IsEven : IsEven i -> IsEven (i+2)
    Sub2IsEven : IsEven i -> IsEven (i-2)

v1 : (x : Int ** Positive x)
v1 = (1 ** OneIsPositive)

v2 : (x : Int ** IsEven x)
v2 = (2 ** Add2IsEven ZeroIsEven)

但是当我想往元组中放入更多的东西时,我失败了(以下代码导致错误):

v3 : (x : Int ** Positive x ** IsEven x)
v3 = (2 ** SucIsPositive OneIsPositive ** Add2IsEven ZeroIsEven)

那么,一般来说,当我想将2个以上的元素放入依赖对(元组)时应该怎么做?


我发现在这种情况下我可以使用嵌套的普通元组来做到这一点:

v3 : (x : Int ** (Positive x, IsEven x))
v3 = (2 ** (SucIsPositive OneIsPositive, Add2IsEven ZeroIsEven))

但这是有限的。当第三部分依赖于第二部分时,这不再有效。

所以我仍然想知道建议的方法是什么?

如果您的依赖元组的第三个组件的类型不依赖于第二个组件的值,那么您所显示的非依赖对就是要走的路。

如果您想要嵌套的 dependent 对,您需要为第二个组件命名:

v3 : (x : Int ** unusedName : Positive x ** IsEven x)