Chúng ta có thể định lượng mức độ gần đúng của một chương trình đúng không?


7

Tôi biết rằng có một cái gì đó gọi là tính đúng một phần, nhưng tôi đã tự hỏi liệu có cách nào để biết mức độ gần đúng của một chương trình bán đúng với một chương trình hoàn toàn chính xác hay không.

Ví dụ: nếu bạn có một chương trình sắp xếp gần như sắp xếp hoàn toàn một mảng, bạn có thể sử dụng logic Hoare để xác định mức độ gần với câu trả lời đúng không? Một cách để làm điều này là biến điều kiện tiên quyết thành một loạt các câu lệnh và xem có bao nhiêu trong số các câu lệnh này là điều kiện tiên quyết yếu nhất, do hậu quả được truyền bá qua chương trình, có thể ngụ ý.

Tuy nhiên, phương pháp này dường như rất thô. Có cách nào khác để làm một cái gì đó như thế này?


2
Quan điểm của tôi là bạn có thể sử dụng logic, nhưng vì bạn đang suy luận về các chương trình, sẽ không có bất kỳ thuật toán chung nào giúp bạn làm điều này. Xem định lý của Rice .
jmite

2
Trong tất cả các trường hợp ngoại trừ nhàm chán, chương trình mắc vô số lỗi. Ý bạn là gì nếu bạn nói một chương trình đúng hơn chương trình khác?
Raphael

@jmite Bạn đang gây ra một sự nhầm lẫn giữa định lượng hiện sinh và phổ quát. Thực tế là không có kỹ thuật chung để trả lời câu hỏi không có nghĩa là không có tên miền phụ thú vị nơi nó có câu trả lời hữu ích. Do đó, câu hỏi vẫn có ý nghĩa nếu ...
babou

3
Tính đúng một phần không có nghĩa là câu trả lời gần như đúng theo bất kỳ ý nghĩa nào, mà chỉ là chúng đúng mỗi khi chương trình kết thúc, có thể chỉ nằm trên một phần của miền dự định . Vì vậy, một chương trình không bao giờ chấm dứt, không tạo ra kết quả, là một phần chính xác đối với bất kỳ đặc điểm kỹ thuật nào. Điều này có thể được mở rộng thành câu trả lời một phần: bất kỳ phần nào của câu trả lời đã được cung cấp, trước khi đi vào một tính toán không có năng suất và không kết thúc, phải hoàn toàn chính xác đối với đặc điểm kỹ thuật (theo nghĩa chính xác), nhưng câu trả lời có thể vẫn chưa hoàn chỉnh .
babou

@Raphael Đó là điều tôi đang thắc mắc. Có cách nào, thông qua việc sử dụng logic, để xem mức độ gần gũi của một chương trình với giải pháp chính xác không? Và có cách nào để so sánh hai chương trình không chính xác với nhau không?
GyCn

Câu trả lời:


5

Độ chính xác một phần không có nghĩa là không phải tất cả các câu lệnh của một đặc tả đều được đáp ứng bởi một thuật toán. Hãy xem bài viết trên Wikipedia về tính đúng đắn :

Tính đúng một phần của thuật toán có nghĩa là nó trả về câu trả lời đúng nếu nó kết thúc.

Tổng số chính xác có nghĩa là nó được đảm bảo bổ sung rằng thuật toán chấm dứt.

Bằng chứng chấm dứt như vậy có thể được thực hiện bằng một biến thể vòng lặp : Để chứng minh rằng một vòng lặp chấm dứt, chúng tôi cho thấy một biểu thức số nguyên bị giảm trong thân vòng lặp và biểu thức luôn luôn không âm. Sau đó, vòng lặp chỉ có thể được lặp lại một số lần hữu hạn. Các B-Phương pháp sử dụng số nguyên như các biến thể trong vòng thời gian của nó. Một thay thế cho một biểu thức số nguyên sẽ là một tập hữu hạn trong đó trong mỗi lần lặp, một phần tử được loại bỏ.

Ví dụ : Một thuật toán đơn giản để khởi tạo một mảng có kích thước n bằng 0:

