You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Coq中定义相互递归类型?遇语法错误求助

解决Coq中相互递归类型定义的语法错误

你遇到的语法错误核心原因是:Coq的Inductive ... with结构仅支持归纳类型之间的相互递归定义,而你在with分支里直接放入了非归纳类型的定义(C是函数类型、E是list D的类型别名),这违反了语法规则。

修正方案

将非归纳类型的定义从Inductive ... with结构中抽离,单独用Definition声明,仅在with中保留真正的相互递归归纳类型(A、B、D、F)。

示例代码

-- 先定义相互递归的归纳类型集合
Inductive A : Type :=
  | a : F -> A
  (* 其他无关构造器 *)
with B : Type :=
  | b : xxx -> A -> B -> B
  (* 其他无关构造器 *)
with D : Type :=
  | d : C -> xxx -> zzz -> B -> D
  (* 其他无关构造器 *)
with F : Type :=
  | f : E -> F
  (* 其他无关构造器 *)
.

-- 单独定义非归纳类型C和E
Definition C : Type := xxx -> yyy.
Definition E : Type := list D.

特殊情况调整

如果C的定义必须早于D(比如D的构造器直接依赖C),可以先单独声明C,再定义归纳类型:

Definition C : Type := xxx -> yyy.

Inductive A : Type :=
  | a : F -> A
  (* 其他无关构造器 *)
with B : Type :=
  | b : xxx -> A -> B -> B
  (* 其他无关构造器 *)
with D : Type :=
  | d : C -> xxx -> zzz -> B -> D
  (* 其他无关构造器 *)
with F : Type :=
  | f : E -> F
  (* 其他无关构造器 *)
.

Definition E : Type := list D.

内容的提问来源于stack exchange,提问作者Cs_J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:47:03