中替换
我想定义一个函数,其行为取决于它的参数是否(至少(是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
。为什么?如果我在匹配条款W/type of x
y
,则结果保持不变。您想要的函数在您期望的类型上不能存在。
您的功能已被接受,但是如果您打印它,则可以看到它的身体是:
rT = fun (y : Type) (_ : y) => False
Gallina在Type
上无法使用match
-ing。有一些方法可以以一种可以检查其敏锐度的方式来处理N- ARY功能,但是它涉及静态捕获ARITY的依赖类型。例如,对于统一的n-ary函数:
https://coq.inria.fr/library/coq.numbers.naryfunctions.html