কোকের উপপাদ্য প্রুফ


10

পটভূমি

কাক, আমি নিজে থেকে শিখছি। এখনও অবধি আমি হুড়িতে ইয়েভেস বার্টোটের কক পড়া শেষ করেছি । এখন, আমার লক্ষ্য প্রাকৃতিক সংখ্যাগুলি সম্পর্কে কিছু প্রাথমিক ফলাফল প্রমাণ করা, তথাকথিত বিভাগ অ্যালগরিদমের সাথে সমাপ্তি। যাইহোক, আমি সেই লক্ষ্যে যাওয়ার পথে কিছুটা বিপর্যয়ের মুখোমুখি হয়েছি। বিশেষত, নিম্নলিখিত দুটি ফলাফল প্রমাণ করেছেন (শ্লেষাকৃত) আমি কাক মধ্যে প্রবর্তন করা আরও কঠিন হিসাবে আমি প্রাথমিকভাবে কল্পনা করেছিলাম। প্রকৃতপক্ষে, আমি অনেক নিরর্থক প্রচেষ্টার পরেও তাদের হাতে প্রমাণ করার জন্য অবলম্বন করেছি (নীচে দেখানো হয়েছে) এটি স্পষ্টতই আমাকে কাক পরিচালনার ক্ষেত্রে আরও দক্ষ হতে সাহায্য করে না; যে কারণে আমি এই ফোরামে ঘুরছি। আমার আশা এই সাইটের যে কেউ সক্ষম এবং ইচ্ছুকআমার প্রমাণগুলি নীচে কোক স্বীকার করে এমন কোনও প্রমাণে অনুবাদ করতে আমাকে সহায়তা করার জন্য। সমস্ত সাহায্য আন্তরিকভাবে প্রশংসা করা হয়!

উপপাদ্য ক

সবার জন্য x,yN

x<S(y)x<yI(N,x,y)
প্রমাণ:

অনুমান করা x<S(y)। অতএব আছে একটিzN সঙ্গে

(*)I(N,x+S(z),S(y))
অতএব দ্বারা (পেরো 1 বি এবং 3)
I(N,x+z,y)

একটি শিকারী নির্ধারণ করুন

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

এটি দেখাতে যথেষ্ট Q(z)। আমরা অন্তর্ভুক্তি দ্বারা এটি প্রমাণz। দেখতেQ(0), যদি হয় না I(N,x+0,y) তারপর ধরে I(N,x,y)পেরোনো 1 এ দ্বারা সত্য। সুতরাং,x<yI(n,x,y)। এখন, আমরা প্রমাণQ(S(v)): ধরুন I(N,x+S(v),y)। এই সংজ্ঞা থেকে আমাদের আছেx<y এবং এগুলো x<yI(N,x,y)এছাড়াও এই ক্ষেত্রে। শেষ পর্যন্ত, পেনোর পঞ্চম অ্যাক্সিয়াম দেয়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 স্থির এবং অন্তর্ভুক্ত x। কখনI(N,0,y) আমাদের আছে 0<yI(N,0,y) সবার জন্য y, যা বেস কেস প্রমাণ করে। এর পরে, ধরুন উপপাদ্যটি ধরে রেখেছেx; এখন আমরা এর উপপাদ্য প্রমাণ করতে চাইS(x)। ট্রাইকোটমি থেকে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 তারপরে, উপপাদ্য ক দ্বারা আমাদের আছে S(x)<y অথবা I(N,S(x),y), এবং উভয় ক্ষেত্রেই আমরা সম্পন্ন হয়েছি।

()

আমি যে উপপাদ্যগুলি প্রমাণ করতে চাই, তা কোক-এর নীচে প্রকাশ করা যেতে পারে।

লেমা কম_লেম (এক্সআই: এন): কম এক্স (স্যাক ওয়াই) -> বা (কম এক্সআই) (ইন এক্সআই)।

উপপাদ্য এনট্রাইকোটোমি: (ফোরাল এক্সআই: এন, বা (কম এক্সআই) (বা (এক্সএইচআই) (কম ইয়াক্স)))।

কার্যকর ফলাফল

এখানে আমি কিছু ফলাফল সংগ্রহ করেছি যা আমি সংজ্ঞায়িত করেছি এবং এ পর্যন্ত প্রমাণ করেছি। এইগুলি আমি উপরে উল্লেখ করি। * এই কোডটি আমি এ পর্যন্ত লিখতে পরিচালিত করেছি, লক্ষ্য করুন যে বেশিরভাগ সংজ্ঞা রয়েছে। *

