Các kỹ thuật chính thức phổ biến để chứng minh mã chức năng chính xác là gì?


10

Tôi muốn cung cấp bằng chứng cho các phần của chương trình Haskell tôi đang viết như một phần của luận án. Tuy nhiên, cho đến nay, tôi đã thất bại trong việc tìm kiếm một công việc tham khảo tốt.

Cuốn sách giới thiệu của Graham Hutton Lập trình trong Haskell ( Google Sách ) Tôi đã đọc khi học Haskell gợi ý về một số kỹ thuật để suy luận về các chương trình như

  • lý luận tương đương
  • sử dụng các mẫu không chồng chéo
  • danh sách cảm ứng

trong chương 13 nhưng nó không sâu lắm.

Có bất kỳ cuốn sách hoặc bài viết nào bạn có thể đề nghị cung cấp một cái nhìn tổng quan chi tiết hơn về các kỹ thuật chứng minh chính thức cho Haskell, hoặc mã chức năng khác không?

Câu trả lời:


5

Một trong những phương pháp thực tế để chứng minh kết quả trong lập trình chức năng là thông qua nhóm của Richard Bird.

Cụ thể, bạn yêu cầu một cách tiếp cận chuyên sâu hoặc ít nhất là toàn diện hơn về lý luận và cảm ứng danh sách và điều này được cung cấp trong các Bài giảng về Lập trình chức năng xây dựng .

Tổng quát hơn, văn bản "Đại số lập trình", của Bird và de Moor, cũng đề cập đến tính chính xác của các thuật toán chức năng như tối ưu hóa và các vấn đề lập trình động.


Nếu bạn gặp các tài nguyên hữu ích khác cho vấn đề này, vui lòng đề cập đến chúng và có lẽ chúng ta có thể biến bài đăng này thành wiki.


Cảm ơn bạn! Chắc chắn, nếu tôi tìm thấy nhiều nguồn tài nguyên hơn, tôi sẽ đảm bảo thêm chúng vào bài viết của mình.
FK82

6

Bạn có thể bắt đầu với

Các chủ đề bao gồm các khái niệm cơ bản về logic, chứng minh định lý có sự trợ giúp của máy tính, trợ lý chứng minh Coq, lập trình chức năng, ngữ nghĩa hoạt động, logic Hoare và hệ thống kiểu tĩnh. Giải trình bày dành cho nhiều độc giả, từ sinh viên đại học đến sinh viên tiến sĩ và nhà nghiên cứu. Không có nền tảng cụ thể về logic hoặc ngôn ngữ lập trình được giả định, mặc dù mức độ trưởng thành toán học sẽ hữu ích.

Bạn có thể bỏ qua (hoặc đọc lướt) các phần lý thuyết ngôn ngữ lập trình và chỉ học cách đối phó với các bằng chứng chính thức bắt đầu từ Lời nói đầu cho đến IndPrinciples. Cuốn sách thực sự được viết và chiếu sáng.

Sau đó, bạn có thể muốn tiến hành với

Trong tập này, bạn sẽ tìm hiểu cách chỉ định và xác minh (chứng minh tính chính xác của) thuật toán sắp xếp, cây tìm kiếm nhị phân, cây tìm kiếm nhị phân cân bằng và hàng đợi ưu tiên. Trước khi sử dụng cuốn sách này, bạn nên có một số hiểu biết về các thuật toán và cấu trúc dữ liệu này, có sẵn trong bất kỳ sách giáo khoa thuật toán đại học tiêu chuẩn nào. Bạn nên hiểu tất cả các tài liệu trong Cơ sở phần mềm Tập 1 (Cơ sở logic)

Một lưu ý cảnh báo: VFA vẫn đang trong giai đoạn phát hành beta!


(Liên kết thứ hai của bạn hướng đến vị trí sai.) Ngoài ra, còn có Lập trình chức năng được xác minh trong Agda ; trong đó sử dụng Agda, chính thức là ngôn ngữ lập trình nhưng sử dụng unicode và do đó gần với ký hiệu toán học hơn.
Musa Al-hassy

Đã sửa, cảm ơn. Vâng, tôi đã đọc VFPiA, nhưng nó không phải là sở thích của tôi.
Anton Trunov

