Coq 无法在定义中使用析构函数时出现问题

Coq 无法在定义中使用析构函数时出现问题,coq,coqide,Coq,Coqide,我正在使用coq中的一个定义,它需要从一个定理中产生一些东西,但不能在定义中进行破坏 Theorem sp : forall (X : Type) (T : X -> Prop)..... , exists (a : X), T a. Definition yield_sp : (X : Type) (T : X -> Prop) (H : sp X T .....)..... : X. 当我试图破坏H时,coq警告说 归纳定义ex不允许对排序类型进行案例分析 我想知道这样做的原因

我正在使用coq中的一个定义,它需要从一个定理中产生一些东西,但不能在定义中进行破坏

Theorem sp : forall (X : Type) (T : X -> Prop)..... , exists (a : X), T a.
Definition yield_sp : (X : Type) (T : X -> Prop) (H : sp X T .....)..... : X.
当我试图破坏H时,coq警告说

归纳定义ex不允许对排序类型进行案例分析


我想知道这样做的原因,以及如何使用定义从“存在”命题中产生元素。

你不能从存在证明中提取证据。有几种选择:

  • 将证明语句更改为
    {x:T|px}
    ,其行为或多或少类似于存在量词,但支持投影函数
    proj1_sig:{x:T|px}->T

  • 假设一个选择公理,如

  • 如果你在一个可数类型上进行量化,并且你的命题是可判定的,你可以使用中的技巧提取证人


我猜在
定理sp
之后缺少一个冒号?是的,我把它和定义搞混了是不是coq的语法不允许简单地从exists语句生成某些东西?我认为,要做到这一点,必须声明有一个投影函数可以精确地计算它,因为箭头在coq中表示可计算的关系。