如何在Coq中引发异常?(在比赛中…结束)

如何在Coq中引发异常?(在比赛中…结束),coq,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 }. Co

我需要定义递归定义,但我还不知道如何正确地定义()。 所以我想有一个部分定义的函数,它会告诉我们何时需要编写额外的递归级别

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) 有没有一种低级仪器不会强迫我使用单子

3) 是否有可能对Coq中的所有自然数定义我的函数“ur”

4) 是否有某种组合器将函数“pr1”应用n次

5) 我应该创建5个不同的问题(其中一个在meta:-)还是这是正确的提问方式

1) 是否有可能在所有自然数上创建例外 超过3个?(模式匹配期间)

不,Coq是一种完整的语言。这方面的标准模式是使函数返回类型
T
选项T
,这样您就可以在偏爱单子中工作。例如:

Definition ur (n: nat) := (match n with
  | 0 => Some ur0
  | 1 => Some ur1
  | 2 => Some ur2
  | 3 => Some ur3
  | _ => None
 end).
2) 有没有一种低级乐器不会强迫我使用单子

见上文。你是否想叫它“monad”取决于你自己

另一种方法是在模式匹配“失败”时返回一个“默认”值
urF
。在各种情况下,此方法比选项类型更方便

3) 是否有可能对Coq中的所有自然数定义我的函数“ur”

我想是的。请提供缺少的定义,我们可以尝试

4) 是否有某种组合器将函数“pr1”应用n次

原则上是的,但这取决于你想要的确切类型

5) 我应该创建5个不同的问题(其中一个在meta:-)还是这是正确的提问方式

也许吧。这个问题最大的问题是代码不正确
独立的。

对于1)我们也可以使用归纳数据类型,并使用关系而不是函数进行工作。的确!但是你的定义没有简化,所以这是一个必须仔细权衡的权衡。一般来说,如果函数是可计算的,我总是更喜欢定义而不是归纳的。(3)我修改了一个代码,使其自包含。非常感谢你对我上一个问题的正确回答。把“ur”的定义写在整个nat中是个问题。我真的需要一些帮助。无法使用
admit
来模拟,例如Haskell的
未定义的行为?@k_g不完全正确,特别是在8.5中,但我想这是另一个问题。