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 if
b
đế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.
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! –
(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'. –