Nếu bạn quen thuộc với xác minh chương trình, bạn có thể thích đọc Câu hỏi trước Nền . Nếu bạn không quen với việc xác minh chương trình thì bạn vẫn có thể trả lời câu hỏi này, nhưng bạn có thể thích đọc Nền trước.
Lý lịch
Người ta thường nói rằng kiểm tra tính đúng đắn một phần là không thể giải quyết được. Để thảo luận, chúng ta hãy chọn một cách rất đặc biệt để đưa ra tuyên bố này chính xác, theo phong cách của Floyd - Hoare. Một sơ đồ là một sơ đồ với một nút ban đầu được phân biệt từ đó tất cả các nút có thể truy cập được. Một chương trình là một sơ đồ có các nút là các lệnh. Có ba loại lệnh (1) giả định giả định q , (2) xác nhận khẳng định q và (3) phép gán v: = e. Ở đây q là một công thức fol (logic thứ nhất), e là một thuật ngữ fol và v là một biến.
Chúng tôi nói rằng một chương trình đúng một phần khi có cách chú thích từng nút x với điều kiện tiên quyết a (x) và điều kiện b (x) sao cho (1) điều kiện tiên quyết của nút ban đầu là hợp lệ, (2) { a (x) } x { b (x) } giữ cho tất cả các lệnh x và (3) ( b (x) ngụ ý a (y) ) là hợp lệ cho tất cả các cạnh từ x đến y . Ở đây bộ ba Hoare được định nghĩa như sau:
- { p } khẳng định q { r } có nghĩa là ( p ngụ ý ( q và r )) là hợp lệ
- { p } giả sử q { r } có nghĩa là (( p và q ) ngụ ý r ) là hợp lệ
- { p } v: = e { r } có nghĩa là (( p với e thay thế cho v ) ngụ ý r ) là hợp lệ
Dưới đây là một cuộc tranh luận tay lượn sóng của lý do tại sao việc kiểm tra này đúng đắn một phần là undecidable: Khi bạn điền vào một số a (x) và một số b (x) bạn cần phải kiểm tra xem một số công thức fol có giá trị, và đó là undecidable.
Một cách điển hình để mã hóa chấm dứt theo đúng một phần là thêm một số xác nhận đặc biệt mà về cơ bản là "kể từ lần cuối tôi bị xử tử, đã có tiến trình chấm dứt." Các xác nhận tiến trình này phải được đặt sao cho tất cả các bước đi vô hạn trên sơ đồ khối (bắt đầu tại nút ban đầu) chứa vô số các xác nhận tiến trình. Để cụ thể hơn, giả sử rằng các xác nhận tiến trình luôn có dạng khẳng định u < v , trong đó u và v là các số nguyên dương, đứng trước phép gán u : = f và được theo sau bởi phép gán v : = u . Ở đây f là mộthàm biến thể , u là giá trị hiện tại của nó và v là giá trị cũ của nó. Bây giờ, vì chúng ta nói về "số nguyên dương" và chúng ta so sánh chúng, chúng ta cần đảm bảo rằng có nhiều hơn một chút so với fol: giả sử số học Peano có sẵn. (Tôi không cảm thấy mạnh mẽ về lựa chọn này. Hãy thoải mái bỏ qua nếu thuận tiện.) Tất nhiên, f có thể sử dụng bất kỳ chức năng và hằng số nào khác được đề cập trong chương trình. (Lưu ý rằng việc thêm các giả định vào đầu chương trình tương đương với việc đưa ra các tiên đề phi logic.)
Bây giờ, nếu chương trình với các xác nhận tiến độ vẫn đúng một phần, thì chúng ta biết rằng chương trình gốc chấm dứt.
Câu hỏi
Đưa ra một chương trình chấm dứt, nó cảm thấy rằng việc đưa ra các chức năng biến thể để xác nhận tiến trình là khó khăn. Nhưng làm thế nào khó? (Tôi biết rằng ngay cả với nền tảng lớn ở trên, tôi vẫn để loại câu hỏi mở này hoặc không xác định, tùy thuộc vào cách bạn muốn xem xét nó.)
Nói cách khác: tôi đang tìm một tài liệu tham khảo chính thức hóa vấn đề giảm chấm dứt thành đúng một phần và sau đó nói điều gì đó về sự phức tạp của nó. Một câu trả lời mà tất cả điều này tất nhiên sẽ được hoan nghênh.