코크의 정리 증명


10

배경

본인은 Coq의 도움을 스스로 배우고 있습니다. 지금까지 나는 Yves Bertot의 Coq를 서둘러 읽었습니다 . 이제 저의 목표는 자연수에 관한 몇 가지 기본 결과를 증명하고 소위 나누기 알고리즘으로 마무리하는 것입니다. 그러나 그 목표를 향한 길에 약간의 어려움이 있습니다. 특히, 다음 두 가지 결과는 처음에 상상했던 것보다 Coq에서 증명하기가 더 어렵다는 것을 증명했습니다. 실제로, 나는 많은 결실없는 시도 끝에, 손으로 그들을 증명하기 위해 의지했습니다 (아래 그림 참조). 이것은 분명히 Coq를보다 능숙하게 처리하는 데 도움이되지 않습니다. 이것이 제가이 포럼을 찾는 이유입니다. 내 희망은이 사이트에 누군가가 수와 있다는 것이다 기꺼이아래의 증명을 Coq가 수락하는 증명으로 변환하는 데 도움이됩니다. 모든 도움을 진심으로 감사합니다!

정리 A

모든 x,yN

x<S(y)x<yI(N,x,y)
증명 :

라고 가정하십시오 . 따라서 이 포함 된 이 있습니다 (Peano 1b 및 삼)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)

로 충분합니다 . 우리는 에 유도함으로써 이것을 증명합니다 . 보려면 이 아닌 ethat 경우 다음 유지 아노의 1A 의해 사실이다. 따라서 입니다. 이제 우리는 증명합니다 : . 이 정의에서 우리는이 경우에도 와 따라서 갖습니다 . 마지막으로 Peano의 다섯 번째 공리는 를 제공하고 우리는 얻습니다 . 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

만약 다음 정의함으로써, 그리고 만약 다음 또한, 정의에 의해. 만약 라면 transitivity와 reflexivity에 의해 모순되는 가 있습니다. 결과적으로, 진술 중 하나만 사실입니다.x<y¬I(N,x,y)x>y¬I(N,x,y)x>y y>xI(N,x,y)

우리는 고정하고 유도합니다 . 경우 우리가 모두 베이스 케이스 증명한다. 다음으로 정리가 가지고 있다고 가정하자 . 이제 우리는 대한 정리를 증명하고 싶습니다 . 대한 삼분법에서 및 세 가지 경우가 있습니다 . 경우 다음 명확하게 . 만약 , 다음 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.

Lemma less_lem (xy : N) : 적은 x (성공)-> 또는 (작은 xy) (IN xy).

