Làm thế nào là giải pháp của Turing cho vấn đề dừng lại không chỉ đơn giản là thất bại của thiết kế bởi?


7

Tôi đang gặp khó khăn khi xem giải pháp của Turing cho vấn đề dừng lại với tư cách là một nhà logic học, thay vì là một kỹ sư.

Dưới đây là sự hiểu biết của tôi về vấn đề dừng:

Để cho M là tập hợp của tất cả các máy Turing.

Để cho ilà tập hợp của tất cả các nguyên liệu đầu vào cho tất cả các máy Turing trong . M

Đặt mọi phần tử trong là một phần tử trong . Mi

Đặt các giá trị boolean và là các phần tử trong . truefalsei

Đặt là một hàm trả về: h(M,i)

  • true khi và chỉ khi dừng lại M(i)
  • false khi và chỉ khi không dừng lại M(i)

Đặt là Máy Turing trong rằng:p(M)M

  • gọih(M,M)
  • dừng lại khi và chỉ khi trả vềh(M,M)false
  • không dừng lại khi và chỉ khi trả vềh(M,M)true

Điều gì xảy ra khi chúng ta gọi bằng cách truyền cho chính nó, ?ppp(p)

Phần tôi gặp vấn đề là triển khai để nó không dừng lại khi là . Ruột của tôi hiểu cách tiếp cận này như sau:p(M)h(M,M)true

Đưa ra một phương pháp h() nó hoạt động, và một phương pháp p() được thiết kế để phá vỡ h(), khi chúng ta kết hợp các phương pháp này để xây dựng một máy, máy đó bị hỏng.

Tôi hiểu bằng chứng bằng mâu thuẫn là một cách tiếp cận hợp lệ để giải quyết vấn đề theo logic hình thức, nhưng ứng dụng chứng minh cụ thể bằng mâu thuẫn này dường như còn thiếu sót.

Tôi đang thiếu gì?


2
Nó sẽ giúp ích cho cuộc thảo luận này nếu bạn có thể làm rõ chính xác lý do tại sao bạn cảm thấy rằng "ứng dụng cụ thể này có vẻ thiếu sót". Nhận xét của bạn về các câu trả lời giúp ích một chút, nhưng tôi vẫn không thấy chính xác điều gì gây phiền toái cho bạn.
Rick Decker

Câu trả lời:


10

Trong phần tiếp theo, tôi sẽ phân biệt một máy M từ mô tả của nó, biểu thị mô tả của M bởi M.

Đặc điểm kỹ thuật của chương trình thử nghiệm tạm dừng, H

H lấy làm đầu vào một cặp (M,i), Ở đâu M là mô tả của máy Mi là đầu vào theo yêu cầu của M.

Htạm dừng trên bất kỳ cặp đầu vào(M,i) và trả về câu trả lời đúng, cụ thể là:

H(M,i)trả về true khi và chỉ khiM tạm dừng đầu vào i.

Bây giờ, giả sử rằng có một máy như vậy H, chúng ta có thể sử dụng H như một chương trình con để xây dựng một chương trình P như sau:

Đặc điểm kỹ thuật của chương trình "đồi trụy" P

P lấy làm đầu vào mô tả, M, của một cái máy M.

Phoạt động chính xác trên bất kỳ đầu vàoM, cụ thể là

P(M) dừng lại khi và chỉ khi M không dừng lại khi đưa ra đầu vào M.

Chìa khóa cho lập luận này là nếu chúng ta có thể định nghĩa một máyHmà châm biếm các đặc điểm kỹ thuật ở trên, sau đó chúng ta có thể xây dựng một máyP đáp ứng các đặc điểm kỹ thuật thứ hai.

Tuy nhiên, P, khi được đưa ra P, thể hiện hành vi không thể,

P(P) dừng lại khi và chỉ khi P(P) không dừng lại.

Vì thế Pkhông đáp ứng yêu cầu thứ hai của nó về ít nhất một đầu vào và do đó nó phải là trường hợpH không thể đáp ứng yêu cầu của nó, do đó chúng tôi không thể thực hiện H theo quy định.

Hiện nay H rất có thể cư xử tốt như được chỉ định trên nhiều đầu vào (M,i), nhưng vấn đề là không có công cụ kiểm tra tạm dừng nào có thể được xây dựng hoạt động trên tất cả các đầu vào có thể.


4

Đây là cách một nhà logic học có thể tiếp cận vấn đề:

