2012-11-08 5 views
3

편집Mutualy 재귀 함수와 종료 검사

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. 

나는 그 말을 오류 메시지를 받았습니다 상호 재귀를 사용하고 중첩 된 고정 점을 사용하면 조합하여 검사 종료자를 전달합니다. 다음은 성공적으로 결합 된 코드입니다.

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'을 사용하는 방법을 모른다.

+0

코드 스 니펫에는 선언되지 않은 식별자가 많이 있으며 오류 메시지에 언급 된 'p2'가 포함되어 있지 않습니다. 당신은 정확하게 말한 메시지를 인도하는 모범을 보여줄 수 있습니까? – Virgile

+0

이번에는 코드를 편집하고 테스트하여 오류를 제공합니다. 기다려 주셔서 감사합니다. – Quyen

답변

4

상호 회귀는 단일 유도 성 데이터 유형 또는 단일 유도 성 정의에 함께 정의 된 다른 유도 성 데이터 유형 중 하나와 함께 사용되어야합니다. 귀하의 경우, dpProof 이전에 이미 정의 된 다형성 데이터 유형 prod (쌍 유형), 목록 및 옵션을 사용하고 있습니다.

중첩 고정 점 접근 방식에는 제한이 없습니다.