Lúng túng bởi định lý của Rice


37

Tóm tắt: Theo định lý của Rice, mọi thứ đều không thể. Tuy nhiên, tôi làm điều này được cho là không thể mọi lúc!


Tất nhiên, định lý của Rice không chỉ đơn giản nói "mọi thứ đều không thể". Nó nói một cái gì đó cụ thể hơn: "Mọi tài sản của một chương trình máy tính là không thể tính toán được."

(Nếu bạn muốn chia tóc, mọi thuộc tính "không tầm thường". Đó là các thuộc tính mà tất cả các chương trình sở hữu hoặc không có chương trình sở hữu đều có thể tính toán được. Nhưng bất kỳ tài sản nào khác đều không thể tính toán được.)

Đó là những gì định lý nói, hoặc dường như để nói. Và có lẽ một số lượng lớn những người rất thông minh đã cẩn thận xác minh tính đúng đắn của định lý này. Nhưng nó dường như hoàn toàn bất chấp logic! Có rất nhiều thuộc tính của các chương trình tầm thường để tính toán !! Ví dụ:

  • Có bao nhiêu bước để một chương trình thực hiện trước khi tạm dừng? Để quyết định xem con số này là hữu hạn hay vô hạn chính xác là Vấn đề Dừng, không thể tính toán được. Để quyết định xem con số này lớn hơn hay nhỏ hơn một số hữu hạn là chuyện nhỏ! Chỉ cần chạy chương trình cho tối đa bước và xem nó có dừng lại hay không. Dễ dàng!nn

  • Tương tự, chương trình sử dụng nhiều hơn hoặc ít hơn đơn vị bộ nhớ trong các bước thực hiện đầu tiên của nó ? Tính toán tầm thường.mnm

  • Có văn bản chương trình đề cập đến một biến có tên ? Một phân tích văn bản tầm thường sẽ tiết lộ câu trả lời.k

  • Chương trình có gọi lệnh không? Một lần nữa, quét văn bản chương trình tìm kiếm tên lệnh đó.σ

Tôi có thể thấy rất nhiều tính năng mà làm trông không tính toán cũng; ví dụ, có bao nhiêu bổ sung để chạy hoàn thành chương trình? Chà, điều đó gần giống như hỏi chương trình thực hiện bao nhiêu bước , đó gần như là vấn đề dừng. Nhưng có vẻ như có rất nhiều tài sản chương trình mà thực sự rất dễ tính toán. Tuy nhiên, định lý của Rice khẳng định rằng không ai trong số họ có thể tính toán được.

Tôi đang thiếu gì ở đây?


8
"Theo định lý của Rice, mọi thứ đều không thể." - Không. "Mọi tài sản của một chương trình máy tính là không thể tính toán được." - Không. Bạn không đơn độc, mặc dù: hầu hết các sinh viên gặp phải quan niệm sai lầm này.
Raphael

Câu trả lời:


36

Đối với mục đích của cuộc thảo luận này, "chương trình" là một đoạn mã luôn lấy một số nguyên làm đầu vào và chạy mãi mãi hoặc trả về một số nguyên. Chúng ta nói rằng hai chương trình và được extensionally bằng nếu họ tính toán chức năng tương tự, ví dụ, đối với mỗi số hoặc cả hai và chạy mãi mãi, hoặc cả hai đều chấm dứt và sản lượng cùng một số.g n f ( n ) g ( n )fgnf(n)g(n)

Một thuộc tính mở rộng của các chương trình là một thuộc tính tôn trọng sự bình đẳng mở rộng, nghĩa là, nếu và bằng nhau thì cả hai đều có thuộc tính hoặc cả hai đều không có thuộc tính hoặc cả hai đều không có thuộc tính hoặc cả hai đều không có thuộc tính này.f g PPfgP

Dưới đây là một số ví dụ về các thuộc tính không theo chiều:

  1. Chương trình tạm dừng trong bước. (Chúng tôi luôn có thể sửa đổi chương trình thành chương trình bằng nhau kéo dài hơn.)n
  2. Chương trình sử dụng ít hơn ô nhớ trong các bước thực hiện đầu tiên . (Chúng tôi luôn có thể sửa đổi chương trình thành một chương trình bằng nhau để nó sử dụng hết bộ nhớ mà không có lý do chính đáng.)mnm
  3. Các văn bản chương trình đề cập đến một biến có tên k. (Chúng ta có thể đổi tên các biến.)
  4. Chương trình có gọi lệnh . Điều này có thể phụ thuộc một chút vào là gì, nhưng nếu đó là thứ gì đó có thể được mô phỏng theo một cách nào đó, thì chúng ta có thể trốn tránh và vẫn có một chương trình tương đương với chương trình gốc.σσσσ