i := 0
while i<n do
  x[i] := 0
  i := i+1
done

Độ chính xác từng phần có thể được chứng minh bằng cách sử dụng bất biến vòng lặp ("tất cả các phần tử của x in 0..ilà 0" 0<=i,, i<=n). Người ta phải chỉ ra rằng bất biến được hoàn thành khi vào vòng lặp và sau mỗi lần lặp. Sau vòng lặp, chúng ta biết rằng bất biến được thỏa mãn và điều kiện vòng lặp không ( i>=ncùng với bất biến vòng lặp ngụ ý rằng i=n, điều đó một lần nữa ngụ ý "tất cả các phần tử của x in 0..nlà 0"). Ngay cả khi chúng ta quên dòng i := i+1, chúng ta có thể chứng minh tính đúng một phần của thuật toán, tức là mảng sẽ được điền 0 sau khi chấm dứt. Vấn đề là nó không chấm dứt.

Chấm dứt có thể được hiển thị bằng cách chọn n-inhư một biến thể. Với bất biến i<=n, có thể chứng minh rằng biến thể luôn không âm và n-ibị giảm (bằng cách tăng i) trong mỗi lần lặp. Do đó vòng lặp phải chấm dứt. Cùng với tính đúng một phần, tổng độ chính xác được hiển thị.


4

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 ( wikipediawikipedia). Đế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 .GFG

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ó.π


2

Định lượng tính chính xác của các chương trình thực sự là một chủ đề khá nóng trong bối cảnh các phương pháp chính thức, ngày nay. Thay vì đăng một danh sách các tài liệu tham khảo, bạn có thể bắt đầu ở đây (phiên bản đầy đủ ở đây ) và tiếp tục từ các tài liệu tham khảo. Tiết lộ: bài báo này là một tác phẩm của tôi.

Một bản tóm tắt ngắn gọn về công việc này: chúng tôi giới thiệu một chủ nghĩa hình thức đặc tả làm tăng logic thời gian tuyến tính bằng một bộ "các hàm chất lượng". Các chức năng này được lựa chọn bởi nhà thiết kế, do đó cung cấp cho nhà thiết kế khả năng xác định chất lượng khi anh ta hài lòng.

Chúng tôi cho thấy việc kiểm tra mô hình cho logic này là trong PSPACE. Sử dụng các hàm chất lượng phù hợp, bạn có thể đo ví dụ khoảng cách của một mảng từ một mảng được sắp xếp.


  1. Chính thức hóa và lý luận về chất lượng của S. Almagor, U. Boker và O. Kupferman (2013)

1

Về nguyên tắc, có thể diễn đạt điều kiện này bằng cách sử dụng logic như Hoare, nhưng không rõ ràng sẽ rất hữu ích hoặc thực tế để làm như vậy.

Hãy xem xét một hàm trong chương trình của bạn, với một đối số. Giả sử chúng ta có một vị từ , biểu thị điều kiện là câu trả lời đúng cho đầu vào , nghĩa là, nếu tạo đầu ra trên đầu vào thì đầu ra này là đúng. Ngoài ra, giả sử chúng ta có một vị từ thể hiện rằng các câu trả lời và gần nhau. Xác định vị ngữ bằngfP(x,y)yxfyxQ(y,y)yyR(x,y)

R(x,y)y.P(x,y)Q(y,y).

Sau đó R(x,y) diễn tả điều kiện bạn muốn, tức là y gần với câu trả lời đúng cho đầu vào x.

Trong ví dụ của bạn, P(x,y) có thể bày tỏ tuyên bố rằng y là một phiên bản được sắp xếp của xQ(y,y) có thể biểu thị một số số liệu khoảng cách trên danh sách (ví dụ: y có thể được lấy từ y bởi một số lượng nhỏ các chuyển vị).

