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 元函数:

https://coq.inria.fr/library/Coq.Numbers.NaryFunctions.html