Tại sao, thực sự, vấn đề dừng lại rất quan trọng?


149

Tôi không hiểu tại sao Vấn đề dừng lại thường được sử dụng để loại bỏ khả năng xác định liệu chương trình có dừng lại hay không. Wikipedia [bài báo] [1] giải thích chính xác rằng một cỗ máy xác định có bộ nhớ hữu hạn sẽ tạm dừng hoặc lặp lại trạng thái trước đó. Bạn có thể sử dụng thuật toán phát hiện xem một vòng lặp danh sách được liên kết để thực hiện Hàm dừng với độ phức tạp không gian của O (1).

Dường như với tôi rằng bằng chứng Ngừng vấn đề không gì khác hơn là một "nghịch lý", một mâu thuẫn tự (ít nhất là theo chu kỳ) giống như nghịch lý của Kẻ nói dối. Kết luận duy nhất mà nó đưa ra là Chức năng Dừng dễ bị ảnh hưởng bởi các câu hỏi không đúng.

Vì vậy, ngoại trừ các chương trình nghịch lý, Chức năng dừng là quyết định. Vậy tại sao chúng ta giữ nó như một bằng chứng ngược lại?

4 năm sau : Khi tôi viết bài này, tôi mới xem video này . Một lập trình viên nhận được một số chương trình, phải xác định chương trình nào kết thúc và video tiếp tục giải thích tại sao điều đó là không thể. Tôi đã thất vọng, vì tôi biết rằng đưa ra một số chương trình tùy ý, có khả năng nhân vật chính có thể chứng minh liệu họ có chấm dứt hay không. Khái niệm về tính tổng quát đã bị mất bằng cách nào đó. Đó là sự khác biệt giữa việc nói "một số chương trình không thể được chứng minh là chấm dứt" và "không chương trình nào có thể được chứng minh là chấm dứt". Nhiều thuật toán được chính thức chứng minh để làm như vậy. Thất bại trong việc tạo ra sự khác biệt này, bởi mỗi tài liệu tham khảo tôi tìm thấy trên mạng, là cách tôi đến với tiêu đề cho câu hỏi này. Vì lý do này, tôi thực sự đánh giá cao câu trả lời xác định lại chức năng tạm dừng là ternary thay vì boolean.


16
"Một cỗ máy xác định với bộ nhớ hữu hạn" là "nhàm chán" vì nó không hơn gì một máy tự động hữu hạn; những điều này không hữu ích cho việc tính toán mô hình nói chung. Đối với vấn đề tạm dừng: đó là một ví dụ cụ thể cho một hàm không tính toán được (Turing). Nếu bạn hài lòng với một bằng chứng phi xây dựng, bạn không "cần" nó. Nó vẫn có liên quan lịch sử, mặc dù.
Raphael

16
Điều đó nói rằng, câu hỏi của bạn đi qua như thông tin xấu. Bạn có thể muốn theo dõi các nguyên tắc cơ bản của lý thuyết tính toán (điều này sẽ thách thức trực giác của bạn được thông báo bằng thực tế, chứ không phải các mô hình được thảo luận ở đó). Xem câu hỏi tham khảo của chúng tôi để bắt đầu. Nếu bạn yêu cầu "bằng chứng" thêm rằng trực giác của bạn (theo như lý thuyết) là thiếu sót nghiêm trọng, hãy đọc câu hỏi này .
Raphael

12
"Bạn có thể sử dụng thuật toán phát hiện xem các vòng lặp danh sách được liên kết để triển khai Hàm dừng với độ phức tạp không gian của O (1)" - nhưng nếu bạn muốn giải quyết vấn đề cho máy tính có 2 GB dung lượng lưu trữ, bạn sẽ cần hơn 2 ^ 2000000000 bước và một máy tính lớn hơn.
dùng2357112

11
Cách đây rất lâu, tôi đã trò chuyện với một người bạn về vấn đề tạm dừng và một người ngồi gần đó hỏi "vấn đề tạm dừng là gì, nó có quan trọng không?" và bạn tôi quay sang anh ta và nói "nếu chúng ta có thể giải quyết vấn đề tạm dừng, chúng ta có thể xây dựng các thành phố trên mây". Đây là sự thật.
Francis Davey

8
@emory Yêu cầu này hoàn toàn đúng: P => Qđúng với mọi Q, nếu chúng tôi biết đó Plà sai (và chúng tôi biết rằng Vấn đề Ngừng không thể giải quyết được). Đức Phanxicô cũng có thể nói "Nếu chúng ta có thể giải quyết vấn đề tạm dừng, chúng ta có thể tự tìm ra cách chữa trị cho cái chết". Đó là cách hàm ý logic được định nghĩa.
amalloy

Câu trả lời:


217

Bởi vì rất nhiều vấn đề thực tế là vấn đề tạm dừng trong ngụy trang. Một giải pháp cho họ giải quyết vấn đề tạm dừng.

Bạn muốn một trình biên dịch tìm mã máy nhanh nhất có thể cho một chương trình nhất định? Trên thực tế vấn đề tạm dừng.

Bạn có JavaScript, với một số biến ở mức bảo mật cao và một số biến ở mức bảo mật thấp. Bạn muốn chắc chắn rằng kẻ tấn công không thể có được thông tin bảo mật cao. Đây cũng chỉ là vấn đề tạm dừng.

