2011-11-01 54 views
19

[Tôi không chắc chắn này là thích hợp cho stack overflow, nhưng có rất nhiều câu hỏi Coq khác ở đây vì vậy có lẽ ai đó có thể giúp đỡ.]`true = false` có nghĩa là gì trong Coq?

Tôi đang làm việc thông qua việc sau đây từ http://www.cis.upenn.edu/~bcpierce/sf/Basics.html#lab28 (ngay bên dưới nơi trường hợp được giới thiệu). Lưu ý rằng tôi là một người mới bắt đầu hoàn thành ở đây, và đang làm việc ở nhà - tôi không phải là sinh viên.

Theorem andb_true_elim1 : forall b c : bool, 
    andb b c = true -> b = true. 
Proof. 
    intros b c H. 
    destruct b. 
    Case "b = true". 
    reflexivity. 
    Case "b = false". 
    rewrite <- H. reflexivity. 
Qed. 

và tôi nhìn vào những gì mà viết lại thì:

Case := "b = false" : String.string 
    c : bool 
    H : andb false c = true 
    ============================ 
    false = true 

sau đó rewrite <- H. được áp dụng:

Case := "b = false" : String.string 
    c : bool 
    H : andb false c = true 
    ============================ 
    false = andb false c 

và nó rõ ràng như thế nào chứng minh sẽ thành công.

Tôi có thể xem cách điều khiển ký hiệu theo cách cơ học mà tôi đến bằng chứng. Đó là tốt. Nhưng tôi bị quấy rầy bởi "ý nghĩa". Cụ thể, làm cách nào tôi có thể có false = true ở giữa bằng chứng?

Có vẻ như tôi đang làm một số loại tranh cãi với mâu thuẫn, nhưng tôi không chắc chắn về điều gì. Tôi cảm thấy như tôi đã bị mù quáng theo các quy tắc và bằng cách nào đó đã đến một điểm mà tôi đang gõ vô nghĩa.

Tôi đang làm gì làm ở trên?

Tôi hy vọng câu hỏi là rõ ràng.

+1

