我需要定义递归定义,但我还不知道如何正确地执行它()。 所以我希望有一个部分定义的函数,它可以说何时需要写入额外的递归级别。
Context (qsigT: forall (A : Type) (P : forall a : A, Type), Type).
Context (qpr1: forall (A : Type) (P : forall a : A, Type), (@qsigT A P) -> A ).
Record Category :={
ty:>Type
}.
Context (uc:Category).
Context (mO mS: uc -> Type).
Definition ur0:= (@qsigT uc (fun x => mO (x) ) ).
Definition ur1:= (@qsigT ur0 (fun x => mS (qpr1 _ _ x) ) ).
Definition ur2:= (@qsigT ur1 (fun x => mS (qpr1 _ _ (qpr1 _ _ x)) ) ).
Definition ur3:= (@qsigT ur2 (fun x => mS (qpr1 _ _ (qpr1 _ _ (qpr1 _ _ x))) ) ).
(*and so on ...*)
Definition ur (n: nat) := (match n with
|0 => ur0
|1 => ur1
|2 => ur2
|_ => ur3
(*|_ => error*)
end).
1)是否可能在大于3的所有自然数上创建例外? (在模式匹配期间)
2)是否有低等级的仪器不会强迫我使用monades?
3)是否可以在Coq的所有自然数上定义我的函数'ur'?
4)是否有某种组合器会将“pr1”函数应用n次?
5)我应该创建5个不同的问题(在meta上有一个:-))或者这是正确的问题吗?
答案 0 :(得分:1)
1)是否可能在所有更大的自然数上创建例外 比3? (在模式匹配期间)
没有。 Coq是一种语言。标准模式是让您的函数返回option T
类型T
,因此您使用偏好monad 。例如:
Definition ur (n: nat) := (match n with
| 0 => Some ur0
| 1 => Some ur1
| 2 => Some ur2
| 3 => Some ur3
| _ => None
end).
2)是否有低级别的乐器不会强迫我使用monad?
见上文。是否要将其称为“monad”取决于你。
另一种方法是在模式匹配“失败”时返回“默认”值urF
。在各种情况下,这种方法比选项类型更方便。
3)是否可以在Coq的所有自然数上定义我的函数'ur'?
我是这么认为的。请提供缺少的定义,我们可以尝试。
4)是否有某种组合器会将“pr1”函数应用n次?
原则上是的,但它取决于你想要的确切类型。
5)我应该创建5个不同的问题(在meta上有一个:-))或者这是正确的问题吗?
也许。这个问题的最大问题是代码不是 自包含的。