代码之家  ›  专栏  ›  技术社区  ›  Rodrigo Ribeiro

用Coq中归纳谓词的递归定义函数

coq
  •  1
  • Rodrigo Ribeiro  · 技术社区  · 7 年前

    我正试图在Coq中重新实现我的Agda代码。我的问题是,我的Agda函数之一是由归纳谓词结构上的递归定义的。

    在我的Coq代码中,我试图遵循相同的样式,但有一个模式匹配限制,不允许通过在Prop中键入来分析值的结构,从而在Set中生成结果。我的问题是:有没有一种方法可以在证明上通过递归定义函数,同时在集合中生成结果(如sumbool)?

    包含再现错误的所有定义的代码如下所示 gist .

    1 回复  |  直到 7 年前
        1
  •  2
  •   Tej Chajed    7 年前

    问题是,您需要在证明中包含信息来构建树。具体来说,你需要一些拆分 (s1, s2) 因此 s1 ++ s2 = s /\ s1 <<- e1 /\ s2 <<- e2 . 该分割必须通过计算来定义,而不是从证明中提取适当的分割 H: s1 <<- e1 @ e2 .

    解决此问题的最简单方法是 in_regex 在里面 Type ,以匹配Agda开发的工作方式。这意味着 in\u regex 必须通过计算构建,因此您可以自由匹配。

    Inductive in_regex : string -> regex -> Type

    使用 not 在里面 empty_in_regex_inv 休息,但你可以写 s <<- #0 -> False .

    感谢Ben Sherman指出了这个解决方案!

    也可以保持 in\u regex 在里面 Prop ,但您需要一种单独的匹配正则表达式的计算方法来计算拆分,然后需要一个将此函数与 in\u regex .