Ngừng vấn đề mà không tự tham khảo: tại sao đối số này không đủ (hoặc không)?


8

Tôi đang cố gắng tìm cách giải thích ý tưởng về chứng minh vấn đề tạm dừng theo cách dễ tiếp cận nhất có thể (đối với sinh viên CS chưa tốt nghiệp). Đối số đơn giản nhất tôi đã tìm thấy là điều này ; đây chính xác là phong cách đối xử mà tôi đang hướng tới. Tuy nhiên, việc tự tham khảo (cụ thể là kiểm tra xem chương trình có tự dừng lại không) không phải là mô phạm nhất.

Điều tôi đang thắc mắc, như một bản phác thảo bằng chứng, là lý do tại sao chúng ta không thể đơn giản hóa hơn nữa và nói: nếu chúng ta giả sử một chương trình H(P,I)cho Vấn đề dừng lại dừng lại với sự thật nếu P(I)dừng lại và dừng lại với sai, thì chúng ta có thể tạo ra một chương trình có dạng:

def Q(J):
  if H(Q,J) then loop forever
  else halt

... Đó là một chương trình hợp lệ khi và chỉ khi Sự cố dừng là một chương trình hợp lệ. Sau đó chúng ta có thể hỏi: nên H(Q,J)trả về giá trị tùy ý Jnào? Chúng tôi thấy một sự mâu thuẫn trong cả hai khả năng và chúng tôi kết luận rằng vì sự tồn tại của Hcho phép chúng tôi xây dựng chương trình mâu thuẫn Q, do đó, một chương trình Hcó dạng không thể tồn tại.

Vẫn còn một số tự tham khảo ở đây trong đó chương trình Qkiểm tra xem nó có dừng lại ở đầu vào hiện tại hay không (nhưng ngược lại), nhưng đối với tôi, điều này có vẻ trực quan hơn nhiều so với việc thiết lập một tình huống mà chúng ta cần một cuộc gọi của hình thức P(P)hoặc H(P,P), v.v. Tuy nhiên, tôi chưa thấy đối số đơn giản hơn này được sử dụng và tôi nghĩ rằng nó sẽ có giá trị. Do đó, câu hỏi của tôi là:

  • Lập luận trên có đủ làm bằng chứng (phác họa) cho Vấn đề Ngừng không?
    • Nếu vậy, tại sao nhiều đối số đi với một bước khó hiểu của mẫu P(P)hoặc H(P,P)? (Có phải chỉ để loại bỏ "đầu vào" không quan trọng khỏi phương trình?)
    • Nếu không, cái gì còn thiếu?

Có nhiều câu hỏi liên quan về chủ đề này, chẳng hạn như:

Tôi cũng thấy đề cập đến bằng chứng dựa trên nghịch lý của Berry, điều này khá hấp dẫn. Tuy nhiên, tôi vẫn chưa thể thuyết phục bản thân liệu cuộc tranh luận cụ thể ở trên có hoạt động hay không (ngay cả khi chỉ vì sự hiểu biết của tôi; tôi cảm thấy có lẽ tôi đang thiếu một cái gì đó ngu ngốc và muốn biết nó là gì).


2
Bạn có biết về video này ? Đó là lời giải thích trực quan nhất về vấn đề tạm dừng mà tôi từng thấy.
Polygnome

Cảm ơn con trỏ! Có, @DW liên kết với nó trong câu trả lời của anh ấy.
badroit

Câu trả lời:


19

Tôi không nghĩ rằng đây là một cách tốt để trình bày vấn đề tạm dừng, bởi vì nó quét một vấn đề quan trọng dưới vỏ bọc một cách lén lút. Tôi đề nghị gắn bó với một bài thuyết trình chuẩn hơn, chẳng hạn như bài thuyết trình mà bạn đã liên kết. Nếu bạn muốn tìm cách giải thích nó theo cách giảm thiểu nội dung kỹ thuật, bài thuyết trình trong video này có thể truy cập một cách đáng ngạc nhiên, và vẫn đúng với logic của bằng chứng tiêu chuẩn.

Về những khó khăn với đề xuất của bạn. Trong đề xuất của bạn, việc viết ra mã cho việc đó không phải là chuyện nhỏ Q. Hãy suy nghĩ về ý nghĩa của việc có dòng

  if H(Q,J) then loop forever 

Hãy nhớ rằng đối số đầu tiên Hlà một chuỗi bit chứa mã / thuật toán / máy Turing - đó không phải là một con trỏ tới hàm, mà là một chuỗi. Ngây thơ, điều này dường như có nghĩa là chúng tôi bao gồm một chuỗi mã hóa cứng chứa mã nguồn cho Q, bên trong mã của Q. Nhưng điều đó là không thể. Giả sử mã cho Qmất 100 ký tự. Sau đó, chúng ta cần mã hóa một chuỗi 100 ký tự trong định nghĩa Q, ngoài ra chúng ta cũng cần thêm một số ký tự cho phần còn lại của logic - và điều đó thêm tối đa hơn 100 ký tự. Nếu bạn nghĩ về nó, rõ ràng là chúng ta không thể có một chuỗi hằng số bên trong mã Qđó là mã của Q, bởi vì nó sẽ quá dài.

