gpt4 book ai didi

coq - Coq 中的相互递归函数和终止检查

转载 作者:行者123 更新时间:2023-12-05 01:18:04 26 4
gpt4 key购买 nike

编辑

Require Import Bool List ZArith.
Variable A: Type.
Inductive error :=
| Todo.
Inductive result (A : Type) : Type :=
Ok : A -> result A | Ko : error -> result A.
Variable bool_of_result : result A -> bool.
Variable rules : Type.
Variable boolean : Type.
Variable positiveInteger : Type.
Variable OK: result unit.
Definition dps := rules.
Inductive dpProof :=
| DpProof_depGraphProc : list
(dps * boolean * option (list positiveInteger) * option dpProof) -> dpProof.
Fixpoint dpProof' (R D: rules) (p: dpProof) {struct p}:=
match p with
| DpProof_depGraphProc cs => dpGraphProc R D cs
end
with dpGraphProc (R D: rules ) cs {struct cs} :=
match cs with
| nil => Ko unit Todo
| (_, _, _, op) :: cs' =>
match op with
| None => Ko unit Todo
| Some p2 => dpProof' R D p2
end
end.

我收到一条错误消息说:
对 dpProof 的递归调用的主要参数等于
"p2" instead of "cs'".
Recursive definition is:
"fun (R D : rules)
(cs : list
(dps * boolean * option (list positiveInteger) *
option dpProof)) =>
match cs with
| nil => Ko unit Todo
| (_, _, _, Some p2) :: _ => dpProof' R D p2
| (_, _, _, None) :: _ => OK
end".

如果我不使用相互递归并使用嵌套的固定点,它将合并并通过终止检查器。这是成功组合的代码。
Fixpoint dpProof' (R D: rules) (p: dpProof) {struct p}:=
match p with
| DpProof_depGraphProc cs =>
match cs with
| nil => Ko _ Todo
| (_, _, _, op) :: cs' =>
match op with
| None => Ko unit Todo
| Some p2 => dpProof' R D p2
end
end end.

我想更深入地了解它无法通过终止检查器的原因?是因为他们猜不到参数是递减的吗?有什么方法可以使用相互递归来表达我的函数 dpGraphProc ?

另外我该如何编写函数 dpGraphProc检查整个列表?这里我不知道如何使用参数 cs' .

最佳答案

相互递归将用于单个归纳数据类型或在单个归纳定义中一起定义的不同归纳数据类型。在您的情况下,您使用的是在 dpProof 之前已经定义的多态数据类型 prod(对的类型)、列表和选项。

嵌套固定点方法没有限制。

关于coq - Coq 中的相互递归函数和终止检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13286198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com