Coq中的相互递归功能和终止检查器

Quy*_*yen 4 coq totality

编辑

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.
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,指出:递归调用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".
Run Code Online (Sandbox Code Playgroud)

如果我不使用相互递归并使用嵌套的固定点,它将合并并通过终止检查器。这是成功组合的代码。

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.
Run Code Online (Sandbox Code Playgroud)

我想更深入地了解为什么它不能通过终止检查器?是因为他们无法猜测论点在减少吗?有什么方法可以使用相互递归来表达我的功能dpGraphProc

另外,我该如何编写dpGraphProc检查整个列表的功能?在这里,我不知道如何使用该参数cs'

Yve*_*ves 5

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

嵌套定点方法没有限制。