Coq中的终止谓词

Coq中的终止谓词,coq,Coq,考虑一个为求值关系建模的谓词。关系将以true或false停止,因此我希望链的值为配置或布尔值: Inductive compile_step : conf_type + bool -> conf_type + bool -> Prop 我知道评估终止,我想正式证明它。所以我定义了一个终止谓词: Inductive terminating {A} (r: A -> A -> Prop) (c': A) := | TStep : (forall c1, r c' c1

考虑一个为求值关系建模的谓词。关系将以true或false停止,因此我希望链的值为配置或布尔值:

Inductive compile_step :
  conf_type + bool -> conf_type + bool -> Prop
我知道评估终止,我想正式证明它。所以我定义了一个终止谓词:

Inductive terminating {A} (r: A -> A -> Prop) (c': A) :=
| TStep : (forall c1, r c' c1 -> terminating r c1) ->
          terminating r c'.
并试图证明这一点:

Lemma compiling_terminates (c': A):
  terminating compile_step c'.
现在,让我惊讶的是Coq变得疯狂了。在这里,明智的做法是应用TStep并解决此目标:

(H) c'⟹ c1意味着终止编译步骤c1

以下是问题的起点:

  • 反转H:
  • 错误:反转需要对排序集进行案例分析,而排序集不是 允许归纳定义编译步骤

  • 自毁H:
  • 错误:不允许对分类集进行案例分析 定义编译步骤

  • 诱导H:
  • 错误:找不到消除组合器编译\u步骤\u rec 消除排序集上的归纳定义编译步骤是 可能不允许

    错误会在层次结构的更深层次上重现

    对此有一个简单的解释吗?有简单的解决办法吗


    也许对你们中的一些人来说是有用的。

    试着明确地把
    终止
    放在
    Prop
    中(
    归纳终止{A}(r:A->A->Prop)(c:A):Prop:=…
    )。问题是你不能在
    Prop
    中对一个术语使用消去法来为
    集合
    @SCappella生成一个术语,这只是为了澄清,
    Prop
    的构建理念是它应该与计算无关,所以Coq不允许你对命题的证明进行案例分析,以构建有意义的计算结果。所以Coq不会变得疯狂,它只是告诉你要小心你想做的事。谢谢你的澄清@在
    Prop
    感应式终止{A}(r:A->A->Prop)(c:A):Prop:=…
    )中显式放置
    终止
    )。问题是你不能在
    Prop
    中对一个术语使用消去法来为
    集合
    @SCappella生成一个术语,这只是为了澄清,
    Prop
    的构建理念是它应该与计算无关,所以Coq不允许你对命题的证明进行案例分析,以构建有意义的计算结果。所以Coq不会变得疯狂,它只是告诉你要小心你想做的事。谢谢你的澄清@泰奥维特酒店