h(M,i) là giải pháp tình huống chung cho vấn đề Dừng theo định nghĩa.

(1) h(M,i) phải có khả năng xác định có hay khôngMtạm dừng cho tất cả M(tức là một bộ không giới hạnM ).

p(M) là một yếu tố trong M.

(2) Các câu sau đây là tương đương:

  • p(M) dừng lại khi và chỉ khi h(M,M) trả lại false
  • p(M) dừng lại khi và chỉ khi p(M) không dừng lại

(3) Ngoài ra, các tuyên bố sau là tương đương:

  • p(M) không dừng lại khi và chỉ khi h(M,M) trả lại true
  • p(M) không dừng lại khi và chỉ khi p(M) dừng lại

Cả hai (2)(3) là những mâu thuẫn.

h(M,i)- giải pháp tình huống chung cho Vấn đề Ngừng - xác định chính xác liệu có hay khôngp(M) dừng lại, mâu thuẫn (1). Do đó, giải pháp tình huống chung cho Vấn đề Ngừng không tồn tại.


4

Bạn nói:

Phần tôi gặp vấn đề là thực hiện p(M) để nó không dừng lại khi h(M,M)true. Ruột của tôi hiểu cách tiếp cận này như sau:

Đưa ra một phương pháp h() nó hoạt động, và một phương pháp p() được thiết kế để phá vỡ h(), khi chúng ta kết hợp các phương pháp này để xây dựng một máy, máy đó bị hỏng.

Vấn đề là ở đó p() KHÔNG được thiết kế để phá vỡ h(), nó được thiết kế để sử dụng h()- và việc sử dụng là hợp lệ VÀ hoạt động! Ngoại trừ, nó không hoạt động khi đầu vào làp(), điều đó chứng tỏ rằng nó không hoạt động cho tất cả các đầu vào.

Có nghĩa là h() không tồn tại, tốt nhất hminus()tồn tại Nó không quan trọngp() bị hỏng, điều quan trọng là h() không tồn tại.

Nếu ai đó nói rằng họ đã viết h() bạn biết họ đang nhầm lẫn hoặc nói dối, nếu họ muốn tạo ra h() họ đang lãng phí tiền của bạn, vân vân.

Nó thiết lập ranh giới cho những gì có thể và không thể được quyết định và các nguồn lực cần thiết để làm như vậy.

Nếu ai đó đặt câu hỏi: chúng ta có thể xác định xem p()dừng lại cho đầu vào này? Các câu trả lời khả dĩ cho điều đó là: (a) có - nó có, (b) có - nó không (c) có Lít- nhưng hiện tại chúng tôi không biết liệu nó có hay không, và cuối cùng (d) không có- không thể chứng minh bằng cách này hay cách khác.

Có thể nhanh chóng xác định xem câu trả lời là (c) hay (d) có thể cực kỳ hữu ích. Hãy nhớ rằng Halting không nói rằng chúng ta không thể chứng minh một cách cụ thểp()Dừng lại, Dừng lại nói rằng chúng tôi không thể có một giải pháp chung sẽ hoạt động cho bất kỳ đầu vào nào. Hạn chế một trong haip() hoặc đầu vào và câu trả lời là khá thường xuyên có, đó là chuyện nhỏ.


3

Bạn không nên nghĩ về điều đó theo nghĩa "sự cố" bởi vì có rất nhiều chương trình hoàn toàn hợp pháp được thiết kế để chạy mãi mãi, vì vậy chạy mãi mãi không nhất thiết là hành vi "bị hỏng".

plà thuật toán đơn giản sau đây, giả sử rằng chúng ta đã có một hàm h(X,Y)trả về truenếu máy Xtạm dừng với đầu vào Yvà trả về falsenếu không.

function p(M)
    if (h(M,M)) then
        while (true) do
        endwhile;
    return;

Mặc dù có rất nhiều chương trình hoàn toàn hợp pháp được thiết kế để chạy mãi mãi, nhưng vẫn có những yêu cầu áp đặt cho dự án này. Cụ thể, nó sẽ giải quyết vấn đề dừng. p () được thiết kế sao cho khi kết hợp với h (), máy kết quả sẽ không còn đáp ứng yêu cầu của dự án. Đây không phải là một lỗ hổng thiết kế sao?
Học sinh vào

