Các thuật toán đảo ngược chương trình cho các chương trình bậc cao


10

Thuật ngữ đảo ngược chương trình có nhiều sắc thái ý nghĩa, nhưng có lẽ đã bắt đầu với tác phẩm năm 1956 của J. McCarthy The Inversion of Function Defined by Turing Machines trong bối cảnh AI. Cho đến nay, nhiều kết nối giữa đảo ngược chương trình và các lĩnh vực khác đã được phát hiện, ví dụ lập trình đảo ngược (vật lý và logic), đánh giá một phần, xác minh, lập trình hai chiều, lập trình logic và học máy.

Chương trình đảo ngược là gì? Đánh giá ban đầu của nó một cái gì đó như thế này: Cho một chương trình dùng các tham số kiểu và trả kết quả của loại , tạo ra một chương trình đó là "bằng cách nào đó" nghịch đảo của . Tôi đang cố tình mơ hồ ở đây, vì khái niệm này có thể được (và) được làm rõ theo nhiều cách khác nhau: ví dụ có bắt buộc phải tiêm không? Có nên trả lại toàn bộ hay chỉ một số mà ?A B P - 1 P P P - 1 ( b ) a P ( a ) = bP:ABABP1PPP1(b)aP(a)=b

Có những cách chung để đảo ngược một chương trình, ví dụ như sử dụng đường chéo như đã được McCarthy chỉ ra, hoặc sử dụng đánh giá một phần, nhưng chúng có xu hướng không hiệu quả. Ngoài ra, hầu hết các công việc về đảo ngược chương trình mà tôi quen thuộc dường như không đối phó với các ngôn ngữ lập trình bậc cao đầy đủ hơn (ví dụ -calculi).λ

Yêu cầu tham khảo. Trạng thái tiên tiến trong các thuật toán rõ ràng để đảo ngược chương trình của -calculi (không hạn chế về thứ tự cao hơn) là gì?λ

Câu trả lời:


5

Không có một lượng lớn công việc trong không gian này, nhưng công việc ở đó là gì, khá thú vị.

  1. Torben Mogensen đã làm việc về vấn đề này. Đây là hai giấy tờ của mình.

    Bài báo đầu tiên đưa ra một thuật toán cho các chương trình chức năng bậc nhất, và bài thứ hai mở rộng nó lên bậc cao hơn. Việc mô tả chính xác khi nào thuật toán này sẽ thành công được để lại cho công việc trong tương lai.

  2. Tetsuo Yokoyama, Holger Bock Axelsen và Robert Glück.

    Điều này mô tả ngôn ngữ lập trình RFun, đảo ngược các chương trình chức năng bậc nhất, nhưng thực thi các ràng buộc xác định ngược và ngược, đảm bảo rằng đánh giá ngược cũng nhanh như trước. (Họ đã viết một số bài báo khác về chủ đề này, mà tôi đã gặp khó khăn trong việc nắm giữ.)

  3. Stefan Bohne và Baltasar Trancón Widemann.

    Đây là một tờ giấy thực sự gọn gàng! Nó quan sát thấy rằng (a) bạn có thể xây dựng một thể loại trong đó các hình thái là các hàm được ghép với nghịch đảo của chúng (đối với bất kỳ khái niệm cụ thể nào về nghịch đảo bạn đang sử dụng) và (b) thể loại này có cấu trúc nhỏ gọn dao găm. Điều này có nghĩa là bạn có thể viết một chương trình với một loại kỷ luật tuyến tính hơi thú vị, và sau đó đọc các diễn giải về phía trước và ngược từ ngữ nghĩa.

    Chúng đưa ra một ngôn ngữ chức năng với một cú pháp khá hoang dã: các biểu thức tùy ý có thể được sử dụng làm mẫu và tính đảo ngược làm cho nó trở nên hợp lý.

  4. Francesco Tiezzia, Nobuko Yoshida

    Tôi chưa đọc cái này, nhưng chỉ phát hiện ra nó khi Google tìm kiếm các giấy tờ khác. Với các tác giả và chủ đề, tôi nghi ngờ đây là con hẻm của bạn!


Cảm ơn. (2, 3, 4) không thực hiện đảo ngược chương trình, nhưng thiết kế ngôn ngữ lập trình trong đó các chương trình có thể đảo ngược / đảo ngược theo định nghĩa. Đây là một vấn đề liên quan chặt chẽ, nhưng khác nhau. Trong thực tế, tôi không hoàn toàn rõ ràng về những vấn đề này liên quan như thế nào. Tôi đã không thấy bán đảo ngược trước khi có thể nó đã giải quyết được vấn đề vì đảo ngược dường như là một trường hợp cạnh của bán đảo ngược? Bài viết thứ hai của BTW Mogensen chỉ lên đến bậc 2.
Martin Berger

@MartinBerger: Tôi đoán mối quan hệ phụ thuộc vào những gì bạn muốn sử dụng đảo ngược chương trình cho! Tôi đã quan tâm đến vấn đề này bởi vì tôi đang xem xét suy luận kiểu (nếu bạn có các hàm cấp độ loại, sẽ rất hữu ích khi có thể đảo ngược các hàm đó để tìm ra các cảnh báo định lượng) và vì vậy, việc hạn chế ngôn ngữ không phải là một trình diễn tôi. Bạn đang cố làm gì vậy?
Neel Krishnaswami

Ngay bây giờ tôi quan tâm đến vấn đề chung, trừu tượng. Quan tâm của tôi về đảo ngược chương trình đến từ xác minh chương trình. Và tôi không thể tìm thấy bất cứ nơi nào chỉ cần một thuật ngữ lambda (từ PCF say hoặc STLC) và đảo ngược nó. Có phải vì tôi không tìm đúng chỗ?
Martin Berger
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.