Tôi chắc chắn rằng bạn đã nhận thấy rằng tôi đã liệt kê chính xác các ví dụ phản biện được cho là của bạn vào định lý của Rice, trong đó nói:

Định lý (Rice): Một thuộc tính mở rộng có thể tính toán của các chương trình hoặc nắm giữ tất cả các chương trình hoặc không có.

Có một cách khác để giải thích điều này: bạn phải phân biệt giữa một chương trình và chức năng mà nó tính toán. Nhiều chương trình khác nhau tính toán cùng một chức năng (tất cả chúng đều mở rộng bằng nhau). Định lý Rice là về các thuộc tính của các hàm, không phải về các thuộc tính của các chương trình tính toán chúng.


Tôi không thể nhận được câu trả lời này .. (Xin lỗi nếu tôi hỏi tương tự, nhưng sẽ tốt khi làm rõ điểm này). Nó nói rằng bạn có thể sửa đổi các chương trình đó bằng cách thay đổi cú pháp của chúng để có được một phần mở rộng tương đương , nhưng làm thế nào để kiểm tra các chương trình đó tương đương với phần mở rộng ở vị trí đầu tiên? Bạn không thể sử dụng chương trình để so sánh nếu các chức năng của chương trình nói chung có cả hai thuộc tính đó, vì vậy khi bạn nói "sửa đổi" tôi nghĩ có thể vì đây là những ví dụ đơn giản, (bạn sẽ thêm "sửa đổi cẩn thận"? Hoặc sử dụng "tốt" IDE cho nó "? ..) Tôi nghĩ rằng một khi đã được sửa đổi, bạn không thể kiểm tra chung vì vậy, có lẽ Rice giữ.
Hernan_eche

1
Nói chung, bạn kiểm tra xem hai chương trình cụ thể có bằng nhau không bằng cách chứng minh rằng đây là trường hợp. Bạn có phản đối thực tế rằng cho tất cả các số nguyên, mặc dù một máy tính không thể "kiểm tra" đẳng thức này cho tất cả các giá trị? Hy vọng là không. Có một sự khác biệt giữa việc viết một chương trình tính giá trị boolean và chứng minh rằng một tuyên bố nào đó có một giá trị thật nhất định. Có những điều chúng ta có thể chứng minh nhưng không thể tính toán được (chẳng hạn như hai chương trình cụ thể là bằng nhau, hoặc sự bổ sung đó là giao hoán). n+m=m+n
Andrej Bauer

Ngoài ra, bạn đang thực hiện một bước nhảy vọt về lý luận trong lý luận của mình: vì sự bình đẳng mở rộng là không thể quyết định, định lý của Rice có thể sai. Làm sao vậy Và chỉ vì sự bình đẳng mở rộng là không thể giải quyết được, điều đó không có nghĩa là không có bất kỳ trường hợp nào mà chúng ta có thể quyết định. Những người tôi đã đề cập - chúng ta có thể quyết định những người.
Andrej Bauer

36

Hiểu lầm cơ bản:

Mọi tài sản của một chương trình máy tính là không thể tính toán được

PRE

{MfMP}

P

Định lý Rice liên quan đến các thuộc tính ngữ nghĩa (các thuộc tính của hàm được tính bởi một chương trình, ví dụ như miền hoặc phạm vi giá trị). Những gì bạn đề cập đến là thuộc tính cú pháp (thuộc tính của chương trình , chẳng hạn như thời gian chạy hoặc có bao nhiêu biến được sử dụng).

Không có nhiều dường như được biết đến với các thuộc tính cú pháp; thấy câu hỏi này .


1
Tôi bị lạc sau khoảng câu đầu tiên. Lấy làm tiếc. Ai đó có thể giải thích về sự khác biệt giữa một thuộc tính ngữ nghĩa và cú pháp không?
Toán học

@MathologistsOrchid: Bạn có thể bỏ qua câu đó một cách an toàn; đoạn đầu tiên chứa tất cả thông tin bạn cần. Dù sao tôi cũng sẽ giải thích.
Raphael

2
Semantic = về những gì chương trình làm. Cú pháp = về những gì chương trình trông như thế nào.
Revierpost
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.