Có lẽ bạn đang nghĩ rằng đó không phải là những gì bạn có trong đầu. Có thể bạn đã nghĩ rằng ngôn ngữ lập trình sẽ có một số API tích hợp để lấy mã của hàm hiện tại, vì vậy thực sự mã bạn đang nghĩ là một cái gì đó như:

def Q(J):
  if H(get_source_code_of_current_function(),J) then loop forever
  else halt

Được rồi Điều này chứng tỏ rằng vấn đề tạm dừng không thể được giải quyết đối với mã được viết bằng bất kỳ ngôn ngữ lập trình nào có get_source_code_of_current_function()API. Tuy nhiên, ngôn ngữ lập trình yêu thích của tôi không có API như vậy. Vì vậy, bằng chứng này không chứng minh bất cứ điều gì về ngôn ngữ lập trình yêu thích của tôi - có lẽ vấn đề tạm dừng có thể giải quyết được đối với ngôn ngữ của tôi, ai biết? Tương tự, các máy Turing không có API như vậy, vì vậy điều này không chứng minh rằng vấn đề tạm dừng đối với các máy Turing là không thể giải quyết được.

Và đó là một lỗ hổng lớn trong bằng chứng của bạn. Và đó là một lỗ hổng tinh tế và hoàn toàn không rõ ràng. Tôi không nghĩ rằng về mặt sư phạm là một ý tưởng tốt để đưa ra một bằng chứng rằng "có vẻ hợp lệ" trên bề mặt nhưng thực ra, một khi bạn đào sâu vào nó, thật thiếu sót.

Bây giờ, nó có thể để giải cứu chứng minh đề xuất của bạn. Nó thực sự có thể xây dựng một chức năng Qmà hoạt động theo cách bạn nói; về cơ bản bạn cần nó là một quine . Tôi cho rằng về nguyên tắc bạn có thể giải thích ý tưởng về các quines, sau đó trình bày bằng chứng của bạn và giải thích cách thực hiện một chức năng Q bằng cách sử dụng các ý tưởng đó. Nhưng đó dường như là một ý tưởng tồi đối với tôi, từ góc độ sư phạm. Quines là uốn cong tâm trí và bí ẩn và khó hiểu khó hiểu. Một sinh viên không hiểu quines sẽ không hiểu bằng chứng của bạn. Và nó làm cho bằng chứng về sự không thể giải quyết được cho vấn đề tạm dừng trông bí ẩn hơn rất nhiều so với nó cần phải có. Vì vậy, đây dường như không phải là một cách dễ hiểu hơn để hiểu vấn đề tạm dừng.


Câu trả lời tuyệt vời, cảm ơn rất nhiều! Tôi nghĩ rằng có lẽ đi với một bài thuyết trình chuẩn hơn là cách để đi (chứ không phải là giới thiệu quines chẳng hạn).
badroit

"về cơ bản bạn cần nó là một quine" - hoặc định nghĩa Q là một hằng số trong một chương trình lớn hơn và sau đó đánh giá nó bằng cách sử dụng một máy turing phổ dụng hoặc tương đương. Miễn là bạn chấp nhận rằng cỗ máy bảo vệ vạn năng hoạt động giống như cỗ máy đang chạy trong mọi hoàn cảnh, đó chắc chắn sẽ là một cách tiếp cận dễ hiểu hơn?
Jules

@Jules, xin lỗi, tôi không hiểu bằng chứng đề xuất của bạn, vì vậy tôi không thể nhận xét về nó.
DW

Bạn có phiền để giải thích lý do tại sao bạn coi quines khó hiểu? Theo kinh nghiệm của tôi, các quines có dạng Viết viết điều này và sau đó cùng một câu trích dẫn là khá đơn giản để xây dựng.
Dmitri Urbanowicz

@DmitriUrbanowicz, có lẽ đó chỉ là tôi và tôi chỉ bị mắc kẹt trên đó. Tôi tìm thấy những điều kỳ diệu và khó khăn để quấn đầu tôi. Có lẽ đó chỉ là tôi; hoặc có lẽ tôi chưa thấy lời giải thích đúng; hoặc có lẽ tôi đã không cố gắng đủ. Có lẽ những người khác sẽ có một kinh nghiệm khác!
DW

1

Tôi không thấy việc tự tham khảo là khó khăn về mặt sư phạm. Nghịch lý cắt tóc là khá dễ hiểu. Và đối số của bạn đã ngầm tham khảo bản thân, và tôi thấy nó khó hiểu hơn so với tự tham khảo đơn giản. Trên hết, nó không mạch lạc. Để xác định H (Q, J), trước tiên bạn cần biết Q là gì và để xác định Q, trước tiên bạn cần biết H (Q, J) là gì. Điều đó không hiệu quả. Tốt nhất bạn có thể khẳng định rằng Q là một điểm cố định của định nghĩa tự tham chiếu này, nhưng sau đó nếu bạn cố gắng rút ra bất cứ điều gì từ bản chất mâu thuẫn của Q, bạn chỉ hiển thị H không tồn tại HOẶC không tồn tại điểm cố định như vậy ; bây giờ bạn phải chứng minh rằng nếu H tồn tại, điểm cố định sẽ phải tồn tại.

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.