Bạn có một trình phân tích cú pháp cho ngôn ngữ lập trình của bạn. Bạn thay đổi nó, nhưng bạn muốn chắc chắn rằng nó vẫn phân tích tất cả các chương trình mà nó đã sử dụng. Trên thực tế vấn đề tạm dừng.

Bạn có một chương trình chống vi-rút và bạn muốn xem liệu nó có thực hiện một lệnh độc hại không. Trên thực tế chỉ là vấn đề tạm dừng.

Đối với ví dụ wikipedia, vâng, bạn có thể mô hình hóa một máy tính hiện đại như một máy trạng thái hữu hạn. Nhưng có hai vấn đề với điều này.

  1. Mỗi máy tính sẽ là một máy tự động khác nhau, tùy thuộc vào số bit RAM chính xác. Vì vậy, điều này không hữu ích để kiểm tra một đoạn mã cụ thể, vì máy tự động phụ thuộc vào máy mà nó có thể chạy.

  2. 2n2320000000002109300000000

Vấn đề Dừng cho phép chúng tôi lý do về độ khó tương đối của các thuật toán. Nó cho chúng ta biết rằng, có một số thuật toán không tồn tại, đôi khi, tất cả những gì chúng ta có thể làm là đoán một vấn đề và không bao giờ biết nếu chúng ta đã giải quyết nó.

Nếu chúng tôi không gặp phải vấn đề tạm dừng, chúng tôi vẫn sẽ tìm kiếm thuật toán ma thuật của Hilbert, đầu vào cho các định lý và đầu ra cho dù chúng có đúng hay không. Bây giờ chúng tôi biết rằng chúng tôi có thể ngừng tìm kiếm, và chúng tôi có thể nỗ lực tìm kiếm phương pháp phỏng đoán và phương pháp tốt thứ hai để giải quyết những vấn đề này.

CẬP NHẬT: Chỉ để giải quyết một vài vấn đề được nêu ra trong các ý kiến.

@Tyler Fleming Cloutier: Vấn đề "vô nghĩa" nảy sinh trong bằng chứng cho thấy vấn đề tạm dừng là không thể giải quyết được, nhưng điều cốt lõi của sự không thể giải quyết được thực sự là có một không gian tìm kiếm vô hạn. Bạn đang tìm kiếm một đối tượng với một thuộc tính nhất định và nếu một đối tượng không tồn tại, không có cách nào để biết khi nào bạn hoàn thành.

Σ00=Π00

Cũng có thể chỉ ra rằng có những vấn đề không thể giải quyết được mà không sử dụng một nghịch lý vô nghĩa như vấn đề Ngừng hoặc nghịch lý nói dối. Máy Turing có thể được mã hóa bằng chuỗi bit, tức là số nguyên. Nhưng một vấn đề có thể được mã hóa thành ngôn ngữ, tức là một tập hợp con của các số nguyên. Người ta biết rằng không có sự chọn lọc giữa tập hợp số nguyên và tập hợp tất cả các tập hợp con của số nguyên. Vì vậy, phải có một số vấn đề (ngôn ngữ) không có máy Turing (thuật toán) liên quan.

@Brent: vâng, điều này thừa nhận rằng điều này là quyết định đối với các máy tính hiện đại. Nhưng nó có thể quyết định cho một máy cụ thể. Nếu bạn thêm ổ USB có dung lượng ổ đĩa hoặc khả năng lưu trữ trên mạng hoặc bất cứ thứ gì khác, thì máy đã thay đổi và kết quả không giữ được.

Cũng phải nói rằng sẽ có nhiều lần thuật toán nói rằng "mã này sẽ dừng lại" bởi vì mã sẽ bị lỗi và hết bộ nhớ, và việc thêm một bit bộ nhớ sẽ khiến mã bị lỗi thành công và đưa ra một kết quả khác

Vấn đề là, máy Turing không có bộ nhớ vô hạn. Không bao giờ có thời gian mà một số lượng vô hạn các biểu tượng được ghi vào băng. Thay vào đó, máy Turing có bộ nhớ "không giới hạn", nghĩa là bạn có thể tiếp tục nhận được nhiều nguồn bộ nhớ hơn khi bạn cần. Máy tính là như thế này. Bạn có thể thêm RAM, hoặc thẻ nhớ USB hoặc ổ cứng hoặc bộ nhớ mạng. Vâng, bạn hết bộ nhớ khi bạn hết nguyên tử trong vũ trụ. Nhưng có bộ nhớ không giới hạn là một mô hình hữu ích hơn nhiều.


4
@Mehrdad Đối với bất kỳ định nghĩa hợp lý nào về "mã máy nhanh nhất có thể cho một chương trình nhất định", câu hỏi có ý nghĩa và câu trả lời là "Không thể có trình biên dịch như vậy".
David Richerby

13
Nó cũng hoạt động để tìm mã máy ngắn nhất có thể xuất ra, mã có ít bộ nhớ nhất, v.v. Đối với các chương trình chung, việc tìm kiếm bất kỳ phép chuyển đổi tối ưu nào là không thể thực hiện được. Về cơ bản, đây là định lý của Rice.
jmite