Cảm ơn về câu trả lời của bạn! Tôi nghĩ rằng có một quan niệm sai lầm. Tôi không tìm kiếm các kỹ thuật chức năng để chứng minh các thuật toán (như trợ lý chứng minh), nhưng đối với các kỹ thuật chứng minh mã chức năng (ví dụ để chứng minh việc thực hiện chức năng của một thuật toán đã cho đúng) @ Câu trả lời của MusaAl-hassy rất gần với tôi câu trả lời mong muốn. Trong trường hợp tôi bỏ lỡ nó và những cuốn sách bạn trích dẫn cũng đề cập đến khía cạnh này, bạn có phiền khi thêm các chương liên quan không?
FK82

@ FK82 Đây là một chương Theorem app_assoc : ∀ l1 l2 l3 : natlist, (l1 ++ l2) ++ l3 = l1 ++ (l2 ++ l3)từ Danh sách . Ví dụ này có giống bất cứ thứ gì bạn quan tâm không? Họ bắt đầu với lập trình chức năng trong Coq, nhưng sau đó chuyển sang lý luận về các thuộc tính của các chương trình chức năng. Các chương từ Lời nói đầu cho đến IndPrinciples bao gồm cả hai điều đó, và tôi muốn nói rằng lập trình và lý luận được đan xen ở đó.
Anton Trunov

1
@ FK82 (1) Tôi hoàn toàn đồng ý với nhận xét này . (2) Bạn có thể muốn xem cuốn sách "Suy nghĩ chức năng với Haskell" (2015) của R. Bird. Cuốn sách có vô số ví dụ về lý luận về Haskell. (3) Ngoài ra, "Ngọc trai của thiết kế thuật toán chức năng" (2010) của cùng một tác giả có thể giúp ích cho bạn.
Anton Trunov

5

Nó chỉ ra rằng một nguồn tuyệt vời của các kỹ thuật chứng minh và ví dụ để chứng minh mọi thứ về các ngôn ngữ chức năng thuần túy là các trợ lý chứng minh thường bao gồm như một phần của ngôn ngữ đặc tả của họ, một ngôn ngữ chức năng thuần túy có thể suy luận theo phương trình.

Người ta có thể muốn tham khảo một cuốn sách như Lập trình được chứng nhận với các loại phụ thuộc để giới thiệu chuyên sâu về loại lý luận này trong một trợ lý chứng minh cụ thể, cụ thể là Coq.


Cảm ơn! Tôi thực sự đang tìm kiếm các kỹ thuật trong Haskell . Bài viết của tôi đã được chỉnh sửa để bao gồm tất cả các mã chức năng, nhưng điều đó vượt quá ý định của tôi.
FK82

1
Tôi không biết các hệ thống được thiết kế để xác minh cụ thể Haskell, nhưng tôi sẽ lưu ý rằng 1) Lõi chức năng của Coq (và Agda) về cơ bản không thể phân biệt được với Haskell (ngoại trừ hạn chế đối với tổng số chức năng) và 2) Các chương trình được xác minh trong Coq và Agda có thể được trích xuất thành Haskell (mặc dù tôi tin rằng trích xuất vào Haskell được hỗ trợ tốt hơn ở Agda, trong đó Coq có nhiều Ocaml-centric hơn)
cody

Tốt để biết! Tuy nhiên, điều này có nghĩa là tôi viết lại chương trình của mình (hoặc các phần có liên quan) trong Coq hoặc Agda. Tôi không nghĩ rằng đó là hợp lý trong trường hợp của tôi.
FK82

Có một vài "mặt trước" rất thử nghiệm cố gắng chuyển đổi Haskell thành Isabelle hoặc trực tiếp chứng minh sự tương đương bằng cách sử dụng Isabelle, nhưng tôi sẽ không nắm giữ quá nhiều cổ phiếu trong thời gian đáo hạn của họ. Tôi nghĩ rằng viết lại mã cuối cùng sẽ làm việc ít hơn.
cody

4

Tôi đề nghị sử dụng logic chương trình. Chúng xử lý tốt hơn nhiều với các hiệu ứng so với hệ thống gõ.

Có rất nhiều logic chương trình cho các ngôn ngữ chức năng. Điều này trở nên thú vị với các hiệu ứng. Xem ví dụ: Lý luận logic cho các hàm bậc cao hơn với trạng thái cục bộ .

Công trình của Arthur Chargeuéraud tích hợp cách tiếp cận logic chương trình với các trợ lý chứng minh, xem ví dụ trang tổng quan này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.