Bây giờ đó chỉ là vấn đề của đặc điểm kỹ thuật. Có một vấn đề xác minh riêng, nghĩa là xác minh rằng một hàmf đáp ứng thông số kỹ thuật R. Vấn đề xác minh có thể là xấu xí và khó khăn trong thực tế. Và, việc xác minh xem việc triển khai hàm có đáp ứng một thông số cụ thể hay không là không thể nói chung, như các trạng thái jmite. Vì vậy, như mọi khi trong xác minh, bạn luôn phải đối phó với tính không ổn định (ví dụ: không đầy đủ).


Tôi đã thực sự tự hỏi liệu có cách nào để xác định Q chỉ thông qua logic và bằng cách xem xét các chương trình thay vì kết quả của chúng từ đầu vào cụ thể. Hơn nữa, tôi đã tự hỏi nếu q có thể là một phạm vi các giá trị thay vì chỉ đúng / sai.
GyCn

Xem ý kiến ​​của tôi cho câu hỏi. (CC @ user2828752)
babou

1

Không chính xác

Tôi đã viết một câu trả lời đầu tiên về tính đúng đắn một phần, có ý nghĩa kỹ thuật chính xác. Tôi nghĩ tốt hơn để phân tách câu trả lời khác này mà ban đầu tôi mặc dù về mặt kỹ thuật rất khác nhau. Hóa ra nó không hoàn toàn đúng, nhưng cả hai câu trả lời đều đủ dài, vì vậy tôi nghĩ tốt hơn là không hợp nhất chúng

Rõ ràng, có vẻ như OP quan tâm nhiều hơn đến một ý tưởng về các chương trình không đúng một phần, về việc tìm ra câu trả lời không chính xác ở một khía cạnh nào đó, tuy nhiên, tôi đoán, hy vọng không quá xa để đúng.

Thực tế, có hai cách bạn có thể muốn xem xét sự gần gũi để sửa lỗi cho một chức năng:

  • liệu các câu trả lời được tính toán có đúng và không đúng phần hay không

  • cho dù chúng đôi khi đúng, và đôi khi không chính xác.

Nhưng hai khía cạnh này có thể được kết hợp. Nếu bạn quản lý để xác định một cái gì đó như khoảng cách giữa các giá trị trong bộ câu trả lời, thì bạn có thể cố gắng kéo dài nó thành khoảng cách giữa các hàm, một cách không chính thức, một loại tích phân của khoảng cách kết quả của chúng cho mọi điểm trong miền của chúng hoặc một số chức năng khác của tính không chính xác cho mọi điểm của miền.

Sau đó, vấn đề có thể là xác định xem khoảng cách giữa hàm hoàn toàn chính xác và hàm được lập trình không vượt quá một số ngưỡng cố định hay liệu lỗi về kết quả của việc áp dụng hàm không vượt quá cho mỗi điểm miền có một ngưỡng có thể liên quan đến điểm tên miền này.

Những kỹ thuật này cũng có thể hữu ích để thực hiện tính toán càng chính xác càng tốt, với dữ liệu theo nghĩa nào đó không chính xác để bắt đầu, chẳng hạn như kết quả thử nghiệm. Khi mức độ không chính xác có thể được đánh giá hoặc đưa ra giả thuyết, điều này có thể giúp theo dõi ảnh hưởng của nó đối với tính toán.

Điều này có lẽ rất phụ thuộc vào loại dữ liệu bạn đang tính toán.

Tôi tin rằng đã có một lý thuyết như vậy cho điện toán số, và thường được áp dụng cho công việc kỹ thuật, nhưng tôi biết rất ít về nó. Các khía cạnh cơ bản thường được dạy trong các khóa học vật lý.

Nhiều tính toán số giao dịch với số thực. Không thể chính xác (chính xác) vì máy tính chỉ sử dụng xấp xỉ các số thực (có một khái niệm điện toán với các số học thực sự chính xác , nhưng nó là một chủ đề rất khác, rất liên quan về mặt lý thuyết với tính chính xác một phần ). Các phép tính gần đúng trong tính toán số gây ra các lỗi nhỏ ( lỗi làm tròn số) có thể tuyên truyền, và đôi khi phát triển ra khỏi tầm tay. Do đó, các nhà số học đã phát triển các kỹ thuật để phân tích các chương trình của họ và đánh giá mức độ sát sao của câu trả lời với kết quả chính xác. Họ thực sự thiết kế các thuật toán của mình để giảm thiểu các lỗi tính toán, ngoài các tiêu chí thông thường khác, bởi vì thứ tự của một số thao tác có thể có ảnh hưởng sâu sắc đến kích thước của lỗi được lan truyền.