3
Số h()được thiết kế để "đáp ứng các yêu cầu của dự án" (nghĩa là quyết định vấn đề tạm dừng). Chúng tôi giả định rằng chương trình này tồn tại và hoạt động. p()là một cái gì đó mà một trong những lập trình viên của bạn đã viết trong khi anh ấy đang loay hoay trong giờ nghỉ trưa. Không phải là nó "không đáp ứng các yêu cầu của dự án", đó là một chương trình không thể : nếu nó không dừng lại, nó sẽ dừng lại; nếu nó dừng lại, nó không dừng lại. Vì giả định h()tồn tại và hoạt động dẫn đến một tình huống không thể, chúng tôi buộc phải kết luận rằng h() nó không tồn tại.
David Richerby

Có phải chúng ta đang nói rằng p () là một chương trình bất khả thi, hay chúng ta đang nói rằng p () kết hợp với h () - nói chung - là một chương trình không thể?
Học sinh vào

Tôi đoán tôi có thể thấy lỗ thỏ chúng ta đang đi xuống: để p () đánh giá p, p phải được cho ăn đầu vào; tại sao không p Nhưng để p () để đánh giá p, p phải là đầu vào của thức ăn; tại sao không ... và cứ thế.
Học sinh vào

1
"Có rất nhiều chương trình hoàn toàn hợp pháp được thiết kế để chạy mãi mãi" - bạn đang suy nghĩ hay bán quyết định hoặc những thứ như hệ điều hành? Nếu sau này, điều này vượt ra ngoài khuôn khổ của TM và do đó nên bỏ qua các câu hỏi mới bắt đầu như thế này (imho).
Raphael

3

Có một bằng chứng khác bởi mâu thuẫn mà bạn có thể thích hơn, được mô phỏng theo nghịch lý của Berry. Đối với máy TuringT, để cho N(T)là đầu ra của máy Turing khi chạy trên một băng trống, được hiểu là một số; có khả năngN(T)là không xác định, nếu máy không bao giờ dừng lại. Để choXn là số nhỏ nhất không thể tạo ra bởi máy Turing có nhiều nhất ntrạng thái (một số như vậy tồn tại vì có rất nhiều máy Turing như vậy). Giả sử vấn đề tạm dừng là có thể giải quyết được. Sau đó, chúng ta có thể xây dựng một máy Turing thực hiện thuật toán sau:

  1. Viết mã hóa nhị phân của n trên băng.
  2. Vượt qua tất cả các máy Turing có nhiều nhất n trạng thái, và đối với mỗi trong số chúng dừng lại, hãy tính số lượng chúng tính toán.
  3. Xuất ra số nhỏ nhất không xuất hiện trong bước 2, đó là Xn.

Hai giai đoạn sau có thể được thực hiện bằng máy Turing cố định có C trạng thái, và lần đầu tiên sử dụng thêm log2nNhững trạng thái. Tổng cộng, chúng tôi có được một máy Turing cólog2n+C trạng thái tính toán Xn. Khi nàon là đủ lớn, chúng tôi đạt được một mâu thuẫn kể từ khi log2n+Cn: một mặt, Xn không nên tính toán bằng máy Turing nNhững trạng thái; mặt khác, máy ở trên chỉ tính toán nólog2n+Cn Những trạng thái.

Tôi đã nghe bằng chứng này từ Ran Raz .


0

Điểm của vấn đề tạm dừng là không thể quyết định với một thuật toán cho dù thuật toán đã cho dừng lại. Chắc chắn, bạn có thể đưa ra các thuật toán sẽ luôn dừng lại (đối với tất cả các đầu vào đã cho). Tuy nhiên, bạn không thể quyết định điều này cho tất cả các thuật toán (ví dụ:p) với một thuật toán, do đó không có thuật toán h có thể tồn tại

Được p(p(Một))), đối với một thuật toán nhất định Một. Nếuh nói với bạn Một dừng lại, sau đó bên trong p sẽ không và bên ngoài p sẽ trả lại sai. NếuM không dừng lại bên trong p sẽ không dừng lại, nhưng bên ngoài p sẽ trả lại sai. Do đó, h không thể quyết định liệu p sẽ dừng lại.


1
Từ ngữ của bạn là mơ hồ; bạn cần phải làm rõ rằng "để nói" có nghĩa là "quyết định với một thuật toán" và theo thứ tự các bộ lượng tử xảy ra theo thứ tự nào ("cho mỗi chương trình tồn tại một thuật toán ..." vs "có một thuật toán ... cho tất cả các chương trình ").
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.