ทฤษฎีบทพิสูจน์ใน Coq


10

พื้นหลัง

ฉันกำลังเรียนความช่วยเหลือ Coq ด้วยตัวเอง จนถึงตอนนี้ฉันได้อ่านCoqของ Yves Bertot อย่างรวดเร็วแล้ว ตอนนี้เป้าหมายของฉันคือการพิสูจน์ผลลัพธ์พื้นฐานบางอย่างเกี่ยวกับตัวเลขธรรมชาติโดยใช้อัลกอริธึมการหารที่เรียกว่าสุดยอด อย่างไรก็ตามฉันได้พบกับความพ่ายแพ้ระหว่างทางไปสู่เป้าหมายนั้น โดยเฉพาะอย่างยิ่งผลลัพธ์ต่อไปนี้ทั้งสองได้พิสูจน์แล้ว (ปุนตั้งใจ) จะยากที่จะพิสูจน์ใน Coq กว่าที่ฉันคิดในตอนแรก ในความเป็นจริงฉันมีหลังจากพยายามหลายครั้งไร้ผลใช้เพื่อพิสูจน์พวกเขาด้วยมือ (ดังแสดงด้านล่าง) ชัดเจนว่าไม่ได้ช่วยให้ฉันมีความเชี่ยวชาญในการจัดการ Coq มากขึ้น นี่คือเหตุผลที่ฉันหันไปฟอรั่มนี้ ความหวังของฉันคือคนในไซต์นี้สามารถและยินดีเพื่อช่วยฉันแปลข้อพิสูจน์ด้านล่างเป็นหลักฐานที่ Coq ยอมรับ ความช่วยเหลือทั้งหมดได้รับการชื่นชมอย่างจริงใจ!

ทฤษฎีบท

เพื่อทุกสิ่ง x,yN

x<S(y)x<yI(N,x,y)
พิสูจน์:

สมมติ x<S(y). ดังนั้นจึงมีzN กับ

(*)I(N,x+S(z),S(y))
ดังนั้นโดย (Peano 1b และ 3)
I(N,x+z,y)

กำหนดภาคแสดง

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

มันเพียงพอที่จะแสดง Q(z). เราพิสูจน์สิ่งนี้โดยอุปนัยz. เพื่อที่จะได้เห็นQ(0)ไม่ใช่ ethat ถ้า I(N,x+0,y) ถือแล้ว I(N,x,y)เป็นจริงโดย Peano 1a ดังนั้น,x<yI(n,x,y). ตอนนี้เราพิสูจน์แล้วQ(S(v)): สมมติ I(N,x+S(v),y). จากคำนิยามนี้เรามีx<y และดังนั้น x<yI(N,x,y)ในกรณีนี้ ในที่สุดสัจพจน์ที่ห้าของ Peano ก็ให้Q(z) และโดย () เราได้รับ x<yI(N,x,y).

()

ทฤษฎีบทข

เพื่อทุกสิ่ง x,yN

x<yI(N,x,y)y<x
พิสูจน์:

ถ้า x<y แล้วก็ ¬I(N,x,y) ตามคำนิยามและถ้า x>y แล้วก็ ¬I(N,x,y)ตามคำนิยาม ถ้าx>y และ y>x จากนั้นโดยการโอนกลับและการสะท้อนกลับเรามี I(N,x,y)ซึ่งเป็นข้อขัดแย้ง ดังนั้นไม่เกินหนึ่งในงบที่เป็นจริง

เราเก็บ y คงที่และ induct on x. เมื่อไหร่I(N,0,y) เรามี 0<yI(N,0,y) เพื่อทุกสิ่ง yซึ่งพิสูจน์กรณีฐาน ถัดไปสมมติว่าทฤษฎีบทมีไว้สำหรับx; ตอนนี้เราต้องการพิสูจน์ทฤษฎีบทสำหรับS(x). จาก trichotomy สำหรับxมีสามกรณี: x<y,I(N,x,y)และ x>y. ถ้าx>yแล้วชัดเจน S(x)>y. ถ้าI(N,x,y)จากนั้น S(x)>y (เช่น S(x)>x เพื่อทุกสิ่ง xN) ในที่สุดสมมติว่าx<y จากนั้นตามทฤษฎีบท A เรามี S(x)<y หรือ I(N,S(x),y)และในทั้งสองกรณีเราเสร็จแล้ว

()

ทฤษฎีที่ฉันต้องการพิสูจน์สามารถแสดงได้ดังนี้ใน Coq

เล็มม่า less_lem (xy: N): less x (succ y) -> หรือ (less xy) (IN xy)

