Coqの2つの引数に帰納的に関数を定義する方法は?


14

以下に示す再帰関数が終了することをCoqに納得させるにはどうすればよいですか?この関数は、2つの帰納的引数を取ります。直感的に、どちらかの引数が分解されるため、再帰は終了します。

具体的には、この関数は入力として2つのツリーを取ります。

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

Treesでは、次のスタイルの誘導を行うのが好きです。

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を一緒に渡そうとしましたか?それが助けになるはずです。
ヴォーグセンごと10

1
この質問はプログラミングに関するものであり、このWebサイトの範囲外であると考える人もいます。同意するかどうかはわかりませんが、潜在的な問題について知りたい場合があります。誰かが適切性について何か言いたいことがあるなら、私がリンクしたメタディスカッションに書いてください。
伊藤剛

3
この質問は、操作pairが明確に定義されていることを確認するために、データ構造の単調に減少する境界を指定することに関するものです。Coqは単なる乗り物です。
デイブクラーク

回答:


12

Coqのフィックスポイント定義では、誘導呼び出しが構造的により小さい引数を受け取る必要があります。深く、フィックスポイント構造は単一の引数を取ります。2つの引数に対する再帰的な定義の組み込みの概念はありません。幸いなことに、構造的に小さいという Coqの定義には高次型が含まれており、これは非常に強力です。

2引数のフィックスポイント定義は単純なパターンに従います。最初の引数が小さくなるか、最初の引数が同一のままで2番目の引数が小さくなります。このかなり一般的なパターンは、単純な修正で修正できます。

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.

より複雑なケースでは、あなたの好みは、その方法を実行した場合、または、あなたがステップの計算から不動点を構築し、近いそれは数学の授業で教えられています道に再帰を使用することができ、別のよくfoundedness引数を頻繁に使用して、整数の対策を。また、Program用語を使用して、別の終了を使用して、完全ではない言語の古典的なプログラムのように定義を表示することもできます。


今、私はこれが私が求めたものだと知っています!
yhirai

fix pair1 rトップレベルの2番目のブランチにプッシュすると、違いが生じますmatch(もちろん、最初のブランチを適応させて、それに応じて関数型を返します)?

@plmday:両方とも機能します。これらは、拡張性の合理的な定義に対して拡張的に同等であり、さらに重要なことには、両方とも適切に型付けされています(拡張書き換えは、関連する共分散(陽性)プロパティを変更しません)。
ジル 'SO-悪である停止
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.