(* 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
আপনি কতদূর পেরেছেন তা বোঝার জন্য, আপনি যদি এখন পর্যন্ত আপনার কোক কোডটি পোস্ট করেন তবে এটি সহায়তা করবে যাতে আমরা এটি লোড করতে পারি এবং আমাদের প্রস্তাবনাগুলি আপনার সংজ্ঞাগুলির জন্য কাজ করে কিনা তা পরীক্ষা করতে পারে।
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

1
বেশ কয়েকটি মন্তব্য এবং স্পষ্টকারী প্রশ্ন: - আপনার উদ্দেশ্যগুলি কেবল I (N, x, y) এর পরিবর্তে সিনট্যাকটিক সমতা ("=" কোকায়) ব্যবহার করা কি যথেষ্ট হবে? 'বা' যেভাবে আপনি এটি সংজ্ঞায়িত করেছেন ব্যবহার করার কোনও কারণ আছে? কোক (ভাল, কোকের প্রাথমিক গ্রন্থাগারসমূহ) -এর বহিঃপ্রকাশের একটি যুক্তিযুক্ত যৌক্তিক বিভাজন রয়েছে যা প্রমাণের কয়েকটি চমৎকার দিককে সহজ করে দেয়। একইভাবে 'কম' সংজ্ঞায়নের একটি উপায় রয়েছে যা আপনার পক্ষে আরও কার্যক্ষম হতে পারে। এই লক্ষ্যে আপনি সফ্টওয়্যার ফাউন্ডেশনগুলির প্রাথমিক অধ্যায়গুলি একবার দেখতে চান । বইয়ের শেষের সময় ...
লুক ম্যাথিসন

... প্রোগ্রাম যাচাইকরণ সম্পর্কে, শুরুটি কাকের বেশ ভাল পরিচয় এবং এটির মতো অনুশীলনগুলি যেমন আপনি অনুশীলন এবং উদাহরণ হিসাবে পেয়েছেন। এটি নিখরচায় এবং এগুলি সবই কক স্ক্রিপ্ট হিসাবে লেখা, যাতে আপনি অনুশীলন করতে পারেন এবং পড়ার সময় সেগুলি সংকলন করতে পারেন। আপনি এখানে যা করছেন তার জন্য অধ্যায়গুলির বেসিকস, আনয়ন, প্রপ এবং লজিক - এবং সম্ভবত অভ্যন্তরীণ বিটগুলির মধ্যে কিছুটা নির্ভরশীলতা অধ্যায়গুলিতে আকর্ষণীয় বিট এবং টুকরো রয়েছে।
লুক ম্যাথিসন

1
আরেকটি নোট, থেম পি 5 (প্রস্তাবনামূলক নীতি) একটি শক্তিশালী আকারে (কাঠামোগত আবেগ) কোকের সাথে অন্তর্নির্মিত, সুতরাং আপনাকে স্পষ্টভাবে এটি একটি অদ্ভুত হিসাবে গ্রহণ করার দরকার নেই।
লুক ম্যাথিসন

আমি এতক্ষণ লিখেছি এমন কোক কোড পোস্ট করেছি।
ব্যবহারকারী 11942

উত্তর:


7

কোক কাগজের প্রমাণগুলির চেয়ে কিছুটা নিষ্ঠুর: আপনি যখন একটি কাগজ প্রমাণে "এবং আমরা" বা "স্পষ্টভাবে" লিখি তখন কোককে বোঝানোর জন্য প্রায়শই অনেক কিছু করার দরকার হয়।

আপনার কোডটি একই অনুভূতিতে রাখার চেষ্টা করার সময় আমি এখন কিছুটা পরিষ্কার করেছি। আপনি এটি এখানে খুঁজে পেতে পারেন ।

বেশ কয়েকটি মন্তব্য:

  1. আমি ডেটাটাইপস এবং সংজ্ঞায় অন্তর্নির্মিত ব্যবহার করেছি যেখানে আমি ভেবেছিলাম এটি আপনার উদ্দেশ্যকে ক্ষতি করবে না। মনে রাখবেন যে আমি যদি তার পরিবর্তে অন্তর্নির্মিত সাম্যতাটি ব্যবহার করেছিলাম identityএবং "কম-বেশি" সম্পর্কের মধ্যে অন্তর্নির্মিত হয়ে থাকি তবে প্রমাণগুলি অনেক সহজ হত, কারণ আপনার লেমাসগুলির অনেকগুলি জানা তত্ত্বগুলির ডেটাবেজে রয়েছে, যা প্রতিটি কলে পরীক্ষা করা হয়

    auto with arith.
    
  2. আমি এমন কিছু কৌশল ব্যবহার করেছি যার সম্পর্কে আপনি সম্ভবত অবগত নন, তবে একজন "প্রকৃত" কোক সুপার-ব্যবহারকারীর হাতে আরও অনেক শক্তিশালী কৌশল থাকবে এবং কাজটি সহজ করার জন্য তার নিজস্ব কৌশল রচনা করবে। আমি সবসময় সিপিডিটিকে একটি শক্তিশালী উপায়ে কৌশল ব্যবহার সম্পর্কে শিখার জায়গা হিসাবে সুপারিশ করি

  3. আমি পাঠযোগ্যতা উন্নত করতে স্বীকৃতি এবং ট্যাবিং ব্যবহার করেছি এবং ম্যাচিংয়ের মতো বিল্ট-ইন কন্সট্রাক্টস এবং inductionজিনিসগুলি প্রমাণ ও পুনরায় ফ্যাক্টরকে সহজ করার কৌশলগুলি । বিশেষত, আপনার সংজ্ঞাটি lessকাজ করা কঠিন ছিল, আপনি দেখতে পাচ্ছেন যে আমি এটি থেকে কীভাবে সামান্য পরিবর্তন করেছি

    এক্স, মি+ +(এক্স+ +1)=এন
    সমতুল্য (তবে ব্যবহার করা সহজ)
    এক্স, (এক্স+ +মি)+ +1=এন
    "সংজ্ঞা টোয়েকিং" এই ধরনের একটি ঘটে অনেক আনুষ্ঠানিক প্রমাণে।
  4. আপনি এখানে এই ধরণের প্রশ্নের উত্তর পেতে পারেন, আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার কাজটি কোক-ক্লাবে জমা দিন যা এই ধরণের প্রশ্নের উত্তর দেওয়ার প্রত্যক্ষ উদ্দেশ্য নিয়ে তৈরি হয়েছিল created


1
দুর্দান্ত উত্তর কোডি! আপনার মতো উদার ব্যক্তিরাও এখানে আছেন, এটি শিখতে পেরে আমরা খুব আশ্চর্য হই যে যারা অভাবী অন্যদের সাহায্য করতে ইচ্ছুক। আমি আন্তরিকভাবে এটি প্রশংসা! আমি অবশ্যই স্পষ্টতই সিপিডিটি এবং কোক-ক্লাবের দিকে নজর দেব; উভয়ই আমার খুব সম্ভবত নিকট ভবিষ্যতে প্রয়োজন হবে কারণ আমি কোক বিভাগ বিভাজনকে প্রমাণ করার দিকে কাজ করে যাচ্ছি।
ব্যবহারকারী 11942

ধন্যবাদ! নোট করুন যে এটি প্রায়শই "ইউক্যালিডিয়ান বিভাগ" নামে পরিচিত এবং এটি ইতিমধ্যে কিছু গ্রন্থাগারে উপস্থিত রয়েছে (যদিও পূর্ণসংখ্যার উপরে)
কোডি

এটি আমাকে অবাক করে না, আমি যে কক গ্রন্থাগারগুলিতে দেখেছি সেগুলি সংজ্ঞা, লেমাস এবং উপপাদ্যগুলির সাথে উল্লেখযোগ্যভাবে স্টক করা হয়েছে। আমি ইউক্লিডিয়ান বিভাগের অ্যালগরিদমে আমার পদ্ধতির পোস্টটি সর্বশেষে একটি প্রশ্ন হিসাবে পোস্ট করার চেষ্টা করব post
ব্যবহারকারী 11942

4

কোডির উত্তরটি দুর্দান্ত, এবং আপনার প্রমাণটি কোকের সাথে অনুবাদ করার বিষয়ে আপনার প্রশ্নটি পূরণ করে। এর পরিপূরক হিসাবে, আমি একই ফলাফলগুলি যুক্ত করতে চেয়েছিলাম, তবে একটি ভিন্ন রুট ব্যবহার করে প্রমাণিত হয়েছি, মূলত ককের কিছু বিটের চিত্র হিসাবে এবং আপনি খুব অল্প অতিরিক্ত কাজ দিয়ে সিনট্যাক্টিকালি কী প্রমাণ করতে পারবেন তা প্রদর্শন করার জন্য। এটি দাবি নয় তবে এই যে সংক্ষিপ্ততম রুট - এটি কেবল আলাদা। প্রমাণগুলিতে কেবলমাত্র একটি অতিরিক্ত সহায়ক লেমা অন্তর্ভুক্ত রয়েছে এবং কেবলমাত্র মূল সংজ্ঞাগুলির উপর নির্ভর করে আমি সংযোজন, গুণ বা তার কোনও বৈশিষ্ট্য বা কার্যকরী এক্সটেনশিলিটি প্রবর্তন করি না এবং একমাত্র পিয়ানো অক্ষগুলি <= b -> এর সরল রূপ are a + c <= b + c হেল্পার লেমাতে (কেবল সি = 1 এর জন্য) এবং স্ট্রাকচারাল আনয়ন, যা যে কোনও উপায়ে বিনামূল্যে প্রেরণামূলক প্রকারের সাথে আসে।

কোডির মতো, যেখানে আমি ভেবেছিলাম এটির কোনও পার্থক্য নেই, আমি পূর্বনির্ধারিত প্রকারগুলি ইত্যাদি ব্যবহার করেছি, সুতরাং প্রমাণের আগে, আমি সেগুলি বর্ণনা করব:

  • আমি প্রাকৃতিক সংখ্যার জন্য অন্তর্নির্মিত নাট প্রকারটি ব্যবহার করেছি, যা (সুনির্দিষ্ট নামকরণ অবধি) আপনার মতো একই সংজ্ঞা রয়েছে:

প্ররোচিত নাট: সেট: = ও: নাট | এস: নাট -> নাট

  • আমি বিল্ট ইন লে এবং লেটিটি যথাক্রমে কম বা সমান এবং কমের জন্য ব্যবহার করেছি, যার পাঠযোগ্যতার জন্য নোটেশনাল শর্টহ্যান্ডস "<=" এবং "<" রয়েছে। তারা সংজ্ঞায়িত করা হয়:

প্ররোচিত লে: নাট -> নাট -> প্রপ: =
| লে_এন: ফোরাল এন, লে এনএন
| le_S: forall এনএম, (লে এনএম) -> (লে এন (এস এম))।

এবং

সংজ্ঞা lt (এনএম: নাট): = লে (এস এন) মি।

  • বিল্ট ইন ইক (শর্টহ্যান্ড "=") সিন্টেক্সিক সমতা এবং আপনার "আমি" এর মতো কাজ করে, এমন এক নির্মাণকারীর সাথে যা বলে যে কোনও কিছু নিজের সাথে সমান। প্রতিসম এবং ট্রানজিটিভ বৈশিষ্ট্যগুলি সেখান থেকে সহজ প্রমাণ, তবে আমাদের এই ক্ষেত্রে তাদের প্রয়োজন হবে না। নীচের eq এর সংজ্ঞাটি এতে স্বরলিপি তৈরি করেছে।

সূচকীয় এক (ক: প্রকার) (x: এ): ক -> প্রপ: = eq_refl: x = x

  • শেষ অবধি, আমি প্রস্তাবমূলক বা (শর্টহ্যান্ড "\ /" - যা ব্যাকস্ল্যাশ ফরওয়ার্ডস্ল্যাশ) ব্যবহার করেছি, যার দুটি কনস্ট্রাক্টর রয়েছে, মূলতঃ হয় আপনার কাছে বাম তর্ক বা প্রমাণের পক্ষে প্রমাণ রয়েছে। বাম এবং ডানদিকে কোকের কিছু শর্টহ্যান্ড কৌশলও রয়েছে যার অর্থ যথাক্রমে "প্রয়োগ করুন or_introl" এবং "প্রয়োগ করুন or_intror"।


প্ররোচিত বা (এবি: প্রপ): প্রপ: = বা_িন্ট্রোল: এ -> এ / বি | or_intror: বি -> এ / বি

নীতিগতভাবে এখন যা অনুসরণ করা হয় তা আমার প্রমাণগুলি হ'ল, যদি মার্কআপটি যদি না পায় তবে আপনার এটি কেবল একটি কক .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.

আর একটি দুর্দান্ত উত্তর! আপনি আমার প্রশ্নের জবাব দেওয়ার জন্য যে সময় এবং প্রচেষ্টা দিয়েছিলেন তার জন্য আমি সত্যই আপনার কাছে কৃতজ্ঞ।
ব্যবহারকারী 11942
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.