Làm thế nào để bạn kiểm tra nếu hai thuật toán trả về cùng một kết quả cho bất kỳ đầu vào nào?


17

Làm thế nào để bạn kiểm tra xem hai thuật toán (giả sử sắp xếp Hợp nhất và sắp xếp Naïve) trả về cùng một kết quả cho bất kỳ đầu vào nào, khi tập hợp tất cả các đầu vào là vô hạn?

Cập nhật: Cảm ơn bạn Ben đã mô tả làm thế nào điều này là không thể thực hiện bằng thuật toán trong trường hợp chung. Câu trả lời của Dave là một bản tóm tắt tuyệt vời về cả phương pháp thuật toán và thủ công (tùy theo sự dí dỏm và ẩn dụ của con người) không phải lúc nào cũng hiệu quả, nhưng khá hiệu quả.


5
như yuval đã nói, không có quy trình nào có thể xác định điều đó cho bất kỳ hai chương trình nào. nhưng trong trường hợp đặc biệt như ví dụ của bạn, bạn có thể chứng minh điều đó: ví dụ nếu bạn chứng minh rằng cả hai thuật toán của bạn trả về một chuỗi đã sắp xếp và ổn định, bạn sẽ hoàn thành.
Sasho Nikolov

1
Bạn có muốn một kỹ thuật / thuật toán tự động hoặc một tập hợp các kỹ thuật thủ công?
Dave Clarke

@SashoNikolov, nếu hiệu suất được coi là một phần của đầu ra, bạn cũng phải cho thấy cả hai hoạt động trong cùng một độ phức tạp không gian / thời gian.
edA-qa mort-ora-y

1
Bạn có nghĩa là "kiểm tra" hoặc chứng minh? Có nghĩa là "bất kỳ đầu vào" hoặc tất cả các đầu vào? Động lực và bối cảnh cho câu hỏi là gì?
Kaveh

2
@AndresRiorio: Các kỹ thuật chứng minh khác với các thuật toán giải quyết vấn đề chung. Ví dụ, vấn đề tạm dừng là không thể giải quyết được nhưng chắc chắn có thể chứng minh việc chấm dứt nhiều chương trình (bằng tay hoặc tự động heuristic).
Raphael

Câu trả lời:


16

Trái ngược với những gì người nói nay nói, có nhiều kỹ thuật hiệu quả để làm điều này.

  • Bisimulation là một cách tiếp cận. Xem ví dụ, bài viết của Gordon về Coindulation và Lập trình chức năng .

  • Một cách tiếp cận khác là sử dụng các lý thuyết vận hành về sự tương đương của chương trình, chẳng hạn như công việc của Forge .

  • Cách tiếp cận thứ ba là xác minh rằng cả hai chương trình đều đáp ứng cùng một đặc tả chức năng. Có hàng ngàn bài báo về phương pháp này.

  • Cách tiếp cận thứ tư là chỉ ra rằng một chương trình có thể được viết lại thành chương trình kia bằng cách sử dụng các phép biến đổi chương trình âm thanh .

Tất nhiên không có phương pháp nào trong số này là hoàn thành do tính không ổn định, nhưng khối lượng và khối lượng công việc đã được sản xuất để giải quyết vấn đề.


heu · tăng · tic . [Gr. "khám phá"] n. 1. Một kỹ thuật được thiết kế để giải quyết vấn đề mà bỏ qua liệu giải pháp có thể được chứng minh là đúng hay không, nhưng thường tạo ra giải pháp tốt hoặc giải quyết vấn đề đơn giản hơn có chứa hoặc giao với giải pháp cho vấn đề phức tạp hơn. 2. ( Theor. ) Một thuật toán không hoạt động.
JeffE

1
Bart Simpson: "Không thể thắng. Đừng thử."
Dave Clarke

9
@JeffE: Nếu bạn muốn kiểm tra xem hai thuật toán có trả về cùng một kết quả hay không, bạn hãy làm một bằng chứng. Có rất nhiều kỹ thuật tốt để làm điều này. Chắc chắn, tất cả các phương pháp là không đầy đủ, nhưng ai quan tâm? Định lý bất toàn của Goedel không phải là một lý do để từ bỏ toán học!
Neel Krishnaswami

3
@JeffE Chỉ vì không chức năng tính toán để xác định xem hai thuật toán tùy ý có trả về cùng một kết quả không có nghĩa là bạn không thể trả lời câu hỏi cho bất kỳ hai thuật toán cụ thể nào , đặc biệt là quá trình tìm kiếm bằng chứng không phải là tính toán chức năng . Tương tự, có rất nhiều bài báo chứng minh việc chấm dứt được bảo đảm cho các thuật toán cụ thể, bất kể thực tế là không thể xác định một cách máy móc liệu một thuật toán tùy ý sẽ luôn chấm dứt.
Bến

2
Trong thực tế, hai thuật toán được cho là tính toán cùng một hàm hầu như không bao giờ cho phép chứng minh tương đương dựa trên cơ sở bisimulation. (Trong trường hợp các thuật toán sắp xếp được đề cập ở trên, các giai đoạn trung gian của các vòng lặp / đệ quy là khác nhau.) Tôi nói rằng sử dụng logic Hoare cũ tốt để cho thấy rằng cả hai đều thực hiện cùng một đặc điểm kỹ thuật của hành vi I / O là cách đi.
Kai

10

Để giải thích một chút về các tuyên bố "không thể", đây là một bản phác thảo bằng chứng đơn giản.

