Theorem proving idris中类型计算函数结果的模式匹配

Theorem proving idris中类型计算函数结果的模式匹配,theorem-proving,idris,Theorem Proving,Idris,考虑以下片段: import Data.List %default total x : Elem 1 [1, 2] x = Here type : Type type = Elem 1 [1, 2] y : type y = Here 这会产生以下错误: 检查y轴右侧时: 之间的类型不匹配 元素x(x::xs)(此处的类型) 和 iType(预期类型) 查询时,y的类型为: type : Type ----------- y : type 是否可以在y的类型归属期间或之前强制对typ

考虑以下片段:

import Data.List

%default total

x : Elem 1 [1, 2]
x = Here

type : Type
type = Elem 1 [1, 2]

y : type
y = Here
这会产生以下错误:

检查y轴右侧时: 之间的类型不匹配 元素x(x::xs)(此处的类型) 和 iType(预期类型)

查询时,
y
的类型为:

type : Type
-----------
y : type
是否可以在
y
的类型归属期间或之前强制对
type
进行评估,以便
y
的类型为
Elem 1[1,2]

我的用例是,我希望能够定义泛型谓词,这些谓词返回正确的命题术语进行证明,例如:

subset : List a -> List a -> Type
subset xs ys = (e : a) -> Elem e xs -> Elem e ys

thm_filter_subset : subset (filter p xs) xs

类型声明中以小写字母开头的名称是隐式绑定的,因此它将“type”视为类型参数。您可以为“type”指定一个以大写字母开头的新名称(按照惯例,大多数人在Idris中都是这样做的),也可以使用名称所在的模块(Main,此处)明确限定名称


Idris用于尝试猜测诸如“type”之类的名称是作为隐式名称还是用于引用全局名称,如下所示。但是,要做到这一点需要各种各样的巫毒,所以它经常失败,所以它现在实现了这个简单得多的规则。在这种情况下,这有点烦人,但另一种行为往往更烦人(也更难解释)。

新系统感觉像哈斯克尔的。我一直在想