Khi nào chúng ta có thể nói rằng hai chương trình là khác nhau?


15

Q1. Khi nào chúng ta có thể nói rằng hai chương trình (được viết bằng một số ngôn ngữ lập trình như C ++) là khác nhau?

Cực đoan đầu tiên là nói rằng hai chương trình tương đương với nhau nếu chúng giống hệt nhau. Một thái cực khác là nói hai chương trình tương đương với nhau nếu chúng tính toán cùng một chức năng (hoặc hiển thị cùng một hành vi có thể quan sát được trong các môi trường tương tự). Nhưng những điều này là không tốt: không phải tất cả các chương trình kiểm tra tính nguyên thủy đều giống nhau. Chúng tôi có thể thêm một dòng mã không ảnh hưởng đến kết quả và chúng tôi vẫn sẽ coi đó là cùng một chương trình.

Quý 2 Các chương trình và thuật toán có cùng loại đối tượng không? Nếu không, định nghĩa của một thuật toán là gì và nó khác với định nghĩa của một chương trình như thế nào? Khi nào chúng ta có thể nói hai thuật toán là tương đương?


Các vấn đề đẳng cấu chương trình? Không ai có thể hỏi "chương trình này có đồng hình với chương trình luôn dừng lại không?" và phục hồi vấn đề dừng lại? Nếu chúng ta giới hạn bản thân trong Vấn đề Chương trình Ngừng giới hạn thì đây không phải là biểu đồ đẳng cấu?
user834

5
Khi nào hai thuật toán giống nhau? arxiv.org/abs/0811.0811
sdcvvc

1
Nó sẽ không phụ thuộc hoàn toàn vào bối cảnh chứ? Có một chút triết lý ở đây, nhưng một chiếc ghế buông xuống và một chiếc ghế bu lông lộn ngược là những điều tương tự về mặt thể chất nhưng không giống nhau về ý tưởng của một chiếc ghế.
Rei Miyasaka

Hơi lạc đề, nhưng, vì bằng chứng là các chương trình ... gowers.wordpress.com 2007/10/04 / Từ
Radu GRIGore

1
Bài viết sau đây rất liên quan. Tôi mới chỉ đọc lướt qua nó một thời gian trước đây, nhưng Blass và Gurevic thường viết rất tốt (tôi chỉ không nhớ đọc bất cứ điều gì khác của Dershowitz, không nói rằng nó thường không dễ đọc). research.microsoft.com/en-us/um/people/gurevich/Opera/192.pdf KHI LÀ hai thuật toán giống nhau không? ANDREAS BLASS, NACHUM DERSHOWITZ, và YURI GUREVICH
kasterma

Câu trả lời:


18

Câu 1: Có nhiều khái niệm về sự tương đương của chương trình (tương đương theo dõi, tương đương theo ngữ cảnh, tương đương quan sát, tính tương đồng) có thể có hoặc không tính đến những thứ như thời gian, sử dụng tài nguyên, không phá hủy, chấm dứt. Rất nhiều công việc đã được thực hiện để tìm ra các khái niệm có thể sử dụng về sự tương đương của chương trình. Ví dụ: Các lý thuyết dựa trên hoạt động của tính tương đương chương trình của Andy Pitts . Nhưng điều này hầu như không làm trầy xước bề mặt. Điều này sẽ hữu ích ngay cả khi bạn quan tâm khi hai chương trình không tương đương. Người ta thậm chí có thể lý do về các chương trình không tạm dừng (sử dụng phép chia đôi và cưỡng chế).

Câu 2: Một câu trả lời khả dĩ cho một phần của câu hỏi này là các chương trình tương tác không phải là thuật toán (giả sử rằng người ta xem xét một thuật toán để lấy tất cả đầu vào của nó cùng một lúc, nhưng định nghĩa hẹp này không bao gồm các thuật toán trực tuyến). Một chương trình có thể là một tập hợp các quá trình tương tác cũng tương tác với môi trường của chúng. Điều này chắc chắn không phù hợp với khái niệm lý thuyết Turing-machine / Recursion của thuật toán.


IO và các tác dụng phụ nói chung không được bao phủ bởi các khái niệm thuật toán cổ điển.
Raphael

15

Một thái cực khác là nói hai chương trình tương đương với nhau nếu chúng tính toán cùng một chức năng (hoặc hiển thị cùng một hành vi có thể quan sát được trong các môi trường tương tự). Nhưng những điều này là không tốt: không phải tất cả các chương trình kiểm tra tính nguyên thủy đều giống nhau. Chúng tôi có thể thêm một dòng mã không ảnh hưởng đến kết quả và chúng tôi vẫn sẽ coi đó là cùng một chương trình.

