Tại sao các hàm tổng số không được liệt kê?


29

Chúng tôi đã học về khái niệm liệt kê các chức năng. Trong thực tế, chúng tương ứng với các ngôn ngữ lập trình.

Trong một nhận xét trôi qua, giáo sư đã đề cập rằng lớp của tất cả các hàm tổng (tức là các hàm luôn chấm dứt cho mọi đầu vào) là không thể đếm được. Điều đó có nghĩa là chúng ta không thể tạo ra một ngôn ngữ lập trình cho phép chúng ta viết tất cả các hàm nhưng không có ngôn ngữ nào khác --- sẽ rất tuyệt nếu có!

Vì vậy, làm thế nào mà chúng ta (dường như) phải chấp nhận tiềm năng không chấm dứt nếu chúng ta muốn sức mạnh tính toán tốt?

Câu trả lời:


24

Vì đường chéo. Nếu là một liệt kê tính toán của tất cả tổng các chức năng tính toán từ N đến N , sao cho mỗi e e là tổng, sau đó g ( i ) = f i ( i ) + 1 cũng sẽ là một tổng tính toán chức năng, nhưng nó sẽ không được liệt kê. Điều đó sẽ mâu thuẫn với các giả định về trình tự. Do đó, không có phép tính toán nào của các hàm có thể bao gồm chính xác các hàm tính toán được.(fe:eN)NNfeg(i)=fi(i)+1

Giả sử chúng ta nghĩ về một chức năng tính toán phổ , nơi có nghĩa là "phổ quát" h là một hàm nhị phân tính toán và cho mỗi tổng tính toán chức năng unary f ( n ) có một số e như vậy f ( i ) = h ( e , i ) cho tất cả i . Sau đó cũng phải có một số e sao cho g ( n ) = h ( e , n )h(e,i)hf(n)ef(i)=h(e,i)ieg(n)=h(e,n)không phải là một hàm tổng, vì đoạn trước. Nếu không, sẽ đưa ra một phép tính tổng thể của các hàm unary tính toán được bao gồm tất cả các hàm unary tính toán được.h

Do đó, yêu cầu rằng mọi chức năng là một hệ thống các chức năng là không tương thích với sự tồn tại của một chức năng phổ quát trong hệ thống đó. Đối với một số hệ thống yếu, chẳng hạn như các hàm đệ quy nguyên thủy, mọi hàm đều là tổng nhưng không có các hàm phổ quát. Các hệ thống mạnh hơn có chức năng phổ quát, chẳng hạn như tính toán Turing, đơn giản phải có các chức năng một phần để cho phép chức năng phổ quát tồn tại.


Tôi chỉ muốn nói thêm rằng ai đó đã tìm thấy những gì có vẻ là một lỗ hổng trong đường chéo. Nếu bạn sử dụng một đại diện được gõ cho chương trình, bạn có thể sử dụng hệ thống loại để không cho phép chéo và tạo ra một trình thông dịch tự tổng. Xem Phá vỡ rào cản bình thường hóa: Trình thông dịch tự dịch cho F-omega để biết chi tiết.
hatch22

Tất nhiên, Hệ thống F không phải là một hệ thống hoàn chỉnh Turing. Bài báo bạn liên kết thật thú vị; có vẻ như họ xoay sở để tận dụng sự không hoàn chỉnh theo một cách thú vị.
Carl Mummert

Tôi không hiểu tại sao "thì cũng sẽ là một hàm tính toán tổng". Nếu g là tổng chức năng tính toán thì k , f k = g , sau đó đánh giá g ( k ) đòi hỏi phải đánh giá g ( k ) = f k ( k ) + 1 = g ( k ) + 1g(i)=fi(i)+1gk,fk=gg(k)g(k)=fk(k)+1=g(k)+1: mâu thuẫn. Vì vậy, dường như nếu có một bảng liệt kê các hàm tính toán tổng, chúng ta thậm chí không thể xây dựng , do đó chúng ta không thể đạt được mâu thuẫn để bác bỏ giả thuyết ban đầu (Chúng ta có thể đạt được một mâu thuẫn, nhưng nó chỉ từ chối g là hoàn toàn có thể tính toán được). gg
agemO