4
Như một hệ quả tất yếu đến mức vẫn đang tìm kiếm thuật toán ma thuật của Hilbert, nếu không có khái niệm tương đương chặt chẽ về Turing, chúng ta vẫn sẽ tranh cãi về việc liệu gotos hay mã tự sửa đổi có cho phép tính toán mạnh hơn, tìm kiếm các dạng phần cứng mạnh hơn về mặt tính toán và các đối số về ngôn ngữ lập trình tốt nhất sẽ chủ quan hơn nhiều so với hiện tại.
sdenham

3
Nó thậm chí còn xuất hiện ở những nơi bạn không mong đợi. Bạn muốn viết một trình biên dịch C ++ từ chối tất cả các chương trình không hợp lệ trong khi biên dịch tất cả các chương trình hợp lệ? Trước tiên, giải quyết vấn đề tạm dừng - siêu lập trình mẫu C ++ là hoàn thành Turing, do đó, việc cho biết các mẫu của bạn có hợp lệ hay không trong trường hợp chung yêu cầu giải quyết nó.
Đánh dấu

7
@Merhrdad: Ví dụ của bạn về "mô phỏng toàn bộ chương trình máy tính" là một ví dụ tuyệt vời về lý do tại sao vấn đề tạm dừng lại rất quan trọng. Đối với một số chương trình, việc mô phỏng chương trình không đơn giản như vẻ ngoài của nó (ví dụ: xem trang wikipedia về tạm dừng). Nếu vấn đề có thể lừa dối ở dạng này, bạn có thể tưởng tượng mức độ khó giải thích với ai đó ở dạng ẩn hơn (như vấn đề chống vi-rút)
Cort Ammon

49

Trong thực tế, điều này rất quan trọng vì nó cho phép bạn nói với những ông chủ không biết gì của mình "những gì bạn đang hỏi là không thể về mặt toán học".

Vấn đề tạm dừng và các vấn đề hoàn thành NP khác nhau (ví dụ: vấn đề nhân viên bán hàng du lịch) xuất hiện rất nhiều dưới dạng "Tại sao bạn không thể tạo một chương trình làm X?", Và bạn cần có thể đưa ra lời giải thích tại sao nó không thể hoặc không thể tồn tại trong vòng đời còn lại của vũ trụ.

Xin lưu ý rằng có thể thiết kế một ngôn ngữ không hoàn chỉnh Turing, do đó có thể được phân tích, bằng cách cấm đệ quy và lặp lại không giới hạn.




8
có thể thiết kế một ngôn ngữ không phải là Turing-Complete : Ví dụ về một ngôn ngữ hoàn chỉnh không Turing hữu ích: SQL (thực ra là một SQL bị loại bỏ). Tính đầy đủ của Turing sẽ tự động thêm không kết thúc vào ngôn ngữ, đây là điều bạn có thể không muốn khi chạy truy vấn db. (Mặc dù, tôi e rằng tất cả các triển khai SQL hiện đại đều cung cấp tính đầy đủ - dù sao đi nữa)
Bakuriu

8
@FranciscoPresencia: họ đã sử dụng một nhóm nghiên cứu, vì vậy quan điểm chung vẫn còn.
RemcoGerlich

4
@MooingDuck: điều Flickr không chọn giữa công viên và chim, nó (cố gắng) xác nhận một hoặc cả hai. HOẶC, không phải XOR.
gà trống

45

Bạn có thể sử dụng thuật toán phát hiện xem một vòng lặp danh sách được liên kết để thực hiện Hàm dừng với độ phức tạp không gian của O (1).

Để làm điều đó, bạn cần lưu trữ ít nhất hai bản sao trạng thái một phần của chương trình trong bộ nhớ, cộng với chi phí hoạt động của chương trình kiểm tra. Vì vậy, trên một máy tính nhất định, bạn không thể kiểm tra tất cả các chương trình có thể thực thi trên máy tính đó, chỉ các chương trình thực thi trên máy tính nhỏ hơn có ít hơn một nửa bộ nhớ.

Vấn đề tạm dừng cho một máy tính có kích thước hữu hạn nhất định có thể được giải quyết trên máy tính có kích thước hữu hạn đó . Nó chỉ có thể được giải quyết trên một máy tính lớn hơn. (Điều này đúng với bất kỳ phương pháp nào, không chỉ với phương pháp bạn đề xuất. Tôi sẽ không đưa ra bằng chứng chính thức, nhưng đây là ý chính. Nếu một máy tính C có thể chạy N chương trình khác nhau trong đó ít nhất một P không chấm dứt , sau đó một máy tính V có thể kiểm tra xem các chương trình N tạm dừng này có phải cũng có thể chạy N chương trình xác minh khác nhau hay không. Nếu C và V là cùng một máy tính, thì P không phải là một trong N chương trình khác nhau mà V chạy, vì vậy máy tính phải chạy ít nhất N + 1 chương trình khác nhau, điều này mâu thuẫn với giả định rằng C chạy N chương trình khác nhau.)

M2M256

Những con số ở đó minh họa rằng suy nghĩ về một máy tính như một máy trạng thái hữu hạn hiếm khi thực tế. Số lượng các tiểu bang có thể là hữu hạn, nhưng nó rất lớn, thực sự rất lớn. Cách duy nhất để lý luận về các chương trình phi đồ chơi là trong bản tóm tắt, không phải bằng cách liệt kê các trạng thái mà thông qua lý luận logic.

Vì vậy, loại trừ các chương trình nghịch lý, vấn đề dừng là có thể quyết định

Nghịch lý không đến từ vấn đề, mà đến từ nỗ lực giải pháp. Đối với bất kỳ chương trình cụ thể nào, có một thuật toán cho biết, vâng vâng, nếu chương trình kết thúc và không có chương trình nào nếu chương trình không kết thúc. Đó là chuyện nhỏ: print "yes"hoặc print "no"sẽ làm. Vấn đề là xác định cái nào để gọi. Việc không thể giải quyết vấn đề tạm dừng có nghĩa là không có thuật toán để đưa ra quyết định này. Lý do bằng chứng sử dụng đối số đường chéo là vì nó cần chỉ ra rằng khônggiải pháp công trình; để làm điều đó, nó bắt đầu từ một giải pháp có mục đích tùy ý và cho thấy rằng nó phải bỏ lỡ một số chương trình bằng cách xây dựng một chương trình bị bỏ lỡ. Đường chéo (cái mà bạn gọi không đúng cách là một nghịch lý trực tiếp) là trong quá trình xây dựng, không phải trong chương trình kết quả. Các chương trình kết quả là không tự tham khảo.

Có một kết quả tổng quát hơn gọi là định lý Rice nói rằng bất kỳ tài sản không tầm thường nàocủa các chương trình là không thể giải quyết được - bất kỳ thuộc tính nào chỉ phụ thuộc vào hành vi của chương trình và không theo cách cụ thể được viết (ví dụ, mã nguồn có ít hơn 42 ký tự? Rõ ràng là có thể quyết định được, trong khi đó thì có một chương trình có mã nguồn bao gồm ít hơn 42 ký tự và trả về cùng một kết quả cho tất cả các đầu vào? Không phải, cũng không phải là chương trình này có bao giờ xuất ra bất cứ thứ gì không? Dừng lại chỉ là một ví dụ. Đây là một vấn đề quan trọng vì nó thường xuất hiện trong thực tế (thông thường, chúng tôi muốn biết liệu một chương trình sẽ trả về kết quả trong thời gian hợp lý với các tài nguyên hữu hạn của máy tính mà nó đang chạy, nhưng vì điều này hiếm khi thực sự có thể trả lời được, chúng tôi sẵn sàng giải quyết cho câu hỏi đơn giản hơn là liệu chương trình cuối cùng sẽ chấm dứt khi có đủ thời gian và bộ nhớ hay không).


2
Tôi nghĩ rằng câu hỏi "có chương trình nào tạo ra cùng một đầu ra như một chương trình độc lập nhất định không (không có đầu vào nào ngoài chính chương trình đó), nhưng trong thời gian ngắn hơn, bao gồm cả thời gian để tải chương trình ?" sẽ là quyết định, mặc dù không thể hiểu được, vì độ dài tối đa của các chương trình ứng cử viên sẽ bị giới hạn, vì đó sẽ là thời gian để kiểm tra từng chương trình.
supercat

@supercat Có, tài sản này là quyết định. Nó không phải là quyết định cho trường hợp chung của một chương trình có đầu vào.
Gilles

1
Tôi có ấn tượng rằng Vấn đề Dừng thường giả định rằng tất cả các đầu vào mà chương trình sẽ nhận được trong quá trình thực hiện được gói cùng với chương trình. Nếu một máy có thể giải quyết vấn đề Ngừng một cách kỳ diệu cho bất kỳ chương trình nào cung cấp bất kỳ chuỗi đầu vào cụ thể nào , thì máy đó có thể xác định liệu chương trình có dừng lại cho tất cả các đầu vào có độ dài không?
supercat

3
@supercat Không, nhà tiên tri tạm dừng cho tất cả đầu vào sẽ tăng thêm một bước so với nhà tiên tri tạm dừng cho đầu vào. Điều đó sẽ làm cho một câu hỏi hay cho trang web này trên thực tế chúng ta có nó . Nhân tiện, mô hình tinh thần mặc định của tôi là các hàm đệ quy, trong đó, đầu vào, có nghĩa là đối số trực tuyến, và chạy một chương trình có nghĩa là áp dụng nó vào một đối số; Bạn nói đúng rằng tuyên bố của tôi là sai trong ngữ cảnh về máy Turing, tôi sẽ cập nhật nó.
Gilles

28

Dường như đối với tôi, Vấn đề dừng lại không gì khác hơn là một "nghịch lý", một mâu thuẫn bản thân (ít nhất là theo chu kỳ) theo cách tương tự như nghịch lý của Kẻ nói dối. Kết luận duy nhất mà nó đưa ra là Chức năng Dừng dễ bị ảnh hưởng bởi các câu hỏi không đúng định dạng như vậy

Không, đó không phải là vấn đề tạm dừng. Nghịch lý như nghịch lý của kẻ nói dối không đúng hay sai, đơn giản là chúng không có ý nghĩa. Mặt khác, một thuật toán xác định sẽ dừng lại cho một đầu vào nhất định hoặc nó sẽ chạy mãi mãi. Hàm halts(program, input)này có một giá trị xác định, xác định hoàn hảo cho mọi chương trình, cho mọi đầu vào. Chúng tôi không thể quyết định nó cho bất kỳ chương trình. Hay chính xác hơn: Chúng tôi không thể viết chương trình có thể quyết định chương trình cho mọi cặp chương trình / đầu vào.

Σ(n):=nnnnΣ(n)


2
Điều đáng chú ý là ở dạng phổ biến, Nghịch lý của Liar đưa ra tham chiếu rõ ràng cho chính nó, nhưng vấn đề tương tự có thể phát sinh ngay cả khi nó không xảy ra. Là câu trả lời cho câu lệnh được hình thành bằng cách lấy văn bản, "Có phải câu trả lời cho câu lệnh được hình thành bằng cách lấy văn bản và chèn sau dấu phẩy đầu tiên một bản sao được đặt trong dấu ngoặc kép không?" và chèn sau dấu phẩy đầu tiên một bản sao kèm theo dấu ngoặc đơn, không? Một tuyên bố như vậy không rõ ràng là tự tham chiếu nhưng đề cập đến tính trung thực của một tuyên bố giống hệt nhân vật.
supercat

2
@supercat: huh, tôi không nghĩ rằng tôi đã thấy một câu đố bằng tiếng Anh trước đây ...
SamB

@SamB: Tôi đã thấy một vài người, nhưng quyết định thử dùng một công thức ban đầu, trong khi dài dòng hơn một số, đọc (có lẽ) một cách tự nhiên hơn.
supercat

24

Tôi không hiểu tại sao Vấn đề dừng lại thường được sử dụng để loại bỏ khả năng xác định liệu chương trình có dừng lại hay không. Bài viết Wikipedia giải thích chính xác rằng một cỗ máy xác định có bộ nhớ hữu hạn sẽ tạm dừng hoặc lặp lại trạng thái trước đó. Bạn có thể sử dụng thuật toán phát hiện xem một vòng lặp danh sách được liên kết để thực hiện Hàm dừng với độ phức tạp không gian của O (1).

Đầu tiên, vâng, về mặt lý thuyết , thật hợp khi xem một máy tính thực sự, có bộ nhớ hữu hạn, như một máy trạng thái hữu hạn. Nhưng trong thực tế , số lượng trạng thái của một máy tính thực là rất lớn, rằng các máy tính thực được mô hình hóa tốt hơn nhiều bởi các máy Turing hoặc các mô hình tính toán trạng thái vô hạn khác.

Và thứ hai, thậm chí về mặt lý thuyết, thật hợp lý khi xem một máy tính hiện đại như một cỗ máy trạng thái vô hạn. Máy Turing không có băng vô hạn, nó có băng luôn có thể mở rộng khi máy hết bộ nhớ. Và đó không phải là chính xác những gì chúng ta có thể làm với máy tính thực sự? (Và nếu không gian địa chỉ của CPU hết, chúng ta có thể sử dụng đám mây, v.v.)

Dường như đối với tôi, Vấn đề dừng lại không gì khác hơn là một "nghịch lý", một mâu thuẫn bản thân (ít nhất là theo chu kỳ) theo cách tương tự như nghịch lý của Kẻ nói dối. Kết luận duy nhất mà nó đưa ra là Chức năng Dừng dễ bị ảnh hưởng bởi các câu hỏi không đúng. Vì vậy, loại trừ các chương trình nghịch lý, vấn đề dừng là có thể quyết định. Vậy tại sao chúng ta giữ nó như một bằng chứng ngược lại?

HPxHPx

Bằng chứng của Turing về tính không ổn định của vấn đề tạm dừng sử dụng một mánh khóe tương tự như nghịch lý Liar, vâng. Một nghịch lý thường được định nghĩa là một mâu thuẫn rõ ràng , và một số người suy luận rằng một nghịch lý do đó không phải là một mâu thuẫn thực sự . Tuy nhiên, nghịch lý của Russel (đối tác lý thuyết tập hợp chính thức với nghịch lý của kẻ nói dối) đã cho thấy một mâu thuẫn thực sự trong toán học, và bằng chứng về tính không thể giải quyết của vấn đề tạm dừng sử dụng mâu thuẫn thực sự để chứng minh bằng mâu thuẫn.


1
+1 để giải thích mối quan hệ giữa các máy tính thực, máy trạng thái hữu hạn và máy Turing là một phần quan trọng của thiết lập cho câu hỏi.
David Richerby

1
Bạn đã khơi gợi sự quan tâm của tôi. Sự khác biệt giữa mâu thuẫn rõ ràng và mâu thuẫn thực sự là gì?
Brent

Một cách khác để nói điều này: nói chung, lập trình không sử dụng tài nguyên hạn chế. Hầu hết các thuật toán chúng tôi thiết kế hoặc chương trình chúng tôi viết không được viết để sử dụng một lượng tài nguyên máy tính hạn chế hoặc thậm chí cố định, trừ khi chúng tôi thiết kế cụ thể cách (ví dụ: điều này thường được yêu cầu khi lập trình cho các hệ thống nhúng).
rebierpost

3
@Brent. Nhiều nghịch lý hoàn toàn không mâu thuẫn, mà chỉ ở cái nhìn đầu tiên. Khi chúng ta nhìn gần hơn, hóa ra có một lỗi trong lý luận, hoặc một số từ có nghĩa thay đổi một chút bằng cách sử dụng nó trong một bối cảnh khác, hoặc một cái gì đó tương tự. Tuy nhiên, đôi khi, một nghịch lý lại đưa ra ánh sáng mâu thuẫn thực sự.
Hoopje

Tôi đã nghiên cứu vấn đề này nhiều lần kể từ OP của tôi. Liệu định lý bất toàn của Gôdel có ngụ ý rằng luôn luôn có thể đưa ra một số nghịch lý bất kể hệ thống logic được sử dụng là gì?
Brent

17

jmite đã trả lời câu hỏi thực sự độc đáo. Hãy để tôi thêm một ghi chú bên lề liên quan đến sự tương đồng về nhận thức với "Nghịch lý của kẻ nói dối" mà tôi nghĩ là do việc sử dụng cơ chế tự tham chiếu của họ.

Tự tham khảo không phải là nghịch lý!

Tự tham chiếu là một công cụ thực sự hữu ích trong tính toán (thuật toán có thể đề cập đến mã, phản xạ của nó ) và ngôn ngữ của con người (mà chúng ta có thể tự nói đến bản thân, tự ý thức ).

Vấn đề gây ra Nghịch lý của Kẻ nói dối không phải là tự tham khảo, nó đang cố gắng sử dụng vị ngữ sự thật cho một ngôn ngữ (chính thức) bên trong ngôn ngữ. Nó sẽ gây ra vấn đề ngay cả khi không tự tham khảo, chúng tôi không cần khả năng sử dụng tự tham chiếu để có một nghịch lý: tự tham khảo có thể được loại bỏ! . Nó sẽ chỉ làm cho câu kém đẹp và súc tích nhưng nó không khó thực hiện. Đó thực chất là cách mà định lý Điểm cố định của Kleene được chứng minh. Điều nghịch lý của Liar ngụ ý là sự thật của các phát biểu trong một ngôn ngữ (chính thức) là siêu việt với ngôn ngữ đó, không phải việc tự tham khảo là có vấn đề.


Dường như với tôi rằng sự khó chịu của bạn không phải vì sự không ổn định của vấn đề tạm dừng (đối với máy Turing) mà là chấp nhận máy Turing làm mô hình lý thuyết cho máy tính. Thông thường (mặc dù không phải lúc nào) Máy Turing (và các mô hình tính toán tương đương như Máy truy cập ngẫu nhiên ) rất hữu ích để thảo luận về tính toán trên máy tính thực tế hơn máy tự động hữu hạn và có những lý do chính đáng cho điều đó (hãy nhớ rằng máy Turing không có một lượng bộ nhớ vô hạn, nó có một lượng bộ nhớ không giới hạn và đây là những thứ khác nhau: không giới hạn có nghĩa là chúng ta có thể cung cấp cho máy nhiều bộ nhớ hơn khi cần, không phải là nó sử dụng một lượng bộ nhớ vô hạn).

Chắc chắn, nếu bạn muốn nghĩ máy tính là máy tự động hữu hạn và điều đó hợp lý với mục đích của bạn, thì vấn đề tạm dừng đối với máy tự động hữu hạn là có thể quyết định (và theo quyết định, chúng tôi có thể quyết định bằng máy Turing chứ không phải máy tự động hữu hạn). Tuy nhiên, đó không phải là những gì mọi người thường có nghĩa là khi họ sử dụng vấn đề tạm dừng, họ có nghĩa là vấn đề tạm dừng cho các máy Turing.

s2s


14

vấn đề tạm dừng đã đưa ra một khái niệm toán học mới về "tính không ổn định" mà trước đây không tồn tại trong toán học. đó là một bằng chứng ("có vẻ nghịch lý") rằng một số vấn đề không có "bằng chứng". nó kết nối với khái niệm Godelian về tính không thể cung cấp. Định lý Godels đi trước việc xây dựng vấn đề tạm dừng bằng Turing vài năm. Kết quả Godels được coi là khá trừu tượng vào thời điểm đó và chỉ được các nhà nghiên cứu và chuyên gia biết đến. Công thức của Turings cho thấy nguyên tắc không ổn định có liên quan đến các câu hỏi thực tế / thực dụng / ứng dụng cao trong khoa học máy tính như xác định liệu các chương trình tùy ý có dừng lại hay không và nó được coi là một khái niệm ít lý thuyết hơn, nó xuất hiện trong các thách thức hiện đại như " (một thách thức cho dù máy tính có thể khám phá các định lý) và chứng minh chấm dứt chương trình.

một góc độ thú vị khác là có một số vấn đề rất cũ trong lý thuyết số (Diophantine) có nguồn gốc từ người Hy Lạp chưa được chứng minh cho bệnh giảm cân. có một kết quả liên quan rằng các câu hỏi chung về phương trình Diophantine là không thể giải được gọi là bài toán / định lý thứ 10 của Hilberts . Hilbert sống vào đầu thế kỷ 20 và đề xuất như một chương trình nghiên cứu rằng toán học có thể tìm ra các phương pháp tiếp cận có hệ thống cho các vấn đề toán học. thách thức / kế hoạch này đã bị ảnh hưởng nghiêm trọng bởi việc phát hiện ra sự bất ổn từ một vài thập kỷ sau đó. không có khả năng tiếp tục là một lĩnh vực nghiên cứu rất tiên tiến và ranh giới giữa các vấn đề không thể giải quyết được và có thể quyết định có lẽ sẽ luôn được nghiên cứu và phân tích sâu hơn.


14

Bạn dường như đang nhầm lẫn giữa bằng chứng "tự tham khảo" cổ điển rằng vấn đề Dừng có thể được giải quyết bằng chính vấn đề Ngừng (hay còn gọi là Dừng).

Chương trình tự giới thiệu đó - chương trình tạm dừng khi và chỉ khi nó không dừng lại - được xây dựng để giúp dễ dàng chứng minh bạn không thể giải quyết Halt. Việc chúng tôi chứng minh X là không thể thông qua kỹ thuật Y không ngụ ý Y là lý do duy nhất khiến chúng tôi không thể giải X.

Nói cách khác, không chỉ chúng ta không thể giải quyết Halt, chúng ta không thể phát hiện ra rằng một chương trình là loại chương trình mà chúng ta không thể xác định nếu nó Dừng, ngoại trừ một biện pháp thô thiển như "nếu phải mất hơn 1 phút để chạy, giả vờ nó không dừng lại ".

Nếu bạn bắt đầu từ vấn đề Ngừng và giảm các vấn đề khác cho vấn đề đó, cuối cùng bạn sẽ đạt đến điểm mà bạn đã giảm hầu hết mọi câu hỏi về các chương trình về nó. Chúng tôi kết thúc với Định lý Rice:

Đặt S là một số thuộc tính không tầm thường của 1 cái mà Turing Machine chấp nhận. Điều đó có nghĩa là có ít nhất một Máy Turing chấp nhận đầu vào có thuộc tính S và một máy không có.

Sau đó, không thể xác định được nếu một Turing Machine T đã cho chấp nhận đầu vào với thuộc tính S.

Bạn muốn biết nếu một Turing Machine chấp nhận ngay cả số nguyên? Không thể quyết định được.

Bạn muốn biết nếu một Turing Machine chấp nhận các chuỗi số học? Không thể quyết định được.

Bạn có thể nói về ruột của Turing Machine nói chung. Bạn có thể suy luận về một Máy Turing cụ thể và chứng minh nếu nó sẽ dừng / chấp nhận một số trình tự / v.v. Nhưng bạn không thể biết liệu kỹ thuật của mình có hoạt động trên Máy Turing tiếp theo hay không.


1 Bởi property ofnó không bao gồm cơ chế về cách nó được chấp nhận - chỉ về những gì được chấp nhận. "Nó chấp nhận trong 100 bước hoặc ít hơn" là một tài sản như thế nào nó chấp nhận, không phải là những gì được chấp nhận.


Bạn có thể muốn giải thích "tài sản" là gì, vì cách giải thích ngây thơ mà người ta có thể đưa ra có thể sẽ không chính xác.
Rick Decker

@rick Tôi nghĩ rằng chú thích bao gồm nó bây giờ?
Yakk

7

Bạn đã đúng rằng vấn đề tạm dừng như thường được giới thiệu và nêu là một vấn đề đơn thuần. Điều đó không chứng minh rằng không thể có chức năng tạm dừng ba giá trị ('dừng lại', 'vòng lặp', 'không biết') mà trong thực tế luôn trả về 'tạm dừng' hoặc 'vòng lặp' và chỉ trả về 'don' t biết 'cho các trường hợp góc được xây dựng đặc biệt chẳng hạn.

Hai lý do khiến vấn đề tạm dừng là đáng kể:

1) Đây là một trong những vấn đề đầu tiên không thể giải quyết được. Ngay cả khi theo giả thuyết chỉ có một 'không biết', nó vẫn sẽ được quan tâm toán học rất lớn.

2) Một số vấn đề làm giảm vấn đề tạm dừng trong đó kẻ tấn công độc hại có thể cung cấp vụ việc cần phân tích. Điều này buộc chúng tôi phải chấp nhận rằng có thể có những trường hợp hợp lệ mà chúng tôi vẫn phải từ chối.

Như một suy nghĩ cho điểm thứ hai, phân tích phần mềm là một vấn đề khó khăn, mặc dù rất nhiều tiến bộ đã được thực hiện cả trong phân tích và thiết kế ngôn ngữ để giúp phân tích dễ dàng hơn. Nếu bạn có thể chỉ ra rằng một nhiệm vụ nào đó tương tự như phân tích phần mềm, vâng, nó khó với vốn H. 'Không thể vì nó có thể giải quyết vấn đề tạm dừng', mặc dù trong nhiều trường hợp, sai về mặt kỹ thuật hoặc không liên quan tốc ký cho quan sát này.


5

Có một lập luận trái ngược được đưa ra bởi Eric Hehner trong một loạt các bài báo cho rằng tính không thể giải quyết của Vấn đề Ngừng thường bị hiểu sai. Có thể tìm thấy các bài báo, "Epampleides, Gôdel, Turing: Một mớ vàng vĩnh cửu", "Các vấn đề với vấn đề tạm dừng", "Tái tạo vấn đề tạm dừng" và "Vấn đề tạm dừng", có thể tìm thấy ở đây . Vì vậy, câu trả lời này không phải là "chỉ liên kết", tôi sẽ cố gắng tóm tắt một trong những kết luận của anh ấy, nhưng không phải là lập luận.