Đây không phải là một cực đoan: sự tương đương của chương trình phải được xác định liên quan đến một khái niệm quan sát.

Định nghĩa phổ biến nhất trong nghiên cứu PL là tương đương theo ngữ cảnh. Trong tương đương theo ngữ cảnh, ý tưởng là chúng ta quan sát các chương trình bằng cách sử dụng chúng làm thành phần của các chương trình lớn hơn (bối cảnh). Vì vậy, nếu hai chương trình tính cùng một giá trị cuối cùng cho tất cả các bối cảnh, thì chúng được đánh giá là bằng nhau. Vì định nghĩa này định lượng trên tất cả các bối cảnh chương trình có thể, rất khó để làm việc trực tiếp. Vì vậy, một chương trình nghiên cứu điển hình trong PL là tìm ra các nguyên tắc lý luận thành phần trong đó ngụ ý sự tương đương theo ngữ cảnh.

Tuy nhiên, đây không phải là khái niệm duy nhất có thể quan sát được. Ví dụ, chúng ta có thể dễ dàng nói rằng bộ nhớ, thời gian hoặc hành vi sức mạnh của một chương trình là có thể quan sát được. Trong trường hợp này, có ít tương đương chương trình hơn, vì chúng ta có thể phân biệt nhiều chương trình hơn (ví dụ, sự hợp nhất hiện có thể phân biệt với quicksort). Nếu bạn muốn (nói) các ngôn ngữ thiết kế miễn nhiễm với các cuộc tấn công kênh thời gian hoặc để thiết kế các ngôn ngữ lập trình giới hạn không gian, thì đây là loại việc bạn phải làm.

Ngoài ra, chúng tôi có thể chọn đánh giá một số trạng thái trung gian của một tính toán là có thể quan sát được. Điều này luôn xảy ra đối với các ngôn ngữ đồng thời, do khả năng can thiệp. Nhưng bạn có thể muốn có chế độ xem này ngay cả đối với các ngôn ngữ tuần tự --- ví dụ: nếu bạn muốn đảm bảo rằng không có tính toán nào lưu trữ dữ liệu không được mã hóa trong bộ nhớ chính, thì bạn phải coi ghi vào bộ nhớ chính là có thể quan sát được.

Về cơ bản, không có khái niệm duy nhất về sự tương đương của chương trình; nó luôn luôn liên quan đến khái niệm quan sát bạn chọn, và điều đó phụ thuộc vào ứng dụng bạn có trong đầu.


1
Đáng để chỉ ra rằng không có khái niệm duy nhất về sự tương đương theo ngữ cảnh (hoặc sự phù hợp theo ngữ cảnh), ví dụ nếu ngôn ngữ lập trình được đề cập là tương tác (nghĩa là không mang lại giá trị).
Martin Berger

α
Sam Tobin-Hochstadt

1
αα
Sam Tobin-Hochstadt

1
@ SamTobin-Hồ Chí Minh. Ok, chúng ta hãy quên "thông thường". Cảm giác tôi nhận được là bạn đang nói điều tương tự mà Neel đã nói, điều này được tôi suy nghĩ khá kỹ. Ý tưởng của bạn, vẫn còn mơ hồ đối với tôi, có thể được chính thức hóa trong khuôn khổ của Neel bằng cách chọn đúng loại quan sát và đúng loại bối cảnh chương trình.
Uday Reddy

1
λλx.xλy.y

2

Câu 2: Tôi nghĩ rằng các định nghĩa lý thuyết thông thường không thực sự phân biệt giữa các thuật toán và chương trình, nhưng "thuật toán" như thường được sử dụng giống như một lớp chương trình. Đối với tôi, một thuật toán giống như một chương trình với một số chương trình con còn lại không được chỉ định đầy đủ (nghĩa là hành vi mong muốn của chúng được xác định nhưng không được thực hiện). Ví dụ, thuật toán loại bỏ Gaussian không thực sự xác định cách nhân số nguyên được thực hiện.

Tôi xin lỗi nếu điều này là ngây thơ. Tôi không làm nghiên cứu PL.


Ý tưởng có lẽ là có nhiều triển khai cho các chương trình con đó và bạn không quan tâm cái nào được chọn miễn là nó thực hiện theo đặc điểm kỹ thuật của bạn.
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.