Và thậm chí sử dụng một đường chéo thay đổi để tránh vấn đề này dường như dẫn đến mâu thuẫn.
agemO

10

Để rõ ràng, chúng ta cần phân biệt các hàm toán học (tôi sẽ gọi chúng là các hàm và thường có rất nhiều trong số chúng để chúng không thể đếm được) và các hàm bạn có thể viết: Tôi sẽ gọi chúng là các chương trình hoặc cũng có thể tính toán được .

Một tập hợp con của một tập hợp đếm được E được gọi là tính toán nếu có một chương trình, đưa ra một yếu tố x của E trả lời "yes" nếu x S và "no" nếu x S . (Và anh ta luôn phải trả lời một cái gì đó) Một tập hợp được gọi là đệ quy vô số nếu chương trình được ủy quyền không trả lời thay vì nói "không". (tương đương với yêu cầu chương trình phải in tất cả các phần tử của S theo bất kỳ thứ tự nào)SExExSxSS

Tập hợp của tất cả các chương trình mà là tổng trên một tập hợp hữu hạnđếm được vì bạn có thể viết một thông dịch viên mà chỉ cần chạy chương trình trên tất cả các yếu tố của tập hữu hạn và trở lại "yes" nếu tất cả họ đều chấm dứt. (Nhưng không thể xem có ai trong số họ không)

Giáo sư của bạn nói rằng tập hợp tất cả các chương trình có tổng số trên một tập hợp vô hạnkhông thể đếm được vì bạn không thể chạy chương trình của mình với vô số phần tử.

Nhưng điều này không có nghĩa là điều này là xấu:

  1. Ví dụ tập nếu tất cả các chương trình mà là provably tổng là đếm được vì bạn có thể liệt kê tất cả các bằng chứng và cách máy móc kiểm tra xem họ chứng minh chương trình của bạn là tổng.

  2. Ngay cả một bộ vô số cũng sẽ không thực tế, bởi vì bạn có thể phải đợi mãi mà không chắc chắn liệu thủ tục có chấm dứt một ngày không. Tôi không thấy cách sử dụng một chương trình liệt kê tất cả các chức năng ...

Có một số ngôn ngữ lập trình trong đó mọi thứ bạn viết được đảm bảo chấm dứt chỉ bằng cách gõ tĩnh! Thậm chí có một số đảm bảo cho bạn đa thức ràng buộc. Hiện tại chúng chủ yếu mang tính học thuật, viết bằng những thứ đó có thể sẽ khiến bạn cảm thấy những hạn chế hơn khi viết bằng Python, nhưng có rất nhiều nhà nghiên cứu làm việc này.

Vì vậy, để trả lời câu hỏi của bạn: trong một ý nghĩa, có. Không chấm dứt tiềm năng là cần thiết để hoàn thành Turing (sức mạnh tính toán cao nhất hiện nay). Nhưng tôi không thấy điều này có liên quan trực tiếp đến thực tế là tổng số hàm có thể đếm được hay không. Bạn vẫn có thể viết tất cả các chương trình!


2
"Bởi vì bạn không thể chạy chương trình của mình với số lượng phần tử vô hạn" - đây là một đối số yếu vì tôi có thể không cần phải làm điều này nếu tôi có thể cứu vãn tất cả thông tin tôi cần từ chính chương trình. Xem ở đây cho một câu hỏi minh họa sự nguy hiểm của lý luận của bạn.
Raphael

Thật. Tôi không khẳng định đó là một bằng chứng (như mọi khi bạn phải xây dựng một đối số đường chéo) và có lẽ tôi không nên sử dụng từ "bởi vì". Tôi đã cố gắng trả lời câu hỏi của bạn (mà tôi nghĩ) không phải là bằng chứng về tuyên bố của giáo sư mà là lý do tại sao chấm dứt xung đột với sức mạnh tính toán.
jmad
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.