Coqの定理証明


10

バックグラウンド

私はCoqだけで支援を学んでいます。これまでのところ、急いでイヴベルトットのコックを読み終えました。現在、私の目標は、いわゆる除算アルゴリズムで終わる、自然数に関するいくつかの基本的な結果を証明することです。しかし、私はその目標に向かう途中でいくつかの後退に遭遇しました。特に、次の2つの結果は、私が最初に想像したよりもCoqで証明するのが難しいことを示しています(しゃれた意図)。実際、多くの実りのない試みの後、私はそれらを手動で証明する手段を講じました(以下に示すように)。これは明らかに、私がCoqの処理に習熟するのに役立つわけではありません。これが私がこのフォーラムを利用する理由です。私の希望は、このサイトの誰かが有能で喜んでいることです下記の証明をCoqが受け入れる証明に変換するのに役立ちます。すべての助けに心から感謝しています!

定理A

すべてのための証明:x,yN

x<S(y)x<yI(N,x,y)

と仮定します。したがって、と ため、(Peano 1bおよび3)x<S(y)zN

(*)I(N,x+S(z),S(y))
I(N,x+z,y)

述語を定義し

Q(u):=(I(N,x+u,y)x<yI(N,x,y)

を表示するだけで十分です。これを帰納法で証明します。を確認するには、が成立する場合、Peano 1aはが真であることを確認します。したがって、です。ここで、を証明し:ます。この定義から、この場合も、したがってられます。最後に、ペアノの第五公理が与えるとのことで私たちが得る。 Q(z)zQ(0)I(N,x+0,y)I(N,x,y)x<yI(n,x,y)Q(S(v))I(N,x+S(v),y)x<yx<yI(N,x,y)Q(z)()x<yI(N,x,y)

()

定理B

すべての証明:x,yN

x<yI(N,x,y)y<x

もし次いで定義することによって、及び場合次いでも定義することによって。もし次いで推移と反射性によって、我々は矛盾です。したがって、真実なのは1つだけです。x<y¬I(N,x,y)x>y¬I(N,x,y)x>y y>xI(N,x,y)

我々は維持上に固定し、入会を。場合我々は全てに対して基本ケースを証明します。次に、定理がについて成立するとします。ここで、定理を証明したいと思います。のトリコトミーから、と 3つのケースがあり。もし、次いで明確。もし、次いで、(ASのためのすべて)。最後に、yxI(N,0,y)0<yI(N,0,y)yxS(x)xx<y,I(N,x,y)x>yx>yS(x)>yI(N,x,y)S(x)>yS(x)>xxNx<y次に、定理Aによってまたはが得られ、どちらの場合も完了です。 S(x)<yI(N,S(x),y)

()

証明したい定理はCoqで次のように表すことができます。

補題less_lem(xy:N):less x(succ y)->または(less xy)(IN xy)。

定理Ntrichotomy:(すべてのxy:N、または(より少ないxy)(または(IN xy)(より少ないyx)))。

有用な結果

ここで、私が定義した結果のいくつかを収集し、この時点までに証明しました。これらは、私が上記で言及したものです。* これは、これまでに作成したコードです。ほとんどが定義で構成されています。*

(* Sigma types *)


Inductive Sigma (A:Set)(B:A -> Set) :Set :=
  Spair: forall a:A, forall b : B a,Sigma A B.

Definition E (A:Set)(B:A -> Set)
  (C: Sigma A B -> Set)
  (c: Sigma A B)
  (d: (forall x:A, forall y:B x, 
      C (Spair A B x y))): C c :=

match c as c0 return (C c0) with
| Spair a b => d a b
end. 


(* Binary sum type *)

Inductive sum' (A B:Set):Set := 
inl': A -> sum' A B | inr': B -> sum' A B.

Print sum'_rect.

Definition D (A B : Set)(C: sum' A B -> Set)
(c: sum' A B)
(d: (forall x:A, C (inl' A B x)))
(e: (forall y:B, C (inr' A B y))): C c :=

match c as c0 return C c0 with
| inl' x => d x
| inr' y => e y
end.

(* Three useful finite sets *)

Inductive N_0: Set :=.

Definition R_0
  (C:N_0 -> Set)
  (c: N_0): C c :=
match c as c0 return (C c0) with
end.

Inductive N_1: Set := zero_1:N_1.

Definition R_1 
  (C:N_1 -> Set)
  (c: N_1)
  (d_zero: C zero_1): C c :=
match c as c0 return (C c0) with
  | zero_1 => d_zero
end.

Inductive N_2: Set := zero_2:N_2 | one_2:N_2.

Definition R_2 
  (C:N_2 -> Set)
  (c: N_2)
  (d_zero: C zero_2)
  (d_one: C one_2): C c :=
match c as c0 return (C c0) with
  | zero_2 => d_zero
  | one_2  => d_one
end.


(* Natural numbers *)

Inductive N:Set :=
zero: N | succ : N -> N.

Print N. 

Print N_rect.

Definition R 
  (C:N -> Set)
  (d: C zero)
  (e: (forall x:N, C x -> C (succ x))):
  (forall n:N, C n) :=
fix F (n: N): C n :=
  match n as n0 return (C n0) with
  | zero => d
  | succ n0 => e n0 (F n0)
  end.

(* Boolean to truth-value converter *)

Definition Tr (c:N_2) : Set :=
match c as c0 with
  | zero_2 => N_0
  | one_2 => N_1
end.

(* Identity type *)

Inductive I (A: Set)(x: A) : A -> Set :=
r :  I A x x.

Print I_rect.

Theorem J 
  (A:Set)
  (C: (forall x y:A, 
              forall z: I A x y, Set))
  (d: (forall x:A, C x x (r A x)))
  (a:A)(b:A)(c:I A a b): C a b c.
induction c.
apply d.
Defined.

(* functions are extensional wrt
  identity types *)

Theorem I_I_extensionality (A B: Set)(f: A -> B):
(forall x y:A, I A x y -> I B (f x) (f y)).
Proof.
intros x y P.
induction P.
apply r.
Defined.


(* addition *)

Definition add (m n:N) : N 
 := R (fun z=> N) m (fun x y => succ y) n.

(* multiplication *)

Definition mul (m n:N) : N 
 := R (fun z=> N) zero (fun x y => add y m) n.


(* Axioms of Peano verified *)

Theorem P1a: (forall x: N, I N (add x zero) x).
intro x.
(* force use of definitional equality
  by applying reflexivity *)
apply r.
Defined.


Theorem P1b: (forall x y: N, 
I N (add x (succ y)) (succ (add x y))).
intros.
apply r.
Defined.


Theorem P2a: (forall x: N, I N (mul x zero) zero).
intros.
apply r.
Defined.


Theorem P2b: (forall x y: N, 
I N (mul x (succ y)) (add (mul x y) x)).
intros.
apply r.
Defined.

Definition pd (n: N): N :=
R (fun _=> N) zero (fun x y=> x) n.

(* alternatively
Definition pd (x: N): N :=
match x as x0 with
  | zero => zero
  | succ n0 => n0
end.
*)

Theorem P3: (forall x y:N, 
I N (succ x) (succ y) -> I N x y).
intros x y p.
apply (I_I_extensionality N N pd (succ x) (succ y)).
apply p.
Defined.

Definition not (A:Set): Set:= (A -> N_0).

Definition isnonzero (n: N): N_2:=
R (fun _ => N_2) zero_2 (fun x y => one_2) n.


Theorem P4 : (forall x:N, 
not (I N (succ x) zero)).
intro x.
intro p.

apply (J N (fun x y z => 
    Tr (isnonzero x) -> Tr (isnonzero y))
    (fun x => (fun t => t)) (succ x) zero)
.
apply p.
simpl.
apply zero_1.
Defined.

Theorem P5 (P:N -> Set):
P zero -> (forall x:N, P x -> P (succ x))
   -> (forall x:N, P x).
intros base step n.
apply R.
apply base.
apply step.
Defined.

(* I(A,-,-) is an equivalence relation *)

Lemma Ireflexive (A:Set): (forall x:A, I A x x).
intro x.
apply r.
Defined.

Lemma Isymmetric (A:Set): (forall x y:A, I A x y -> I A y x).
intros x y P.
induction P.
apply r.
Defined.

Lemma Itransitive (A:Set): 
(forall x y z:A, I A x y -> I A y z -> I A x z).
intros x y z P Q.
induction P.
assumption.
Defined.


Lemma succ_cong : (forall m n:N, I N m n -> I N (succ m) (succ n)).
intros m n H.
induction H.
apply r.
Defined.

Lemma zeroadd: (forall n:N, I N (add zero n) n).
intro n.
induction n.
simpl.
apply r.
apply succ_cong.
auto.

Defined.

Lemma succadd: (forall m n:N, I N (add (succ m) n) (succ (add m n))).
intros.
induction n.
simpl.
apply r.
simpl.
apply succ_cong.
auto.

Defined.

Lemma commutative_add: (forall m n:N, I N (add m n) (add n m)).
intros n m; elim n.
apply zeroadd.
intros y H; elim (succadd m y).
simpl.
rewrite succadd.
apply succ_cong.
assumption.


Defined.

Lemma associative_add: (forall m n k:N, 
I N (add (add m n) k) (add m (add n k))).
intros m n k.
induction k.
simpl.
apply Ireflexive.
simpl.
apply succ_cong.
assumption.
Defined.

Definition or (A B : Set):= sum' A B.


Definition less (m n: N) :=
 Sigma N (fun z => I N (add m (succ z)) n).



Lemma less_lem (x y:N) : 
less x (succ y) -> or (less x y) (I N x y).
intro.
destruct H.
right.

(* Here is where I'm working right now *)

Defined.


Theorem Ntrichotomy: (forall x y:N, 
or (less x y) (or (I N x y) (less y x))).

3
どれだけの距離があるかを理解するには、これまでにCoqコードを投稿しておくと、コードを読み込んで、提案されていることが自分の定義で機能するかどうかを確認できます。
Gilles「SO-邪悪なことをやめなさい」

1
いくつかのコメントと明確化のための質問:-I(N、x、y)の代わりに構文の等価性(Coqでは "=")を使用するだけで十分でしょうか?「または」を定義した方法を使用する理由はありますか?Coq(まあ、Coqの基本ライブラリ)には、証明の特定の優れた側面を促進する論理論理和を表現する方法があります。同様に、より使いやすい「より少ない」を定義する方法があります。この目的のために、Software Foundationsの初期の章を確認することをお勧めします。本の終わりに...
ルーク・マティソン

...プログラムの検証などに関するものであり、最初はCoqの非常に優れた紹介であり、演習や例として入手したような定理があります。これは無料で、実際にはすべてCoqスクリプトとして記述されているため、演習を行って読みながらコンパイルすることができます。ここで何をしているのかについては、「基本」、「誘導」、「プロップ」、「ロジック」の各章に興味深い部分があり、その間のビットからの依存関係もあるでしょう。
ルークマシソン

1
別の注意として、Thm P5(帰納的原理)はより強力な形式(構造的帰納法)でCoqに組み込まれているため、これを公理として明示的に取る必要はありません。
ルークマシソン

これまでに作成したCoqコードを投稿しました。
user11942 2013

回答:


7

Coqは紙の証拠よりも少し残酷です。紙の証拠に「これで完了」または「明確に」と書いた場合、多くの場合、Coqを説得するためにやるべきことはたくさんあります。

今、私はあなたのコードを少しクリーンアップしましたが、同じ精神でそれを維持しようとしました。あなたはここでそれを見つけることができます。

いくつかの注意:

  1. 私は組み込みのデータ型と定義を使用しましたが、あなたの意図を損なうことはないと思いました。代わりに組み込みの等式を使用identityし、組み込みの「より小」の関係を使用した場合、補題の多くは既知の定理のデータベースにあり、

    auto with arith.
    
  2. 私はあなたがおそらく気付いていないいくつかの戦術を使用しましたが、「実際の」Coqスーパーユーザーは手元にはるかに強力な戦術を持ち、仕事を簡素化するために彼女自身の戦術を書きました。強力な方法で戦術を使用する方法を学ぶ場所として、常にCPDTをお勧めします。

  3. inductionless

    x, m+(x+1)=n
    x, (x+m)+1=n
  4. これらの種類の質問への回答はここで得られますが、これらの種類の質問に答えるという明確な目的で作成されたCoq-Clubに作品を提出することを強くお勧めします。


1
素晴らしい答えコーディ!あなたのような寛大な人々が、困っている人を助けようとすることを知っているのは素晴らしいことです。心より感謝いたします!私は間違いなくCPDTとCoq-Clubを見ていきます。Coqでの除算アルゴリズムの証明に向けて引き続き努力しているので、どちらも近い将来おそらく必要になるでしょう。
user11942 2013

ありがとう!これは「ユークリッド除算」と呼ばれることが多く、すでに一部のライブラリに存在していることに注意してください(ただし整数で)
cody

私が驚くことではありません。私が調べたCoqライブラリーには、定義、補題、定理が非常に豊富にあります。ユークリッド除算アルゴリズムへの私のアプローチを、遅くとも明日までに質問として投稿するように努めます。
user11942

4

コーディの答えは素晴らしく、あなたの証明をCoqに変換することについてのあなたの質問を満たします。それを補完するために、同じ結果を追加したいと思いますが、主にCoqのいくつかのビットの図として、別のルートを使用して証明し、ほとんど追加の作業をほとんど行わずに構文的に証明できることを示しました。ただし、これは最短ルートであり、別のルートであるという主張ではありません。証明には、追加のヘルパーレンマが1つだけ含まれ、基本的な定義のみに依存します。加算、乗算、またはそれらのプロパティ、または機能の拡張性については紹介しません。また、ペアノの公理は、<= b->の単純な形式のみです。ヘルパーレンマ(c = 1の場合のみ)のa + c <= b + cと構造的誘導。

Codyのように、違いはないと思ったので、定義済みの型などを使用したので、証明の前に、それらについて説明します。

  • 私はあなたと同じ定義を持つ(正確な命名まで)自然数のために組み込みのnatタイプを使用しました:

誘導nat:セット:= O:nat | S:nat-> nat

  • 私は組み込みのleとltをそれぞれより小さいか等しいとより小さいために使用しました。それらは定義されています:

誘導ファイル:nat-> nat-> Prop:=
| le_n:forall n、le nn
| le_S:forall nm、(le nm)->(le n(S m))。

そして

定義lt(nm:nat):= le(S n)m。

  • 組み込みのeq(省略形「=」)は構文上の同等性であり、「I」と同じように機能します。コンストラクターは、何かがそれ自体と等しいことを示すだけです。対称的で推移的なプロパティはそこから簡単に証明できますが、この場合は必要ありません。以下のeqの定義には、表記法が組み込まれています。

誘導式(A:タイプ)(x:A):A-> Prop:= eq_refl:x = x

  • 最後に、私は2つのコンストラクターを備えた命題または(省略形「\ /」-バックスラッシュフォワードスラッシュ)を使用しました。Coqには、「apply or_introl」と「apply or_intror」をそれぞれ意味する、左と右の略式の戦術もあります。

帰納的or(AB:プロップ):プロップ:=
or_introl:A-> A / B | or_intror:B-> A / B

以下は私の証明です。原則として、マークアップが邪魔にならない場合は、これを切り取ってCoq .vファイルに貼り付けるだけで機能します。興味深い部分を指摘するためにコメントを含めましたが、それらは(* *)区切り文字に含まれているため、削除する必要はありません。

Theorem lt_or_eq: forall (n m : nat),
  n < S m -> n < m \/ n = m.
Proof.
(*
  This proof is just a case analysis on n and m, whether they're zero or
  a successor of something.
*)
destruct n as [|n']; destruct m as [|m']. 

(*n = 0, m = 0*)
intros.
  right. reflexivity.

(*n = 0, m = S m'*)
intros H.
  inversion H.
  inversion H1.
  left. unfold lt. constructor.
  (*The constructor tactic tries to match the goal to a constructor
    that's in the environment.*) 
  left. unfold lt. constructor. assumption.
  (*Assumption tries to match the goal to something that's in the
    current context*)

(*n = S n', m = 0
  This case is false, so we can invert our way out of it.*)
intros.
  inversion H. inversion H1.

(*n = S n', m = S m'*)
intros.
  inversion H.
    right. reflexivity.
    left. unfold lt. assumption.
Qed.


(*
  The following lemma with be useful in the proof of the trichotomy theorem,
  it's pretty obviously true, and easy to prove. The interesting part for
  anyone relatively new to Coq is that the induction is done on the
  hypothesis "a <= b", rather than on either a or b.
*)
Lemma a_le_b_implies_Sa_le_Sb: forall a b, a <= b -> S a <= S b.
Proof.
  intros a b Hyp.
  induction Hyp.
  constructor.
  constructor.
  apply IHHyp.
Qed.

(*
  The proof of the trichotomy theorem is a little more involved than the
  last one but again we don't use anything particularly tricky. 
  Other than the helper lemma above, we don't use anything other than the
  definitions.

  The proof proceeds by induction on n, then induction on m.  My personal
  feeling is that this can probably be shortened.  
*)
Theorem trich: forall (n m : nat),
  n < m \/ n = m \/ m < n.
Proof.
  induction n.
    induction m.
      right. left. reflexivity.
        inversion IHm.
          left. unfold lt. constructor. unfold lt in H. assumption.
          inversion H.
          left. unfold lt. subst. constructor.
          inversion H0.     
    induction m.
      assert (n < 0 \/ n = 0 \/ 0 < n).
      apply IHn.
      inversion H.
      inversion H0.
      inversion H0.
      right. right. subst. unfold lt. constructor.
      right. right. unfold lt. constructor. assumption.
      inversion IHm. unfold lt in H.
      left. unfold lt. constructor. assumption.
      inversion H; subst.
      left. unfold lt. constructor.
      inversion H0.
      right. left. reflexivity.
      right. right. apply lt_or_eq in H0.

      inversion H0.
      apply a_le_b_implies_Sa_le_Sb. assumption.
      subst. unfold lt. apply a_le_b_implies_Sa_le_Sb. assumption.
Qed.

(*
  The following is just to show what can be done with some of the tactics
  The omega tactic implements a Pressburger arithmetic solver, so anything
  with natural numbers, plus, multiplication by constants, and basic logic
  can just be solved. Not very interesting for practicing Coq, but cool to
  know.
*)

Require Import Omega.

Example trich' : forall (n m : nat),
  n < m \/ n = m \/ m < n.
Proof.
  intros.
  omega.
Qed.

別の素晴らしい答え!あなたが私の質問に答えてくれた時間と努力に本当に感謝しています。
user11942 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.