Coq:通过对其参数的参数进行模式匹配来定义函数
Coq: Defining a function by pattern matching on the arity of its argument
我想定义一个函数,其行为取决于它的参数是否(至少)是一个 n 位函数。一个基本的(失败的)尝试是
Definition rT {y:Type}(x:y) := ltac: (match y with
| _ -> _ -> _ => exact True
| _ => exact False end).
Check prod: Type -> Type -> Type.
Compute rT prod. (*= False: Prop*)
Print rT. (*rT = fun (y : Type) (_ : y) => False: forall y : Type, y -> Prop*)
如您所见,rT
将所有内容映射到 False
。为什么?如果我用 type of x
替换匹配子句中的 y
,结果保持不变
Gallina 中不存在您想要的函数,其类型为您期望的类型。
你的函数被接受了,但是如果你打印它,你可以看到它的主体是:
rT = fun (y : Type) (_ : y) => False
Gallina 无法 match
-ing Type
。有一些方法可以处理 n 元函数,您可以通过这种方式检查它们的元数,但它涉及依赖类型来静态捕获元数。例如,对于统一的 n 元函数:
我想定义一个函数,其行为取决于它的参数是否(至少)是一个 n 位函数。一个基本的(失败的)尝试是
Definition rT {y:Type}(x:y) := ltac: (match y with
| _ -> _ -> _ => exact True
| _ => exact False end).
Check prod: Type -> Type -> Type.
Compute rT prod. (*= False: Prop*)
Print rT. (*rT = fun (y : Type) (_ : y) => False: forall y : Type, y -> Prop*)
如您所见,rT
将所有内容映射到 False
。为什么?如果我用 type of x
y
,结果保持不变
Gallina 中不存在您想要的函数,其类型为您期望的类型。
你的函数被接受了,但是如果你打印它,你可以看到它的主体是:
rT = fun (y : Type) (_ : y) => False
Gallina 无法 match
-ing Type
。有一些方法可以处理 n 元函数,您可以通过这种方式检查它们的元数,但它涉及依赖类型来静态捕获元数。例如,对于统一的 n 元函数: