Latar Belakang
Saya belajar bantuan, Coq, sendiri. Sejauh ini, saya telah selesai membaca Yves Bertot's Coq in a Hurry . Sekarang, tujuan saya adalah untuk membuktikan beberapa hasil dasar mengenai bilangan asli, yang berpuncak dengan algoritma pembagian. Namun, saya telah menemui beberapa kemunduran dalam perjalanan menuju tujuan itu. Secara khusus, dua hasil berikut telah membuktikan (pun intended) lebih sulit untuk dibuktikan dalam Coq daripada yang saya bayangkan sebelumnya. Bahkan, setelah banyak upaya saya sia-sia, saya terpaksa membuktikannya dengan tangan (seperti yang ditunjukkan di bawah). Ini jelas tidak membantu saya menjadi lebih mahir dalam menangani Coq; itulah sebabnya saya beralih ke forum ini. Harapan saya adalah seseorang di situs ini dapat dan maumembantu saya menerjemahkan bukti saya di bawah ini menjadi bukti yang diterima Coq. Semua bantuan dengan tulus dihargai!
Teorema A
Untuk semua x < S ( y ) ⊂ x < y ∨ I ( N , x , y ) Bukti:
Misalkan . Karenanya ada z ∈ N dengan I ( Maka oleh (Peano 1b dan 3)I(N,x+z,y)
Tentukan predikat
Cukup untuk menunjukkan . Kami membuktikan ini dengan induksi pada z . Untuk melihat Q ( 0 ) , bukan ethat jika I ( N , x + 0 , y ) berlaku maka I ( N , x , y ) benar oleh Peano 1a. Jadi, x < y ∨ I ( n , x , y ) . Sekarang, kami membuktikan Q ( S ( v ) : Misalkan I ( N , x + S ( v ) , y ) . Dari definisi ini kita memiliki x < y dan dengan demikian x < y ∨ I ( N , x , y ) juga dalam hal ini. Akhirnya, aksioma kelima Peano memberi Q ( z ) dan dengan ( ∗ ) kita mendapatkan x < y ∨ I ( N , x , y .
Teorema B
Untuk semua x < y ∨ I ( N , x , y ) ∨ y < x Bukti:
Jika maka ¬ I ( N , x , y ) menurut definisi, dan jika x > y maka ¬ I ( N , x , y ) juga menurut definisi. Jika x > y dan y > x maka dengan transitivitas dan refleksivitas, kita memiliki I ( N , x , y ) , yang merupakan kontradiksi. Akibatnya, tidak lebih dari satu pernyataan yang benar.
Kami terus tetap dan melantik pada x . Ketika saya ( N , 0 , y ) yang kita miliki untuk semua y , yang membuktikan kasus dasar. Selanjutnya, anggap teorema berlaku untuk x ; sekarang kita ingin membuktikan teorema untuk S ( x ) . Dari trikotomi untuk x , ada tiga kasus: x < y , I ( N , x , dan x > y . Jika x > y , maka jelas S ( x ) > y . Jika I ( N , x , y ) , maka S ( x ) > y (sebagai S ( x ) > x untuk semua x ∈ N ). Akhirnya, misalkan x < y Kemudian, dengan teorema A kita memiliki S ( x ) atau I ( N , S ( x ) , y ) , dan dalam kedua kasus kita selesai.
Teorema yang ingin saya buktikan, dapat diungkapkan sebagai berikut dalam Coq.
Lemma less_lem (xy: N): less x (succ y) -> atau (less xy) (IN xy).
Teorema Ntrichotomy: (forall xy: N, atau (less xy) (atau (IN xy) (less yx))).
Hasil yang bermanfaat
Di sini, saya telah mengumpulkan beberapa hasil yang telah saya tetapkan, dan terbukti sampai titik ini. Inilah yang saya sebut di atas. * Ini adalah kode yang saya tulis sejauh ini, perhatikan bahwa sebagian besar terdiri dari definisi. *
(* 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))).
Jawaban:
Coq sedikit lebih kejam daripada bukti kertas: ketika Anda menulis "dan kita selesai" atau "jelas" dalam bukti kertas, sering kali ada lebih banyak yang harus dilakukan untuk meyakinkan Coq.
Sekarang saya melakukan sedikit pembersihan kode Anda, sambil mencoba untuk tetap dalam semangat yang sama. Anda dapat menemukannya di sini .
Beberapa komentar:
Saya menggunakan tipe data bawaan dan definisi di mana saya pikir itu tidak akan merusak niat Anda. Perhatikan bahwa jika saya menggunakan persamaan built-in alih-alih
identity
dan relasi "kurang-dari" bawaan, bukti akan jauh lebih mudah, karena banyak lemma Anda ada di database teorema yang dikenal, yang diperiksa pada setiap panggilan dariSaya menggunakan beberapa taktik yang mungkin tidak Anda sadari, tetapi pengguna super Coq "asli" akan memiliki taktik yang jauh lebih kuat dan menulis taktiknya sendiri untuk menyederhanakan pekerjaan. Saya selalu merekomendasikan CPDT sebagai tempat untuk belajar tentang menggunakan taktik dengan cara yang kuat.
Saya menggunakan notasi dan tab untuk meningkatkan keterbacaan dan konstruksi bawaan seperti pencocokan dan
induction
taktik untuk membuat hal-hal lebih mudah untuk dibuktikan dan faktor ulang. Khususnya, definisi Anda tentangless
sulit untuk dikerjakan, Anda dapat melihat bagaimana saya sedikit memodifikasinya dariMeskipun Anda mungkin mendapatkan jawaban untuk pertanyaan-pertanyaan semacam ini di sini, saya sangat menyarankan Anda mengirimkan karya Anda ke Coq-Club yang dibuat dengan tujuan menjawab pertanyaan-pertanyaan semacam ini.
sumber
Jawaban Cody sangat bagus, dan memenuhi pertanyaan Anda tentang menerjemahkan bukti Anda ke Coq. Sebagai pelengkap untuk itu, saya ingin menambahkan hasil yang sama, tetapi terbukti menggunakan rute yang berbeda, terutama sebagai ilustrasi dari beberapa bit Coq dan untuk menunjukkan apa yang dapat Anda buktikan secara sintaksis dengan sedikit pekerjaan tambahan. Namun ini bukan klaim bahwa ini adalah rute terpendek - hanya rute yang berbeda. Buktinya hanya mencakup satu lemma pembantu tambahan, dan hanya bergantung pada definisi dasar, saya tidak memperkenalkan penambahan, perkalian atau sifat-sifatnya, atau ekstensionalitas fungsional, dan satu-satunya aksioma Peano adalah bentuk sederhana dari <= b -> a + c <= b + c dalam helper helma (hanya untuk c = 1) dan induksi struktural, yang datang dengan tipe induktif gratis pula.
Seperti Cody, di mana saya pikir tidak ada bedanya, saya menggunakan tipe yang telah ditentukan dll, jadi sebelum buktinya, saya akan menjelaskannya:
dan
Apa yang sekarang mengikuti adalah bukti saya, pada prinsipnya, jika markup tidak menghalangi, Anda harus dapat memotong dan melewatinya ke dalam file Coq .v dan itu akan berfungsi. Saya telah menyertakan komentar untuk mencatat bit yang menarik, tetapi mereka berada dalam pembatas (* *), jadi Anda tidak harus menghapusnya.
sumber