Chúng ta có thể mô hình hóa các thuật toán với đầu ra bằng Turing Machines tạm dừng với đầu ra của chúng trên băng của chúng. Nếu bạn muốn có các máy có thể dừng bằng cách chấp nhận đầu ra trên băng của chúng hoặc từ chối (trong trường hợp không có đầu ra), bạn có thể dễ dàng đưa ra một mã hóa cho phép bạn mô hình hóa các máy này với "tạm dừng hoặc dừng, không," không có từ chối "máy móc.

Bây giờ, giả sử tôi có một thuật toán P để xác định xem hai TM như vậy có cùng một đầu ra cho mỗi đầu vào hay không. Sau đó, được cung cấp TM A và đầu vào X , tôi có thể xây dựng TM B mới hoạt động như sau:

  1. Kiểm tra xem đầu vào có chính xác X không
  2. Nếu có, sau đó nhập một vòng lặp vô hạn
  3. Nếu không, sau đó chạy A trên đầu vào

Bây giờ tôi có thể chạy P trên MộtB . B không dừng lại trên X , nhưng có cùng một đầu ra với A cho tất cả các đầu vào khác, vì vậy nếu và chỉ khi A không dừng trên X thì hai thuật toán này có cùng một đầu ra cho mọi đầu vào. Nhưng P được cho là có thể cho biết hai thuật toán có cùng một đầu ra cho mỗi đầu vào hay không, vì vậy nếu chúng ta có P, chúng ta có thể biết liệu một máy tùy ý có dừng trên một đầu vào tùy ý hay không, đó là Vấn đề Dừng. Vì Vấn đề dừng được biết là không thể giải quyết được, P không thể tồn tại.

Điều này có nghĩa là không có cách tiếp cận chung (tính toán) để xác định xem hai thuật toán có cùng một đầu ra luôn hoạt động hay không, do đó bạn phải áp dụng lý luận cụ thể cho cặp thuật toán bạn đang phân tích. Tuy nhiên, trong thực tế, có thể có các phương pháp tính toán hoạt động cho các lớp thuật toán lớn, và chắc chắn có những kỹ thuật bạn có thể sử dụng để cố gắng đưa ra bằng chứng cho bất kỳ trường hợp cụ thể nào. Câu trả lời của Dave Clarke cung cấp cho bạn một số điều có liên quan để xem xét ở đây. Kết quả "không thể áp dụng" chỉ áp dụng để đưa ra một phương pháp chung sẽ giải quyết vấn đề một lần và mãi mãi, cho tất cả các cặp thuật toán.


Có lẽ của tôi chỉ hoạt động để sắp xếp các thuật toán. (câu hỏi khiêu khích)P
Raphael

@Raphael Vâng, đối số tôi đã phác thảo không nói gì về một P bị hạn chế như vậy , chỉ có điều là một tổng quát hoàn toàn không thể tồn tại. Bản năng của tôi là vấn đề tạm dừng vẫn không thể giải quyết được ngay cả khi bạn hạn chế nó ở "thuật toán sắp xếp" thay vì thuật toán chung, trong trường hợp đó, bằng chứng không thể chấp nhận được, mặc dù tôi chưa bao giờ nghe thấy một tuyên bố như vậy.
Bến

2
Tổng quát hơn, định lý của Rice nói rằng không có cách tính toán nào để chứng minh điều gì đó về thuật toán, ngay khi có ít nhất một thuật toán có thuộc tính mà bạn đang cố chứng minh và ít nhất là một thuật toán không có. Ví dụ: được đưa ra một thuật toán A, không có chức năng tính toán nào lấy thuật toán B làm đầu vào và kiểm tra xem B có tương đương với A.
Gilles 'SO- ngừng trở thành ác quỷ'

Điều quan trọng cần lưu ý là định lý của Rice chỉ áp dụng cho các thuộc tính của ngôn ngữ , không áp dụng cho Turing Machines (khi bạn sử dụng các định lý đó làm mô hình "thuật toán" của mình). Nếu hai máy Turing tồn tại có thể tồn tại cả hai cùng một ngôn ngữ nhưng một máy có thuộc tính và máy kia không có, thì định lý của Rice không áp dụng và có thể có một phương pháp tính toán chung để kiểm tra thuộc tính. Nhưng định lý của Rice áp dụng rõ ràng cho trường hợp này, vâng.
Bến

2

Nói chung là không thể, nhưng nhiều ràng buộc có thể làm cho nó có thể. Ví dụ: bạn có thể kiểm tra sự tương đương của hai chương trình mã đường thẳng bằng cách sử dụng BDD. Thi hành tượng trưng có thể xử lý nhiều trường hợp khác.


1

Không thể nghĩ ra một thuật toán chứng minh sự bình đẳng này nói chung. Gợi ý: giảm từ vấn đề Dừng.


Nhiều kỹ thuật tồn tại, mặc dù không có kỹ thuật nào hoàn toàn tự động.
Dave Clarke

Tôi không biết là có thể hay không, bởi câu trả lời của bạn chỉ là một nhận xét. không phải là một câu trả lời

@SaeedAmiri: Tôi xác định bối cảnh của câu trả lời một chút; Tôi nghĩ rằng nó là đủ, nếu có thể không đặc biệt tốt.
Raphael

@Raphael, Sự giảm bớt trong tâm trí Yuval là rõ ràng và tôi không nghĩ OP không nhận thức được điều đó, nhưng vấn đề khó khăn của IMO là tìm cách nào đó cho các trường hợp đặc biệt, vì vậy sự giảm rõ ràng này có thể là một nhận xét để nhắc nhở OP cho trường hợp chung.

2
@SaeedAmiri: Đó là để OP và cử tri quyết định sau đó, không phải chúng tôi.
Raphael
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.