Những kỹ thuật này cũng rất quan trọng vì chúng thường phải xử lý dữ liệu vật lý chỉ "gần đúng", nghĩa là được đưa ra với một số xấp xỉ. Xử lý các lỗi trên đầu vào cùng với các lỗi tính toán, và sự lan truyền của chúng là, đối tượng của nghiên cứu quan trọng trong lĩnh vực Phân tích số . Nhưng tôi không phải là chuyên gia. Một số chương trình sẽ tính cả kết quả gần đúng và khoảng lỗi xung quanh nó trong đó câu trả lời đúng sẽ được tìm thấy. Hợp chất này cả lỗi đo lường vật lý và lỗi tính toán số.

Tuy nhiên, trong khi điều này về cơ bản là không thể tránh khỏi trong toán học số đối phó với các số thực (một tập hợp các giá trị liên tục), thì không có giới hạn tích hợp tương tự nào về tính toán biểu tượng , do đó không có sự khuyến khích rõ ràng, tiên nghiệm, để phát triển các kỹ thuật tương tự. Hơn nữa, nó có thể không rõ ràng để làm điều đó.

Tuy nhiên, một cái nhìn cận cảnh về các kỹ thuật xử lý lỗi trong phân tích cú pháp và xử lý ngôn ngữ tự nhiên cho thấy rằng họ thực sự sử dụng một quan điểm khái niệm tương tự, ngay cả trong bối cảnh hoàn toàn mang tính biểu tượng.

Câu trả lời của Shaull dường như chỉ ra rằng người ta có thể quan tâm đến những ý tưởng gần đúng như vậy trong công nghệ phần mềm , nhưng tôi không chắc nó liên quan đến các khái niệm tương tự. Tôi đã không đọc bài báo của anh ấy và tôi đã đọc rất ít về chủ đề này, và câu trả lời không đưa ra gợi ý nào về các kỹ thuật anh ấy có thể xem xét.

Nó có thể là một ý tưởng rất khác, vì công nghệ phần mềm rất quan tâm đến việc đo lường mức độ lỗi của phần mềm, nhưng vô tình có lỗi. Tôi biết rằng một số phân tích thống kê cho thấy các thông số khác nhau có thể đo được trên một chương trình có liên quan thống kê đến chất lượng của chương trình, khả năng duy trì và khả năng xảy ra lỗi.

Các ý tưởng của câu trả lời gần đúng trong phân tích số (ví dụ) không phải là vấn đề của lỗi, mà là xử lý các hạn chế của phép đo vật lý, cũng như các hạn chế của điện toán (vốn có thể đếm được) khi nó được sử dụng để xử lý các số thực ( đó là không thể đếm được). Nếu đó là một lỗi, đó là lỗi của vũ trụ chúng ta, không phải của các lập trình viên.

Cố gắng thống nhất các vấn đề: đo lường một phần chính xác và không chính xác

Sau đây là hoàn toàn suy đoán, và một dấu hiệu của công việc có thể được thực hiện. Tôi nghi ngờ rằng ít nhất một số đã được thực hiện (tôi đã không tìm kiếm kỹ lưỡng). Nhưng tôi không nhớ là đã đọc về nó và không thể đưa ra các tài liệu tham khảo thích hợp. Mô tả chỉ là một bản phác thảo, và có khả năng phần lớn nó nên được tinh chỉnh hoặc làm cho chính xác hơn, bao gồm cả việc lựa chọn các định nghĩa. Tôi không thể đảm bảo bất cứ điều gì mà tôi chưa hoàn thành về mặt toán học (và thậm chí sau đó ... :).