Bạn có thể thử sử dụng: ['phân biệt đối xử'] (http://www.fing.edu.uy/inco/grupos/mf/man/Coq/node.1.2.8.html). (Tôi thấy đó là một bài cũ) – guest

Trả lời

16

Nói chung, khi bạn thực hiện phân tích trường hợp trong một định lý, thì nhiều trường hợp đun sôi xuống thành "không thể xảy ra". Ví dụ, nếu bạn đang chứng minh một số thực tế về các số nguyên, bạn có thể cần phải làm một phân tích trường hợp cho dù số nguyên i là dương, không hoặc âm. Nhưng có thể có những giả thuyết khác nằm xung quanh trong bối cảnh của bạn, hoặc có lẽ một phần nào đó trong mục tiêu của bạn, điều đó mâu thuẫn với một trong những trường hợp. Bạn có thể biết từ một xác nhận trước đó, ví dụ, rằng i không bao giờ có thể là tiêu cực.

Tuy nhiên Coq không thông minh. Vì vậy, bạn vẫn phải đi qua cơ chế thực sự cho thấy rằng hai giả thuyết mâu thuẫn có thể được dán lại với nhau thành một bằng chứng về sự vô lý và do đó là bằng chứng về định lý của bạn.

Hãy suy nghĩ về nó như thế nào trong một chương trình máy tính:

switch (k) { 
    case X: 
    /* do stuff */ 
    break; 
    case Y: 
    /* do other stuff */ 
    break; 
    default: 
    assert(false, "can't ever happen"); 
} 

Mục tiêu false = true là "không thể bao giờ xảy ra". Nhưng bạn không thể chỉ khẳng định theo cách của bạn trong Coq. Bạn thực sự phải đặt ra một thuật ngữ chứng minh.

Vì vậy, ở trên, bạn phải chứng minh mục tiêu ngớ ngẩn false = true. Và điều duy nhất bạn phải làm việc là giả thuyết H: andb false c = true. Suy nghĩ của một khoảnh khắc sẽ cho bạn thấy rằng thực sự đây là một giả thuyết ngớ ngẩn (bởi vì andb false y giảm sai cho bất kỳ y và do đó không thể có thể đúng). Vì vậy, bạn đập vào mục tiêu với điều duy nhất theo ý của bạn (cụ thể là H) và mục tiêu mới của bạn là false = andb false c.

Vì vậy, bạn áp dụng một giả thuyết ngớ ngẩn cố gắng đạt được mục tiêu vô lý. Và lo và nhìn thấy bạn kết thúc với một cái gì đó bạn thực sự có thể hiển thị bằng phản xạ. Qed.

CẬP NHẬT Chính thức, đây là những gì đang diễn ra.

Nhớ lại rằng mọi định nghĩa quy nạp trong Coq đều có nguyên tắc cảm ứng. Dưới đây là các loại các nguyên tắc quy nạp cho bình đẳng và False đề xuất (như trái ngược với thuật ngữ false loại bool):

Check eq_ind. 
eq_ind 
    : forall (A : Type) (x : A) (P : A -> Prop), 
    P x -> forall y : A, x = y -> P y 
Check False_ind. 
False_ind 
: forall P : Prop, False -> P 

Đó nguyên tắc cảm ứng cho False nói rằng nếu bạn cho tôi một bằng chứng về False, tôi có thể cung cấp cho bạn bằng chứng về bất kỳ đề xuất nào P.

Nguyên tắc cảm ứng cho eq phức tạp hơn. Hãy xem xét nó giới hạn trong bool. Và cụ thể là false. Nó nói:

Check eq_ind false. 
eq_ind false 
: forall P : bool -> Prop, P false -> forall y : bool, false = y -> P y 

Vì vậy, nếu bạn bắt đầu với một số đề xuất P(b) mà phụ thuộc vào một boolean b, và bạn có một bằng chứng về P(false), sau đó cho bất kỳ boolean y khác đó là bằng false, bạn có một bằng chứng về P(y).

Điều này không có vẻ kỳ lạ, nhưng chúng tôi có thể áp dụng cho bất kỳ đề xuất P nào mà chúng tôi muốn. Và chúng tôi muốn một người đặc biệt khó chịu.

Check eq_ind false (fun b : bool => if b then False else True). 
eq_ind false (fun b : bool => if b then False else True) 
: (fun b : bool => if b then False else True) false -> 
    forall y : bool, 
    false = y -> (fun b : bool => if b then False else True) y 

Đơn giản hóa một chút, điều này nói là True -> forall y : bool, false = y -> (if y then False else True).

Vì vậy, điều này muốn có bằng chứng là True và sau đó một số boolean y mà chúng tôi nhận được để chọn. Vì vậy, hãy làm điều đó.

Check eq_ind false (fun b : bool => if b then False else True) I true. 
eq_ind false (fun b : bool => if b then False else True) I true 
: false = true -> (fun b : bool => if b then False else True) true 

Và ở đây chúng tôi là: false = true -> False.

Kết hợp với những gì chúng tôi biết về nguyên tắc cảm ứng cho False, chúng tôi có: nếu bạn cho tôi bằng chứng là false = true, tôi có thể chứng minh bất kỳ đề xuất nào.

Quay lại andb_true_elim1. Chúng tôi có giả thuyết Hfalse = true. Và chúng tôi muốn chứng minh một số loại mục tiêu. Như tôi đã trình bày ở trên, có tồn tại một thuật ngữ bằng chứng để biến chứng minh của false = true thành bằng chứng về bất kỳ điều gì bạn muốn. Vì vậy, cụ thể H là bằng chứng của false = true, vì vậy bây giờ bạn có thể chứng minh bất kỳ mục tiêu nào bạn muốn.

Các chiến thuật về cơ bản là máy móc xây dựng thuật ngữ chứng minh.

+0

cảm ơn, điều đó rất có ý nghĩa, nhưng những gì tôi vẫn không hiểu là cách kết hợp hai thứ vừa "sai" hoặc "ngớ ngẩn" bằng cách nào đó làm cho mọi thứ "đúng". tôi có thể thấy rằng nó hoạt động - bằng chứng xuất hiện - nhưng tại sao nó lại hoạt động? tại sao một điều ngớ ngẩn bằng cách nào đó hủy bỏ một điều ngớ ngẩn khác, và liệu nó có luôn luôn hoạt động theo cách đó không? nó có vẻ như có cái gì đó "sâu sắc hơn" mà tôi vẫn còn thiếu? có phải là tôi đang giả định một cái gì đó mâu thuẫn và sau đó cho thấy rằng nó thực sự là mâu thuẫn? –

+1

@andrewcooke Những gì bạn có ở đây không phải là hai điều sai trái, nhưng hai điều mâu thuẫn nhau. Giả thuyết của bạn * chụp chung * là tự mâu thuẫn. chính xác hơn, giả thuyết của bạn nói chung là một tuyên bố sai lầm, và do đó bạn có thể chứng minh bất cứ điều gì (kể cả mục tiêu của bạn) từ những giả thuyết này. Cách duy nhất cách giả thuyết có thể ngụ ý một tuyên bố sai lầm là nếu không có cách nào cho các giả thuyết là đúng sự thật. – Gilles

+0

vì vậy tôi cũng có thể nhập "Chấp nhận". thay vì viết lại và bằng chứng sẽ tốt bằng nhau? –

6

true = false là một tuyên bố tương đương hai giá trị boolean khác nhau. Vì những giá trị này khác nhau nên câu lệnh này rõ ràng không thể chứng minh được (trong ngữ cảnh trống).

Xem xét bằng chứng của bạn: bạn đến giai đoạn mà mục tiêu là false = true, vì vậy rõ ràng bạn sẽ không thể chứng minh điều đó ... nhưng điều là bối cảnh của bạn (giả định) cũng mâu thuẫn. Điều này thường xảy ra khi bạn phân tích trường hợp và một trong các trường hợp là mâu thuẫn với các giả định khác của bạn.

+0

cảm ơn. như với câu trả lời khác, điều này có ý nghĩa, nhưng tôi vẫn không hiểu tại sao hai điều mâu thuẫn bằng cách nào đó "hủy bỏ lẫn nhau". tôi có thể thấy điều đó xảy ra, nhưng có cảm giác như phải có một số lý do cơ bản "tại sao" ...? mâu thuẫn luôn xuất hiện theo cặp? nếu vậy, nguyên tắc tạo ra cái này là gì? –

+0

Sửa chữa: Rõ ràng là không thể chứng minh được _ trong bối cảnh trống rỗng_. –

+0

@RobinGreen: thực sự, đó là những gì tôi đã có trong tâm trí. Làm rõ câu trả lời; cảm ơn. – akoprowski

1

Tôi nhận ra điều này là cũ, nhưng tôi muốn làm rõ một số trực giác đằng sau câu trả lời Lambdageek của (trong trường hợp ai đó tìm thấy này)

tôi nhận thấy rằng vấn đề mấu chốt dường như là chúng ta định nghĩa một hàm F:bool->Prop với nhau các giá trị tại mỗi điểm (ví dụ: true => Truefalse => False). Tuy nhiên nó có thể dễ dàng được hiển thị từ nguyên tắc cảm ứng cho bình đẳng eq_ind ý tưởng trực giác rằng

forall A:Type, forall P:A->Prop, forall x y:A, (x=y) -> (P x = P y), 

Nhưng điều này sau đó sẽ có nghĩa là giả sử true=false chúng tôi có True=False, nhưng kể từ khi chúng ta biết True, chúng tôi lấy được False.

Điều này có nghĩa là các tài sản cơ bản chúng tôi đang sử dụng là khả năng xác định F, được đưa ra bởi các nguyên tắc đệ quy cho bool, bool_rect:

forall P:bool -> Type, P true -> P false -> (forall b:bool, P b) 

bằng cách thiết lập P (b:bool) := b=>Prop, thì đây là như nhau như

Prop -> Prop -> (forall b:bool, Prop), 

nơi chúng tôi đầu vào TrueFalse để có được chức năng của chúng tôi F.

Các vấn đề liên quan