ทฤษฎีบท Ntrichotomy: (forall xy: N หรือ (less 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 'หยุดความชั่วร้าย'

1
ความคิดเห็นสองสามข้อและคำถามที่ทำให้กระจ่าง: มันจะเพียงพอหรือเปล่าที่จุดประสงค์ของคุณเพียงแค่ใช้ความเท่าเทียมกันทางไวยากรณ์ ("=" ใน Coq) แทนที่จะเป็น I (N, x, y) มีเหตุผลในการใช้ 'หรือ' วิธีที่คุณกำหนดไว้หรือไม่ Coq (ดีไลบรารีพื้นฐานสำหรับ Coq) มีวิธีการแสดงออกทางตรรกะความสัมพันธ์ที่อำนวยความสะดวกด้านที่ดีบางอย่างของการพิสูจน์ ในทำนองเดียวกันมีวิธีการกำหนด 'น้อย' ที่อาจทำงานได้ดีกว่าสำหรับคุณ ด้วยเหตุนี้คุณอาจต้องการที่จะมีลักษณะที่เป็นบทเริ่มต้นของมูลนิธิซอฟแวร์ ในขณะที่ส่วนท้ายของหนังสือเล่มนี้ ...
ลุค Mathieson

... เป็นเรื่องของการตรวจสอบโปรแกรม ฯลฯ การเริ่มต้นนั้นค่อนข้างดีสำหรับ Coq และมีทฤษฎีที่คล้ายกับแบบฝึกหัดและตัวอย่าง ฟรีและจริง ๆ แล้วทั้งหมดเขียนด้วยสคริปต์ Coq เพื่อให้คุณสามารถทำแบบฝึกหัดและรวบรวมพวกเขาเมื่อคุณอ่าน สำหรับสิ่งที่คุณกำลังทำอยู่ที่นี่มีบิตและชิ้นส่วนที่น่าสนใจในบทพื้นฐานการเหนี่ยวนำ Prop และลอจิก - และอาจขึ้นอยู่กับการพึ่งพาจากบิตในระหว่างนั้น
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

ขอบคุณ! หมายเหตุที่ว่านี้มักจะถูกเรียกว่า "Euclidian ส่วน" และมีอยู่แล้วในปัจจุบันห้องสมุดบาง (มากกว่าจำนวนเต็มแม้ว่า)
cody

ไม่แปลกใจเลยที่ห้องสมุด Coq ที่ฉันดูได้รับการเก็บรักษาอย่างดีพร้อมคำจำกัดความบทแทรกและทฤษฎีบท ฉันจะพยายามโพสต์วิธีการของฉันไปยังอัลกอริทึมการหารยูคลีนิคเป็นคำถามในวันพรุ่งนี้ที่ผ่านมา
user11942

4

คำตอบของ Cody นั้นยอดเยี่ยมและตอบคำถามของคุณเกี่ยวกับการแปลหลักฐานของคุณเป็น Coq เป็นส่วนเสริมที่ฉันต้องการเพิ่มผลลัพธ์เดียวกัน แต่พิสูจน์แล้วโดยใช้เส้นทางที่แตกต่างกันส่วนใหญ่เป็นภาพประกอบของ Coq บางส่วนและเพื่อแสดงให้เห็นถึงสิ่งที่คุณสามารถพิสูจน์ syntactically ด้วยงานเพิ่มเติมเล็กน้อย นี่ไม่ใช่การอ้างสิทธิ์ แต่เป็นเส้นทางที่สั้นที่สุด - เป็นเส้นทางที่แตกต่าง หลักฐานมีเพียงหนึ่งผู้ช่วยเพิ่มเติมบทแทรกและพึ่งพาเฉพาะคำจำกัดความพื้นฐานฉันไม่แนะนำการเพิ่มการคูณหรือคุณสมบัติใด ๆ ของพวกเขาหรือการขยายการใช้งาน a + c <= b + c ในตัวช่วยแทรก (สำหรับ c = 1) และการเหนี่ยวนำโครงสร้างซึ่งมาพร้อมกับประเภทอุปนัยฟรี

เช่นเดียวกับโคดี้ที่ฉันคิดว่ามันไม่ต่างอะไรฉันใช้ประเภทที่กำหนดไว้ล่วงหน้าเป็นต้นดังนั้นก่อนการพิสูจน์ฉันจะอธิบายสิ่งเหล่านี้:

  • ฉันใช้ชนิดของ nat ที่สร้างขึ้นสำหรับตัวเลขที่เป็นธรรมชาติซึ่งมีความหมายเดียวกันกับของคุณ:

Inat nat: Set: = O: nat | S: nat -> nat

  • ฉันใช้ไฟล์ในตัวและ 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 (shorthand "=") คือความเท่าเทียมกันทางวากยสัมพันธ์และทำงานเหมือนกับ "I" ของคุณโดยมีคอนสตรัคเตอร์ตัวเดียวที่บอกว่าอะไรก็ตามมีค่าเท่ากับตัวมันเอง คุณสมบัติสมมาตรและสกรรมกริยานั้นง่ายต่อการพิสูจน์ แต่เราไม่ต้องการมันในกรณีนี้ คำนิยามสำหรับ eq ด้านล่างมีสัญกรณ์อยู่ภายใน

Inq eq (A: Type) (x: A): A -> Prop: = eq_refl: x = x

  • สุดท้ายฉันได้ใช้ข้อเสนอหรือ (ชวเลข "\ /" - ซึ่งเป็นแบ็กสแลชฟอร์เวิร์ดสแลช) ซึ่งมีคอนสตรัคเตอร์สองตัวโดยพื้นฐานแล้วคุณมีหลักฐานสำหรับอาร์กิวเมนต์ซ้ายหรืออาร์กิวเมนต์ที่ถูกต้อง Coq ยังมีกลยุทธ์การจดชวเลขบางอย่างด้านซ้ายและขวาซึ่งหมายถึง "ใช้ or_introl" และ "ใช้ 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.