Đã có công bố về tính toán số thực dựa trên các định nghĩa về xấp xỉ số thực tổ chức chúng trong một miền Scott. Xấp xỉ các thực tế với các khoảng chắc chắn là một cách để làm điều đó, và đó là một cách thích hợp để phát triển một lý thuyết về khả năng tính toán trên các thực tế. Tôi đoán là nó đã được thực hiện, và nó cung cấp một cơ sở tốt cho một lý thuyết ngữ nghĩa và để phân tích các chương trình crunching số thực cùng với đánh giá độ chính xác của kết quả như mô tả ở trên. (Tôi không có cơ hội để hỏi một chuyên gia).

Bây giờ đây có thể là một gợi ý về những gì cần làm với tính toán tượng trưng hoặc tính toán trên các số nguyên, để có được một khái niệm về tính toán gần đúng, đặc biệt là sự hiện diện của dữ liệu phức tạp, tức là sử dụng cấu trúc dữ liệu.

Ý tưởng cơ bản giống như thực tế, sử dụng khái niệm gần đúng và sắp xếp miền tính toán của bạn (các giá trị bạn tính toán) làm miền Scoot. Tuy nhiên, nó sẽ cần phải là một cái gì đó giống như một mạng tinh thể , trong đó hai yếu tố phải có giới hạn dưới lớn nhất (glb hoặc đáp ứng) cũng như giới hạn trên thấp nhất (mỡ hoặc tham gia). Trong trường hợp số, glb tương ứng với khoảng nhỏ nhất chứa 2 khoảng khác và giao nhau giữa các khoảng.

Lấy ví dụ sắp xếp của chúng tôi từ câu trả lời đầu tiên , sắp xếp một mảng gồm 5 số[25,36,3,9,12], chúng ta có thể coi tất cả các mảng một phần là một mạng và có:

  • lub([3,,,,36],[,9,,,36])=[3,9,,,36]

  • glb([3,,,,36],[7,9,,,36])=[,,,,36]

Bây giờ, nếu bạn xác định một khái niệm khoảng cách trong cấu trúc thứ tự, thì bạn có thể xác định khoảng cách giữa hai câu trả lời có thể là tổng khoảng cách của chúng với glb của chúng (hoặc một số hàm tăng đối xứng và đơn điệu khác của hai khoảng cách này).

Nếu miền không có glb , bạn có thể lấy khoảng cách theo từng giới hạn dưới (thực tế chỉ là các phần tử tối đa của tập hợp giới hạn dưới) và xem xét khoảng cách nhỏ nhất như vậy (hoặc có thể là một số chức năng khác của khoảng cách yếu tố tối đa, với các thuộc tính đầy đủ).

Điểm không quan trọng là có một định nghĩa dễ hiểu về khoảng cách chính xác so với dữ liệu bạn thao tác.

Sau đó, khái niệm khoảng cách này sau đó có thể được mở rộng thành khoảng cách mê hoặc giữa các chức năng, đây sẽ là một câu trả lời cho câu hỏi được hỏi. Tôi không chắc có bao nhiêu bộ máy toán học cần thiết, vì một số hình thức tích hợp (theo nghĩa tính toán) có thể cần thiết.

Một tìm kiếm đáng chú ý trên web về các vấn đề này đã đưa ra bài báo sau: " Hướng tới tính toán khoảng cách giữa các chương trình thông qua Scott Domains " đã 15 năm tuổi. Nó sẽ cung cấp một nền tảng toán học tốt hơn. Nhưng tôi đã tìm thấy nó sau khi viết câu trả lời này.

Vấn đề này có thể có thể được giải quyết bằng logic khác, nhưng tôi nghi ngờ đây không phải là vấn đề đối với khái niệm gần đúng trong các miền của các giá trị. Có nhiều cách khác để xây dựng chúng hơn là cách được mô tả ở trên cho mảng. Xác định các xấp xỉ cho dữ liệu có thể là một phần của định nghĩa về kiểu dữ liệu trừu tượng hoặc của một lớp trong lập trình OO.

Lưu ý: Tôi không mong đợi kết nối này với câu trả lời trước của tôi. do đó hai câu trả lời riêng biệt.

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.