Coq의 두 인수에 대해 유도 적으로 함수를 정의하는 방법은 무엇입니까?


14

아래에 주어진 재귀 함수가 종료된다는 것을 Coq에게 어떻게 확신시킬 수 있습니까? 이 함수는 두 개의 유도 인수를 취합니다. 직관적으로, 두 인수 중 하나가 분해되어 재귀가 종료됩니다.

특히이 함수는 두 개의 트리를 입력으로 사용합니다.

Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.

나무에서 나는 다음과 같은 스타일의 유도를 좋아합니다.

Inductive TreePair :=
| TipTip : TreePair
| TipBin : Tree -> Tree -> TreePair
| BinTip : Tree -> Tree -> TreePair
| BinBin : TreePair -> TreePair -> TreePair.

Fixpoint pair (l r: Tree): TreePair :=
  match l with
    | Tip =>
      match r with
        | Tip => TipTip
        | Bin rl rr => TipBin rl rr
      end
    | Bin ll lr =>
      match r with
        | Tip => BinTip ll lr
        | Bin rl rr => BinBin (pair l rl) (pair lr r)
      end
  end.

TreePair의 정의는 허용되지만 함수 쌍의 정의는 오류 메시지를 생성합니다.

Error: Cannot guess decreasing argument of fix.

그래서 나는 Coq에게 종결을 확신시키는 방법에 관심이 있습니다.


1
카레를 사용하지 않고 l과 r을 제품으로 함께 전달해 보셨습니까? 도움이 될 것입니다.
당 Vognsen

1
어떤 사람들 은이 질문이 프로그래밍에 관한 것이며이 웹 사이트의 범위를 벗어난 것이라고 생각합니다. 동의하는지 확실하지 않지만 잠재적 문제에 대해 알고 싶을 수 있습니다. 누군가가 적절성에 대해 할 말이 있으면 내가 연결 한 메타 토론에 글을 쓰십시오.
이토 쓰요시

3
이 질문은 실제로 작업 pair이 잘 정의 되도록 데이터 구조에 단조 감소 범위를 지정하는 것에 관한 것입니다 . Coq는 단순히 차량입니다.
Dave Clarke

답변:


12

Coq의 고정 점 정의에서는 유도 호출이 구조적으로 더 작은 인수를 받아야합니다. 깊은 고정 점 구조는 단일 인수를 취합니다. 두 개의 인수에 대한 재귀 정의의 기본 개념이 없습니다. 다행히 Coq의 구조적으로 작은 정의 에는 고차 유형이 포함되며 이는 매우 강력합니다.

두 개의 인수 고정 점 정의는 간단한 패턴을 따릅니다. 첫 번째 인수는 작아 지거나 첫 번째 인수는 동일하게 유지되고 두 번째 인수는 작아집니다. 이 상당히 일반적인 패턴은 간단한 수정 프로그램으로 처리 할 수 ​​있습니다.

Fixpoint pair l := fix pair1 (r : Tree) :=
  match l with
    | Tip => match r with
              | Tip => TipTip
              | Bin rl rr => TipBin rl rr
            end
    | Bin ll lr => match r with
                    | Tip => BinTip ll lr
                    | Bin rl rr => BinBin (pair1 rl) (pair lr r)
                   end
  end.

더 복잡한 경우 또는 취향이 그런 식으로 실행되는 경우 수학 과정에서 가르치는 방식에 더 가까운 재귀를 사용하여 단계 계산에서 고정 점을 작성하고 종종 정수 측정 값을 사용하여 별도의 잘 정립 된 인수를 작성할 있습니다. Programvernacular를 사용하여 별도의 종료를 사용하여 전체가 아닌 언어로 정의를 더 고전적인 프로그램처럼 보이게 만들 수도 있습니다 .


이제 이것이 내가 요청한 것임을 알고 있습니다!
yhirai

fix pair1 r최상위 레벨의 두 번째 분기로 밀면 어떤 차이가 match있습니까 (물론 함수 유형을 적절하게 반환하도록 첫 번째 분기를 조정하십시오)?
일 11

@ plmday : 양방향으로 작동합니다. 그것들은 확장성에 대한 합리적인 정의에 대해 확장 적으로 동등하며, 더 중요한 것은 모두 형식이 잘 지정되어 있습니다 (확장 재 작성은 관련 공분산 (양성) 속성을 변경하지 않습니다).
Gilles 'SO- 악마 그만해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.