2016-11-21 13 views
5

Tôi đang cố gắng tìm hiểu ngôn ngữ bằng chứng toán học Coq, nhưng tôi chạy vào một số rắc rối cố gắng để chứng minh một cái gì đó mà tôi giảm xuống còn tuyên bố ngớ ngẩn sau đây:Coq của: Viết lại nhập nếu tình trạng

Lemma foo: forall b: bool, b = true -> (if b then 0 else 1) = 0. 

Dưới đây là nỗ lực của tôi:

proof. 
    let b: bool. 
    let H: (b = true). 

Tại thời điểm này tình trạng giấy tờ chứng minh là:

b : bool 
    H : b = true 
    ============================ 
    thesis := 
    (if b then 0 else 1) = 0 

Bây giờ tôi muốn viết lại điều kiện ifb đến true để có thể chứng minh luận án. Tuy nhiên, cả một "bước nhỏ" của

have ((if b then 0 else 1) = (if true then 0 else 1)) by H. 

và một "bước lớn" của

have ((if b then 0 else 1) = 0) by H. 

thất bại với Warning: Insufficient justification. Tôi không nghĩ rằng có điều gì sai trái với việc viết lại trong tình trạng này, như bình thường rewrite -> H chiến thuật sẽ thực hiện tương tự.

Tôi cũng có thể được điều này để làm việc mà không vấn đề bằng cách gói if trong một chức năng:

Definition ite (cond: bool) (a b: nat) := if cond then a else b. 
Lemma bar: forall b: bool, b = true -> (ite b 0 1) = 0. 
proof. 
    let b: bool. let H: (b = true). 
    have (ite b 0 1 = ite true 0 1) by H. thus ~= 0. 
end proof. 

Đây không phải là rất tốt đẹp, tất nhiên. Tôi có làm gì sai không? Có cách nào để giải cứu bằng chứng gốc của tôi không? Đây có phải chỉ là một thiếu sót của việc thực hiện ngôn ngữ chứng minh toán học?

Tôi lưu ý rằng có một ví dụ có thể có liên quan tại mục 11.3.3 của cuốn cẩm nang (tại https://coq.inria.fr/doc/Reference-Manual013.html):

a := false : bool 
    b := true : bool 
    H : False 
    ============================ 
    thesis := 
    if b then True else False 

Coq < reconsider thesis as True. 

Nhưng tôi không biết làm thế nào để có được những phần b := true vào ngữ cảnh.

Trả lời

3

Một giải pháp khả thi là sử dụng per cases trên b (xem sect. 11.3.12):

Lemma foo: 
    forall b: bool, b = true -> (if b then 0 else 1) = 0. 
proof. 
    let b : bool. 
    per cases on b. 
    suppose it is true. thus thesis. 
    suppose it is false. thus thesis. 
    end cases. 
end proof. 
Qed. 

Tôi cũng đã cố gắng để tái tạo tình trạng bằng chứng về hướng dẫn tham khảo ví dụ của bạn, bạn có thể sử dụng define cho rằng:

Lemma manual_11_3_3 : 
    if false then True else False -> 
    if true then True else False. 
proof. 
    define a as false. 
    define b as true. 
    assume H : (if a then True else False). 
    reconsider H as False. 
    reconsider thesis as True. 
Abort. 
+0

Tôi tạm thời "chấp nhận" điều này vì nó có thể là cách tốt nhất để đi ngay cả khi nó không phải là viết lại mà tôi đã hy vọng (và tôi vẫn nghĩ rằng nên được cho phép). 'define' không đặt' b' trong ngữ cảnh trong ví dụ của tôi, nhưng đổi tên gốc thành 'b' thành' b0'. Nó không cho phép tôi khai thác thực tế đã biết rằng 'b' là đúng. Vì vậy, đó không phải là cách để đi. Cảm ơn! –

+0

(1) Có, đó chỉ là giải pháp thay thế. Dường như mọi người không sử dụng ngôn ngữ khai báo và hành vi bạn đã quan sát không làm tăng tính phổ biến của nó. (2) Thật vậy, 'define' không hữu ích trong' foo' - tôi đã thêm nó vào trong câu trả lời "Tôi không biết cách lấy phần' b: = true' vào ngữ cảnh ". Về cơ bản, 'define' hoạt động giống như chiến thuật' set'. –

-1

Dường như từ khóa proof nhập vào chế độ bằng chứng khai báo. Theo constrast, từ khóa Proof nhập vào một chế độ bằng chứng bắt buộc. Trong trường hợp thứ hai này, chúng ta có thể chứng minh nó dễ dàng như sau.

Lemma foo: forall b: bool, b = true -> (if b then 0 else 1) = 0.          
Proof.                        
    intros b H.                      
    rewrite H.                       
    reflexivity.                      
Qed. 

Trong trường hợp đầu tiên, tôi không có câu trả lời. Tôi đã thử một số phương pháp tiếp cận tương tự như của bạn nhưng tìm thấy cùng một vấn đề một lần nữa và một lần nữa. Có lẽ ai đó quen thuộc hơn với các bằng chứng khai báo có thể đưa ra câu trả lời đầy đủ. Vui lòng cho chúng tôi biết nếu bạn tìm thấy giải pháp!

+2

Có, "chế độ khai báo" này là những gì Chương 11 của sách hướng dẫn Coq gọi là "ngôn ngữ chứng minh toán học". Tôi thích phong cách chứng minh này, điều mà tôi quen thuộc khi làm việc với Isabelle/HOL. Đó là lý do tại sao tôi đặc biệt muốn học nó ngay bây giờ; Tôi đã biết ngôn ngữ chiến thuật và biết rằng bằng chứng này là tầm thường ;-) –

+0

Điều đó có ý nghĩa.Tôi mừng vì Anton có thể giúp. Đó là một sự xấu hổ rằng tính năng đơn giản này của ngôn ngữ khai báo dường như không hoạt động trực tiếp! –

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