f(0)=1f(0)=2hh(M)MHhh


3
Tôi không làm theo. Chức năng tạm dừng là một vị từ hoàn toàn được xác định rõ ràng và hợp lệ - đối với bất kỳ máy Turing cụ thể nào và bất kỳ đầu vào cụ thể nào, máy đều dừng hoặc lặp. (Bạn thiếu một tài liệu tham khảo thích hợp; bạn đang tóm tắt papar nào?)
Raphael

@Raphael Rằng chức năng được xác định rõ thường được chấp nhận là một thực tế. Quan điểm của Hehner là khác nhau và được giải thích trong các bài báo của mình. Tôi sẽ chỉnh sửa câu trả lời của mình để cung cấp tên của các bài viết.
Theodore Norvell

Chúng ta hãy nói rằng bất cứ lý lẽ nào của Hehner là [Tôi chưa đọc các bài báo] họ đã gây tranh cãi ít nhất là trong lần đọc / xấp xỉ đầu tiên của họ: ' cs.toronto.edu/~hehner/Shallitaffair.pdfrecursed.blogspot.com/ 2013/10 / eric-hehner-reply.html
Fizz

Và không rõ ràng về bản chất và số lượng trích dẫn mà các bài viết của Hehner (về điều này) có bất kỳ bài đọc bổ sung nào (về các tác phẩm của ông về điều này) đều đáng để phiền phức.
Fizz

