Coqにnからn + 2への帰納法を実行するように指示できますか?



Can I Tell Coq Do Induction From N N 2



解決:

そのとおり!この答えからの帰納法の原理を使用してみましょう。

CoqからインポートArithが必要です。補題pair_induction(P:nat-> Prop):P 0-> P 1->(forall n、P n-> P(S n)-> P(S(S n)))-> forall n、P n 。証拠。イントロH0H1 Hstepn。簡単に十分(P n /  P(S n))。誘導n;直感。 Qed。

これで、次のような新しい原則を使用できます(すべてがコンパイルされるように、非標準関数を対応するstdlibに切り替えました)。



定理evenb_double_k:forall n、Nat.even n = true->存在するk、n = Nat.doublek。証拠。イントロnEv。誘導nas [| | n IHn _] pair_inductionを使用します。 (*楽しみを損なわないように、残りの証明は削除されました*)Qed。 

と呼ばれる戦術があります修理。クールなハックだと思うので、ハイレベルで何が起こっているのかを説明しようと思いますが、注意してください修正は両刃の剣であり、一般的に使用することはお勧めできません。それはCoqの非常に低レベルの詳細に依存し、証明を非常に脆弱にし、それらが壊れるとエラーメッセージを理解するのが困難になります。

fooiを修正します。fooは新しい変数であり、iは整数であり、少なくともi引数(たとえば、forall n、evenb n = true-> ...には2つあります:nとの証明evenb n = true)、および あなたが証明しようとしている目標を想定しています 、その新しい仮説に名前を付けるfoo。 (はい、あなたはその権利を読みます。)



定理evenb_double_k:forall n、evenb n = true->存在k、n = doublek。証拠。自己1を修正します。(* 1サブゴール(ID 17)自己:forall n:nat、evenb n = true->存在k:nat、n = double k ================ ============ forall n:nat、evenb n = true->存在するk:nat、n = double k *)

もちろん、落とし穴があります。 その仮説は、の適切なサブタームに適用する必要がありますNS (これは 初め 目標の引数、それはの数パラメータが何であるかです自己を修正する1は、最初の引数が 議論の減少 )。の適切なサブタームは何ですかNS?破壊するだけで得られる価値ですn、少なくとも1回。

それでも仮説を適用することにした場合、Coqはすぐには文句を言わないことに注意してください直接自己(nはそれ自体の適切なサブタームではありません)。 Coqは、「サブターム」要件のみをチェックします。Qed。 編集 :コマンドを使用することもできますこれをチェックするためにいつでも警備します。

自己を適用します。 (*は問題ないようで、すべての目標が達成されました。*)Qed。 (* エラー! *)

あなたはおおよそ想像することができます強力な誘導の形式として修正します。ここで、誘導仮説(self)は、直前の用語だけでなく、現在の用語よりも小さいすべての用語に与えられます。ただし、この「サブターム」関係は、実際には次のステートメントには表示されません。自己。 (この特異性が低レベルで危険な戦術を修正します。)



あなたが一般的にしたい修正減少する引数を破棄します。これはどこです修正により、証明は次の構造に従うことができます。偶数b。以下では、すぐに再び破壊しますSケース。したがって、次の3つのケースがあります。n = O、n = S O、n = S(S n ')一部の場合n ':nat。

最初のケースは簡単で、2番目のケースは空虚で、3番目のケースは「帰納法の仮説」が必要な場合です。で自己NS'。

証拠。自己修正1.イントロn。 nを[|として破壊する[| NS']]。 -存在します0;再帰性。 -差別する。 -単純化。イントロH.Hに自分自身を適用します。Hを[kHk]として破壊します。存在します(S k)。 Hkを書き直します。再帰性。 Qed。

そこにある推論のいくつかはかなり一般的であり、それはカスタムに引き出すことができます 偶数の帰納法nats 、具体的には別です定理。

定理even_ind:forall(P:nat-> Prop)、PO->(forall n、evenb n = true-> P n-> P(S(S n)))-> forall n、evenb n = true-> Pn。

の標準的な帰納法の原理と比較してくださいnatは、実際には定理でもあり、nat_ind。これは何ですか誘導戦術は内部で使用します。

nat_indについて。 (* nat_ind:forall P:nat-> Prop、P 0->(forall n:nat、P n-> P(S n))-> forall n:nat、P n *)

の帰納法nat_indはnからS n、一方、の帰納法even_indはから行きますnからS(S n)であり、私たちの数は偶数であるという追加の仮説があります。

の証拠Even_indは、次のような構造に従います。evenb_double_kですが、すべての述語を一般化するため、より抽象的です。P on夜。

証拠。イントロPHOHSS。自己修正1.イントロn。 nを[|として破壊する[| NS']]。 -イントロ; HOを適用します。 -差別する。 -イントロH.HSSを適用します。 + Hを適用します。+自己を適用します。 H.Qedを適用します。

ここでの別のアプローチは、使用しないことです完全に修正します(回避する必要があるため)が、維持します代替案を証明するためのプリミティブとしての誘導even_indの原則。それは大丈夫ですnatですが、一部の複雑な帰納法の場合、デフォルトの帰納法の原則は弱すぎて手書きです修正が唯一の方法です。

最後に、evenb_double_kでは、新しい誘導原理を次のように使用できます。ではなく、even_indを適用します修正または誘導。ここでは、2つの意味のあるケースのみを取得します。OとS(S n ')ここでn 'は偶数です。

定理evenb_double_k ':forall n、evenb n = true->存在するk、n = doublek。証拠。 even_indを適用します。 -存在します0。再帰性。 -イントロnH [kHk]。存在します(S k)。 Hkを書き直します。再帰性。 Qed。

この回答で使用される定義:

不動点evenbn:= nを|と一致させるS(S n ')=>偶数b n' | S O => false | O =>真の終わり。不動点doublek:= kを|と一致させるO => O | S k '=> S(S(double k'))終了。