これは、(+)
の定義に関連しています。あなたは表記(+)
が機能Nat.add
に対応して、Print Nat.add
を呼び出すと、あなたを与えることを見て、(View > Display notations
中だというCoqIDEで)表記をオフにすることで、(+)
年代根本的な定義にアクセスすることができます
Nat.add =
fix add (n m : nat) {struct n} : nat :=
match n with
| O => m
| S p => S (add p m)
end
あなたはその(+)
を見ることができますn + 1
が変数n
である最初の引数でマッチングすることによって定義されます。 n
はO
またはS
(「コンストラクタヘッダー」ではない)で始まらないため、match
は縮小できません。つまり、あなたは、2つのものが同じ普通の形(それはreflexivity
が主張しているものです)を計算すると言って、平等を証明することはできません。
代わりに、n
が等しいかどうかをcoqに説明する必要があります。 の再帰的なの場合の古典的な動きはNat.add
のような関数で、induction
の証明を続けることです。そして、それは確かにここで仕事をするん:あなたが行うことができます
Lemma s_is_plus_one : forall n:nat, S n = n + 1.
Proof.
intros. induction n.
- reflexivity.
- simpl. rewrite <- IHn. reflexivity.
Qed.
もう一つは、一方1
は、コンストラクタの頭あなたが1 + n
ではなくn + 1
があった場合にのみ、マッチが発火することを意味していることに注意してくださいです。
Lemma s_is_plus_one : forall n:nat, S n = n + 1.
Proof.
intros.
rewrite (Nat.add_comm n 1).
reflexivity.
Qed.
最後の選択肢:SearchAbout (?n + 1)
を使用して、私たちが話しすべての定理を見つけることができます誰かがすでにNat.add
がそう私達はちょうどそれを使用することができます可換であることを証明した標準ライブラリであるためまあ、我々は幸運ですいくつかの変数?n
のパターン?n + 1
(ここでは疑問符が重要です)。最初の結果は本当に関連補題です:
Nat.add_1_r: forall n : nat, n + 1 = S n
アメージング、私は本当に良くSearchAboutを知って取得する必要があります!ありがとうございました! – Langston