如何在Coq中引发异常?(在匹配...结束时)

时间:2016-05-20 07:39:07

标签: coq

我需要定义递归定义,但我还不知道如何正确地执行它()。 所以我希望有一个部分定义的函数,它可以说何时需要写入额外的递归级别。

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上有一个:-))或者这是正确的问题吗?

1 个答案:

答案 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上有一个:-))或者这是正确的问题吗?

也许。这个问题的最大问题是代码不是 自包含的。