Tóm lại:
Tính đúng đắn một phần là vấn đề chấm dứt, không phải là tính chính xác của những gì được tính toán. Một hàm là đúng một phần đối với một đặc tả iff bất cứ điều gì nó tính toán là chính xác, khi nó kết thúc. Ý tưởng này có thể được mở rộng để tính toán các câu trả lời (một phần) không đầy đủ. Bất cứ điều gì được tính toán của câu trả lời là đúng, nhưng tại một thời điểm nào đó, chương trình có thể đi vào một vòng lặp không kết thúc, có thể mà không tính toán tất cả các câu trả lời. Câu trả lời một phần là xấp xỉ của câu trả lời hoàn chỉnh.
Cấu trúc gần đúng này là một thứ tự từng phần, là khái niệm cơ bản của các lĩnh vực ngữ nghĩa của Scott, và nó thực sự có thể được sử dụng để trả lời một cách giải thích khác cho câu hỏi. Chúng ta có thể đo khoảng cách giữa một câu trả lời đúng và một câu trả lời không hoàn toàn chính xác không, chẳng hạn như có một phần tử của một mảng sai (chứ không phải là không xác định). Một cách để xác định khoảng cách như vậy là xem xét thứ tự gần đúng và liên kết hai câu trả lời không tương thích (câu trả lời đúng và câu không chính xác) với câu trả lời một phần tốt nhất là xấp xỉ cả hai. Vấn đề này nhanh chóng được xem xét từ quan điểm phân tích số, trong đó phân tích chính xác là điều cần thiết, và của một số lĩnh vực khác.
Điểm thứ hai này thực sự được khám phá trong câu trả lời thứ hai cho câu hỏi, vì ban đầu tôi không nhận ra rằng hai câu trả lời có thể có mối liên hệ. Nhưng cả hai câu trả lời đều khá dài và tôi không cảm thấy khôn ngoan khi hợp nhất chúng khi tôi nhận ra kết nối.
Một cái nhìn đơn giản đầu tiên về tính đúng đắn một phần
Không có thứ gọi là (một phần) đúng theo nghĩa tuyệt đối . Một chương trình là chính xác nếu nó đáp ứng một đặc điểm kỹ thuật, tuy nhiên được đưa ra. Đặc điểm kỹ thuật có thể là một chương trình khác, hoặc một tuyên bố logic, hoặc bất cứ điều gì có thể được chính thức hóa. Thông số kỹ thuật phải bằng cách nào đó bao gồm thông tin về thời điểm chương trình kết thúc, có thể luôn luôn (điều này thực sự được giả định trong hầu hết các định nghĩa, do đó không cần phải nói gì phức tạp hơn). Trên thực tế, tên miền có thể bị hạn chế trong thông số kỹ thuật đối với phần dự kiến chấm dứt, do đó việc chấm dứt luôn được mong đợi , điều này có thể biện minh cho việc chấm dứt giả định trong toàn bộ miền theo định nghĩa thông thường ( wikipedia và wikipedia). Đến lượt nó, điều này đặt ra một giả định ngầm định đối với bất kỳ đặc điểm kỹ thuật nào, có thể hoặc không thể thuận tiện.
Một chương trình là chính xác đối với một đặc tả
iff nó chấm dứt bất cứ khi nào thông số kỹ thuật nói rằng nó nên, và với kết quả đáp ứng các đặc điểm kỹ thuật. Nó đúng một phần nếu đôi khi nó không chấm dứt khi thông số kỹ thuật nói, nhưng luôn cho kết quả chính xác khi kết thúc.PS
Kết quả là, một chương trình không bao giờ chấm dứt là đúng một phần đối với bất kỳ đặc điểm kỹ thuật nào .
Tôi cũng chọn một định nghĩa hơi mở rộng vì nó tương ứng chính xác với khái niệm gần đúng trong các lĩnh vực ngữ nghĩa của Scott , chẳng hạn như được sử dụng trong ngữ nghĩa học biểu thị. Một miền Scott bao gồm một thứ tự một phần tương ứng chính xác với ý tưởng về tính chính xác một phần (hai cách sử dụng từ "một phần" có phần không liên quan). Hàm là và xấp xỉ của hàm là kết thúc mỗi khi
kết thúc và cả hai đều cho kết quả như nhau. Vì vậy, có thể cho kết quả khi không. Và chúng ta có thể nói rằng đúng một phần đối với hoặcFGGFGFFGFxấp xỉ , hoặc .GF⊑G
Những ý tưởng này rất cần thiết để xác định ngữ nghĩa của các hàm với vòng lặp (hoặc đệ quy) là giới hạn của một tập hợp các hàm vô hạn không có vòng lặp hoặc đệ quy. Xem ví dụ wikipedia , hoặc một bài thuyết trình rất không chính thức về SE .
Logic Hoare tiêu chuẩn sẽ chỉ hoạt động để chứng minh tính đúng đắn một phần và cần được mở rộng để giải quyết các thuộc tính chấm dứt, do đó để giải quyết toàn bộ tính chính xác (xem wikipedia ). Có các ví dụ thực hiện của các phần mở rộng cụ thể như vậy.
Chứng minh tổng số tiền chính xác để chứng minh tính đúng đắn và chấm dứt một phần. Hoare logic là khá thích hợp cho chính xác một phần. Chứng minh chấm dứt thường đòi hỏi một bằng chứng bằng cảm ứng (tái phát), đó là cách tiếp cận tự nhiên để chứng minh mọi thứ trong ngữ nghĩa của Scott (vì chính ngữ nghĩa được định nghĩa theo cách đó, theo quy nạp). Câu trả lời của danielp cho thấy cách cảm ứng như vậy có thể bổ sung cho một bằng chứng trong logic của Hoare.
Để định lượng tính chính xác một phần, giả sử bạn vẫn muốn làm như vậy, có thể bằng cách nào đó xác định các phần của miền nơi chương trình thực hiện hoặc không chấm dứt hoặc một số thuộc tính của các phần đó.
Mở rộng cho các kết quả phức tạp, áp dụng cho ví dụ sắp xếp.
Trên thực tế, vấn đề có thể phức tạp hơn một chút, khi bạn xem xét các câu trả lời phức tạp, chẳng hạn như cấu trúc dữ liệu (đó là trường hợp khi sắp xếp mảng). Đặc tả có thể yêu cầu tính toán hai câu trả lời (nghĩa là một cặp) và đối với một số phần của miền đầu vào, một chương trình thực tế có thể tìm thấy một phần tử của cặp, nhưng không kết thúc trong khi tính toán phần còn lại, trong các trường hợp khác chỉ tìm thấy phần còn lại yếu tố, hoặc tìm cả hai, hoặc không tìm thấy. Điều này vẫn gần đúng theo nghĩa của Scott, và một chương trình như vậy là đúng một phần.
Tổng quát hơn, ý tưởng gần đúng theo nghĩa Scott áp dụng cho dữ liệu cũng như cho chương trình. Đối với điều đó, một cách không chính thức, bạn cần khái niệm về một câu trả lời chưa biết (chưa được tính toán, có thể không bao giờ được biết nếu tính toán của nó không chấm dứt). Nó thường được biểu thị bằng ký hiệu . Cặp xấp xỉ . Những gì bạn nhận được trên một chương trình cung cấp 36 phần và sau đó không kết thúc có thể được biểu thị bằng .⊥(⊥,36)(25,36)(⊥,36)
Làm thế nào điều này có thể được áp dụng cho một chương trình sắp xếp các mảng gồm năm số nguyên? Giả sử bạn viết chương trình SORT5 chạy song song với ứng dụng chính của bạn (tôi đang cố gắng biến mọi thứ thành hiện thực) và được cho là sắp xếp một mảng như vậy cho ứng dụng. Chương trình SORT5 có nhiệm vụ lưu trữ kết quả của nó trong một số mảng do ứng dụng cung cấp và nó có thể làm điều đó một cách riêng biệt cho từng thành phần, ngay khi nó biết nơi đặt nó. Đầu tiên, nó tìm kiếm lớn nhất và nhỏ nhất và lưu trữ chúng ở cả hai đầu, sau đó nó cố gắng thực hiện đệ quy (hoặc bất cứ điều gì), nhưng có một lỗi gửi nó vào một vòng lặp vô hạn mà không có kết quả nào thêm. Ứng dụng chính vẫn nhận được một phần câu trả lời. Nếu mảng được sắp xếp là , câu trả lời được cung cấp là[25,36,3,9,12][3,⊥,⊥,⊥,36]thay vì
. Bất cứ điều gì được cung cấp là chính xác, và phần còn lại không được tính toán, do đó bạn chỉ có một phần của câu trả lời . Do đó, bạn có một xấp xỉ của kết quả mong muốn. Nếu bạn có thể chứng minh rằng đó luôn là trường hợp, thì chương trình lỗi SORT5 của bạn không chấm dứt vẫn đúng một phần đối với đặc điểm kỹ thuật của chương trình sắp xếp.[3,9,12,25,36]
Một chương trình đúng một phần có thể hữu ích. Có thể là bạn không thực sự cần sắp xếp, mà chỉ là yếu tố lớn nhất và nhỏ nhất. Trong trường hợp đó, thực tế là chương trình sắp xếp của bạn SORT5 không chấm dứt và chỉ đúng một phần sẽ không thành vấn đề, và ứng dụng của bạn sẽ hoạt động và hy vọng chấm dứt với một câu trả lời đúng.
Nhưng ai sẽ ngăn chặn thuật toán sắp xếp giả mạo của bạn sẽ lãng phí sức mạnh tính toán? Có các chiến lược tính toán (đánh giá lười biếng), sẽ không chạy chương trình con khi không cần thêm thông tin về kết quả của nó. Vì vậy, sau khi bạn có phần tử lớn nhất và nhỏ nhất, chương trình SORT5 sẽ được giữ cho đến khi các phần tử khác được yêu cầu.
Trong trường hợp này, tất nhiên, có thể có một cách định lượng độ chính xác một phần. Tuy nhiên tôi không chắc nó sẽ rất hữu ích.
Trong bối cảnh này, cần phải sửa lại một chút định nghĩa, mà tôi đang làm phần nào không chính thức:
Chương trình P đúng một phần đối với thông số kỹ thuật S iff đưa ra câu trả lời hoàn chỉnh đáp ứng đặc điểm kỹ thuật trước khi kết thúc hoặc cung cấp một phần câu trả lời đáp ứng thông số kỹ thuật trước khi đi vào tính toán không kết thúc mà không cung cấp thêm phần nào của câu trả lời .
Sau đó, một chương trình không bao giờ chấm dứt và không tạo ra một phần kết quả nào, là một phần chính xác đối với bất kỳ đặc điểm kỹ thuật nào.
Lưu ý rằng định nghĩa này bỏ qua một chương trình tiếp tục tính toán, bao giờ tạo ra các phần mới của câu trả lời. Nhưng vì nó không tạo ra infinitesimals (tôi không biết rằng điều này có thể có ý nghĩa tính toán), nên nó thực sự đang tính toán một câu trả lời vô hạn.
Các kỹ thuật này thực sự có thể rất hiệu quả để chính thức hóa ngữ nghĩa tính toán của đối tượng vô hạn (chỉ dành cho người dùng rất kiên nhẫn), chẳng hạn như biểu diễn chính xác thập phân (hoặc nhị phân) của giá trị của hoặc danh sách vô hạn. Có những ứng dụng thú vị khác. Nhưng điều này khác xa với câu hỏi ban đầu, và đó là lý do tại sao tôi bỏ nó.π