정리 Ntrichotomy : (전체 xy : N 또는 (xy 미만) (또는 (IN xy) (less 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 의 초기 장을 살펴볼 수 있습니다 . 책의 끝 부분에서 ...
Luke Mathieson

... 프로그램 등을 확인하는 것입니다. 시작은 Coq에 대한 아주 좋은 소개이며 연습과 예제로 얻은 것과 같은 이론을 가지고 있습니다. 무료이며 실제로는 모두 Coq 스크립트로 작성되었으므로 연습하면서 읽고 읽을 때 컴파일 할 수 있습니다. 여기서하는 일을 위해 Basics, Induction, Prop 및 Logic 장에 흥미로운 부분과 조각이 있으며 그 사이의 비트에 대한 종속성이있을 수 있습니다.
Luke Mathieson

1
또 다른 참고 사항 인 Thm P5 (유도 원리)는 Coq에 더 강력한 형태 (구조적 유도)로 내장되어 있으므로 명시 적으로 공리로 취할 필요가 없습니다.
Luke Mathieson

지금까지 작성한 Coq 코드를 게시했습니다.
user11942

답변:


7

Coq는 종이 증명보다 조금 더 잔인합니다. 종이 증명에 "그리고 우리가 끝났다"또는 "명확하게"쓸 때 Coq를 설득하기 위해해야 ​​할 일이 훨씬 더 많습니다.

이제 코드를 같은 정신으로 유지하려고 노력하면서 코드를 약간 정리했습니다. 여기에서 찾을 수 있습니다 .

몇 가지 언급 :

  1. 나는 내장 된 데이터 유형과 정의를 사용하여 의도를 해치지 않을 것이라고 생각했습니다. 내가 대신 평등을 사용 identity하고 내장 된 "보다 작음"관계를 사용했다면 많은 정리가 알려진 이론 데이터베이스에 있기 때문에 증명이 훨씬 쉬웠을 것입니다.

    auto with arith.
    
  2. 나는 당신이 아마 모르는 몇 가지 전술을 사용했지만, "실제"Coq 수퍼 유저는 훨씬 더 강력한 전술을 가지고 있고 작업을 단순화하기 위해 자신의 전술을 썼을 것입니다. 필자는 항상 강력한 방법으로 전술을 사용하는 방법을 배우는 장소로 CPDT 를 권장 합니다.

  3. 나는 표기법과 태빙을 사용하여 가독성을 높이고 매칭 및 induction전술 과 같은 내장 구조를 사용하여 쉽게 증명하고 리팩터링했습니다. 특히, 당신의 정의 less는 다루기가 어려웠습니다.

    x, m+(x+1)=n
    동등한 (그러나 사용하기 쉬운)
    x, (x+m)+1=n
    이런 종류의 "정의 조정" 은 공식적인 증거에서 많이 발생합니다 .
  4. 여기서 이러한 종류의 질문에 대한 답변을 얻을 수 있지만 이러한 종류의 질문에 답변하기 위해 Coq-Club에 작품을 제출하는 것이 좋습니다 .


1
좋은 답변 코디! 도움이 필요한 다른 사람들을 기꺼이 도와주는 관대 한 사람들이 있다는 것을 알게되어 기쁩니다. 진심으로 감사합니다! CPDT와 Coq-Club을 가장 잘 살펴볼 것입니다. Coq에서 나누기 알고리즘을 증명하기 위해 계속 노력하면서 가까운 미래에 가장 필요할 것입니다.
user11942

감사! 이것을 "유클리드 디비전"이라고하며 일부 라이브러리에는 이미 정수를 통해 존재합니다.
cody

내가 본 Coq 라이브러리에는 정의, 정리 및 정리가 상당히 잘 갖춰져 있습니다. 나는 내일 가장 최근에 유클리드 디비전 알고리즘에 대한 나의 접근 방식을 질문으로 게시하려고 노력할 것이다.
user11942

4

Cody의 답변은 훌륭하며 Coq로 증거를 번역하는 것에 대한 귀하의 질문을 이행합니다. 이를 보완하기 위해 동일한 결과를 추가하고 싶었지만 다른 경로를 사용하여 입증했습니다. 주로 Coq의 일부 비트로 설명하고 약간의 추가 작업으로 구문 적으로 입증 할 수있는 것을 보여주었습니다. 그러나 이것이 가장 짧은 경로라는 주장은 아닙니다. 단지 다른 경로입니다. 증명에는 하나의 추가 도우미 보조 정리 만 포함되며 기본 정의에만 의존하며 추가, 곱셈 또는 그 속성 또는 기능 확장 성을 소개하지 않으며 유일한 Peano 공리는 <= b->의 간단한 형식입니다. 헬퍼 보조기 (c = 1 만 해당)의 a + c <= b + c 및 구조적 유도 (어쨌든 무료로 유도 형이 제공됨).

차이가 없다고 생각한 Cody와 마찬가지로 미리 정의 된 유형 등을 사용 했으므로 증명 전에 그에 대해 설명합니다.

  • 나는 자연수에 내장 nat 유형을 사용했는데, 이는 당신과 동일한 정의를 가지고 있습니다 (정확한 이름까지).

유도 nat : 설정 : = O : nat | S : nat-> nat

  • 나는 내장형 le과 lt를 각각 작거나 같고 작게 사용했으며, 가독성을 위해 표기법이 "<="과 "<"가 있습니다. 그들은 정의됩니다 :

귀납적 le : nat-> nat-> Prop : =
| le_n : forall n, le nn
| le_S : 모든 nm, (le nm)-> (le n (S m)).

정의 lt (nm : nat) : = le (S n) m.

  • 내장 된 eq (약식 "=")는 구문 상 동등하며 "I"와 동일하게 작동합니다. 하나의 생성자 만 있으면 그 자체가 같습니다. 대칭 및 전이 속성은 쉽게 증명할 수 있지만이 경우에는 필요하지 않습니다. 아래의 eq 정의에는 표기법이 내장되어 있습니다.

유도 방정식 (A : Type) (x : A) : A-> Prop : = eq_refl : x = x

  • 마지막으로, 제안자 또는 (백 슬래시 슬래시 인 백 슬래시 (\))를 사용했습니다. 기본적으로 왼쪽 인수에 대한 증거가 있거나 오른쪽 인수에 대한 증거가 있습니다. Coq에는 또한 왼쪽과 오른쪽의 약식 전술이 있습니다. 이는 각각 "apply or_introl"과 "apply or_intror"을 의미합니다.

유도 성 또는 (AB : Prop) : Prop : =
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.