coq - Inductive 和 CoInduction 之间的唯一区别是对其使用的格式良好性检查(在 Coq 中)吗?

标签 coq coinduction corecursion codata

换句话来说:如果我们分别删除归纳和共归纳数据类型使用的终止检查和防护条件,那么归纳/共归纳和修复/cofix之间是否不再有根本区别?

我所说的“根本差异”是指 Coq 核心演算的差异,而不是语法和证明搜索等方面的差异。

这似乎最终归结为有关构造微积分的问题。

注意:我知道一个定理证明者跳过了递归/核心递归的终止检查/防护性可以证明False - 所以,如果有帮助,请将此视为关于非总体编程的问题,而不是而不是证明。

最佳答案

fix 和 cofix 的终止检查是其格式良好规则的一部分。如果我们忽略这一点,这些构造的另一个重要区别特征在于计算规则。

  • fix 仅当其递减参数是构造函数时才减少

  • cofix 仅在析构函数(match 或原始投影)下减少

(* stuck *)
(fix f x {struct x} := body f x)

(* not stuck *)
(fix f x {struct x} := body f x) (S y)
=
body (fix f x := body f x) (S y)


(* stuck *)
(cofix g x := body g x)

(* not stuck *)
match (cofix g x := body g x) with _ => _ end
= match body (cofix g x := body g x) x with _ => _ end

这些特殊的规则是为了确保终止。如果您不关心这一点,并允许 fixcofix 在任何上下文中展开,那么它们的行为与固定点组合器相同:

(fix f x := body f x)
=
(fun x => body (fix f x := body f x) x)

(cofix g x := body g x)
=
(fun x => body (cofix g x := body g x) x)

关于coq - Inductive 和 CoInduction 之间的唯一区别是对其使用的格式良好性检查(在 Coq 中)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65249907/

相关文章:

emacs - 快鸡 "Error: Could not compile mli file"

coq - 相互定义的归纳类型的可判定相等定义

coq - 使用 `dependent induction` 策略在归纳时保留信息

coq - 程序修复点: recursive call in `let` and hypothesis of the obligation

coq - 是否可以在任何共归纳类型上确定相等性?

isabelle - 推理 Isabelle/HOL 中整个 codatatype

haskell - Haskell 中的列表是归纳的还是归纳的?

coq - 我可以证明 "coinductive principles"关于共感类型吗?

rx-java - 在 RxJava 中生成 Observable?

haskell - 将非空结构展开到列表