Viết hàm đệ quy phổ [đóng]


9

Có một cấu trúc rõ ràng ngắn của một hàm đệ quy phổ quát ? Tất cả các định nghĩa tôi đã thấy liên quan đến việc đánh số máy Turing theo một cách nào đó, điều này có thể khó và không thể quản lý để viết bằng ngôn ngữ lập trình cấp cao hơn (như Python, Haskell, v.v.)


Câu hỏi ban đầu được hỏi tại SO , có vẻ thích hợp hơn ở đây.
sdcvvc

1
Tôi hiểu rằng những gì một hàm đệ quy phổ quát thực hiện chính xác là đưa ra một số cách đánh số các hàm đệ quy (hoặc các máy Turing tương đương) để có thể tính kết quả từ chỉ số của hàm đệ quy và đầu vào. Do đó, một chức năng đệ quy phổ quát mà không cần đánh số máy Turing, âm thanh không hợp lý với tôi.
Tsuyoshi Ito

3
Không nghiên cứu trình độ. Bất kỳ trình thông dịch cho một ngôn ngữ hoàn chỉnh Turing là một hàm đệ quy phổ quát.
Warren Schudy

Câu trả lời:



13

Chắc chắn rồi. Viết các thói quen tính toán từng hàm đệ quy nguyên thủy của Godel và viết một thói quen cho toán tử tìm kiếm không giới hạn. Tập hợp các hàm bạn có thể tính theo cách này tương đương với tập hợp các hàm mà máy Turing có thể tính toán. Thêm thông tin ở đây .

Nhược điểm là bất kỳ đầu vào cho chương trình phổ quát của bạn sẽ cần phải được đóng khung về các hoạt động đơn giản. Tất nhiên, đó là những gì trình biên dịch dành cho.


10

Bất kỳ người phiên dịch cho bất kỳ ngôn ngữ nào là Turing hoàn chỉnh là một hàm đệ quy phổ quát. Có các phiên dịch cho các ngôn ngữ cấp cao như C ++ hoặc Python.

Đánh số Godel tồn tại, nhưng ngầm. Ví dụ, mã C ++ tính toán một hàm đệ quy là một chỉ mục cho .ggg


Trình thông dịch cho Turing Machines (hoặc Đăng ký Máy hoặc các hàm đệ quy) cũng là một hàm đệ quy phổ quát và không khó để thực hiện chúng. Tôi đã triển khai chúng trong C ++ vài năm trước và tôi khá chắc chắn rằng nó thậm chí còn đơn giản hơn trong Python. Sử dụng Google, có rất nhiều trình giả lập miễn phí trên Internet và một số trong số chúng thậm chí là nguồn mở.
Kaveh

8

Một hàm phổ quát ucó thể được viết khá dễ dàng bằng ngôn ngữ giống Haskell (không có tác dụng phụ, hàm bậc cao hơn), cụ thể là:

u f x = f x

Chức năng ulà phổ biến vì nó chấp nhận (các mô tả về) một chương trình fvà một băng đầu vào x, và cho bạn biết kết quả của hoạt động ftrên x.

Mặc dù câu trả lời này không hoàn toàn nghiêm trọng, nhưng nó cho thấy trình biên dịch hoặc trình thông dịch cho ngôn ngữ giống như Haskell đã chứa tất cả các phần xây dựng cần thiết cho một chức năng phổ quát. Đạo đức của câu chuyện là thời gian được dành để nghiên cứu cách trình biên dịch và phiên dịch viên hoạt động tốt hơn là lo lắng về việc thực hiện một chức năng phổ quát về mặt máy Turing.


Tuy nhiên, ucó một hàm - tôi gọi nó là hàm bậc cao hơn. Tôi muốn ulấy một số nguyên hoặc một kiểu dữ liệu đại số thông thường. Tôi không ép buộc bất kỳ mô hình tính toán cụ thể nào, miễn là đối số ulà hữu hình - ví dụ: nó có thể được nối tiếp từ / đến một chuỗi.
sdcvvc

Trên một máy thực tế (một khi mã được biên dịch) usẽ đóng, đó là một chuỗi hữu hạn của byte. Ngay cả trong định lý utm thông thường, số nguyên uđại diện cho một hàm.
Andrej Bauer

5

Kiểm tra bài viết này của John Tromp, sử dụng logic kết hợp. Một bài viết trước đó, dường như không còn nữa, thậm chí còn gọn gàng hơn.

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.