Bằng chứng của ông có vẻ rất chắc chắn và đang chỉ ra rằng đó chỉ là một sự luyện tập lại những điều ngớ ngẩn bạn có thể làm trong triết học như cố gắng phân tích tuyên bố tự giới thiệu sau đây cho tính trung thực của nó: "Câu này là sai." mà nếu đúng có nghĩa là nó sai có nghĩa là nó thực sự đúng, không có nghĩa là nó lại sai ... vì vậy đây có vẻ như là một câu hỏi nhìn chằm chằm vào triết học không quá quan trọng. vi.wikipedia.org/wiki/Liar_paradox Nghịch lý tạm dừng có thể là một trường hợp các nhà khoa học không nói chuyện với các nhà triết học.
James Wakefield

3

Tôi muốn đưa ra một lời giải thích khác nhau về tầm quan trọng của vấn đề tạm dừng liên quan đến con người hơn là máy móc.

Đây là bài giảng cuối cùng của khóa Diễn giải và cấu trúc MIT 1986 ; giáo sư hỏi "Có câu hỏi nào không?" và chuẩn bị kết thúc bài giảng, khi một trong các sinh viên hỏi: "Đây có phải là câu hỏi cuối cùng không?"

Nghĩ về nó ngay lúc này. Làm thế nào giáo viên có thể trả lời này? Nếu học sinh quyết định mâu thuẫn với giáo viên, không có câu trả lời hợp lệ nào mà giáo viên có thể đưa ra - đây giống như vấn đề tạm dừng.

Chúng ta thường sử dụng để suy nghĩ về vấn đề tạm dừng một cách trừu tượng, sử dụng các chức năng và máy móc, nhưng nó sâu sắc hơn thế nhiều. Về cơ bản, nó có nghĩa là có những câu hỏi hoàn toàn hợp lệ không thể trả lời.

Tái bút: Nếu bạn không biết tôi đang nói về khóa học nào, hãy xem nó, thật tuyệt vời.


Nhưng nếu tôi thực thi doesHalt(programCode, input);, chương trình không thể biết doesHalthàm trả về cái gì . Chương trình không thể dừng lại sau khi doesHalthàm đã đánh giá nó.
Tvde1

0

Tôi có thể dễ dàng viết một chương trình có đầu vào n, hoặc xuất ra số nguyên tố nhỏ nhất p> n sao cho p + 2 cũng là số nguyên tố hoặc chạy mãi mãi nếu không có p như vậy. Nếu bạn có thể giải quyết vấn đề để dự đoán liệu chương trình của tôi có dừng lại cho mỗi đầu vào hay không, bạn chỉ cần giải quyết phỏng đoán Twin Prime.

Hoàn toàn có khả năng phỏng đoán này có thể được chứng minh là không thể giải quyết được, trong trường hợp đó chúng ta sẽ có một chương trình đơn giản trong đó chương trình tạm dừng thất bại.


Tôi nghĩ rằng bạn đang trộn "Turing-không thể giải quyết" với một khái niệm rất khác; trong thực tế, bạn có thể tình cờ vấp vào ngụy biện "cũ". Xem thêm ở đâyở đây .
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.