Có ngôn ngữ lập trình nào sử dụng các hàm đệ quy chung làm cơ sở không?


23

Đây là một câu hỏi ngây thơ và, do đó, có thể là sai, vì vậy xin lỗi trước!

Quan điểm của tôi là Máy Turing có thể được coi là cơ sở tính toán cho các ngôn ngữ lập trình thủ tục / mệnh lệnh. Tương tự, phép tính lambda là nền tảng cho các ngôn ngữ lập trình chức năng.

Gần đây tôi đã biết rằng Luận án Giáo hội cũng cho thấy sự tương đương lẫn nhau với một mô hình tính toán thứ ba: các hàm đệ quy chung . Có ngôn ngữ lập trình nào sử dụng điều này làm mô hình tính toán của họ không? Nếu không, có một lý do kỹ thuật tại sao; tức là, ngoài "Chưa có ai thử"?


1
Tôi muốn nói rằng máy Turing hoặc máy đăng ký vạn năng là cơ sở của PL bộ xử lý (PL hội). Họ không có chức năng. chức năng -recursive là một cơ sở PLS bắt buộc. Họ không có chức năng bậc cao. μ
beroal

1
Tôi cũng sẽ khuyên bạn nên xem xét logic và Prolog đầu tiên.
beroal

1
Trước C ++ 11, constexprbạn có thể (/ phải) sử dụng 'mẫu' để có các tính toán được thực hiện tại thời điểm biên dịch bởi trình biên dịch. Các hạn chế đối với các mẫu không cho phép các vòng lặp, nhưng bạn có thể sử dụng đệ quy để mô phỏng bất kỳ vòng lặp nào, để bạn kết thúc với một cơ sở Turing-Complete (lập trình meta) như một phần của tiêu chuẩn ngôn ngữ C ++, xem ví dụ stackoverflow.com/questions / 189172 / c-samples-turing-
Complete

Câu trả lời:


45

Câu trả lời trực tiếp cho câu hỏi: yes, có PLS bí truyền và rất không thực tế dựa trên chức năng -recursive (nghĩ Khoảng trắng), nhưng không có ngôn ngữ lập trình thực tế được dựa trên μ chức năng -recursive vì lý do hợp lệ.μμ

Đệ quy chung (ví dụ, -recursive) chức năng là ít hơn đáng kể diễn cảm hơn lambda sỏi. Vì vậy, họ tạo ra một nền tảng kém cho các ngôn ngữ lập trình. Bạn cũng không phải là đúng rằng TM là cơ sở của PLS bắt buộc: trong thực tế, ngôn ngữ lập trình cấp bách tốt là gần gũi hơn với λ -calculus hơn là cho các máy Turing.μλ

Về computability, chức năng -recursive, máy Turing, và untyped λ -calculus đều tương đương. Tuy nhiên, LC chưa được đánh dấu có các đặc tính tốt mà không ai trong hai người kia có. Nó rất đơn giản (chỉ có 3 hình thức cú pháp và 2 quy tắc tính toán), có tính sáng tác cao và có thể diễn tả các cấu trúc lập trình tương đối dễ dàng. Hơn nữa, được trang bị với một hệ thống kiểu đơn giản (ví dụ, hệ thống F W mở rộng với f i x ), các λ -calculus có thể được vô cùng biểu cảm ở chỗ nó có thể bày tỏ nhiều cấu trúc lập trình phức tạp một cách dễ dàng, chính xác và về thành phần. Bạn cũng có thể kéo dài tuổi λμλFωfixλλ-calculus dễ dàng bao gồm các cấu trúc không phải là lambdas. Không có mô hình tính toán nào khác được đề cập ở trên cung cấp cho bạn những đặc tính tốt đẹp đó.

Máy Turing không phải là thành phần hay phổ quát (bạn cần phải có TM cho từng vấn đề). Không có khái niệm về "hàm", "biến" hoặc "thành phần". Cũng không chính xác rằng TM là nền tảng của PL bắt buộc - FWIW, PL bắt buộc rất nhiều, gần với tính toán lambda với các toán tử điều khiển hơn so với máy Turing. Xem Peter J. Landin "Một sự tương ứng giữa ALGOL 60 và Lambda-Notation" để được giải thích chi tiết. Nếu bạn đã lập trình trong Brainf ** k (thực tế thực hiện một máy Turing khá đơn giản), bạn sẽ biết rằng máy Turing không phải là một ý tưởng tốt để lập trình.

chức năng rec -recursive tương tự như TM về mặt này. Chúng là thành phần, nhưng gần như không có cấu tạo như LC. Bạn cũng có chỉ không có thể mã hóa cấu trúc lập trình rất hữu ích trong μ chức năng -recursive. Hơn nữa, μ chức năng -recursive chỉ tính trên N , và để tính toán hơn bất cứ thứ gì bạn cần để mã hóa dữ liệu của bạn vào các số tự nhiên sử dụng một số loại Godel đánh số, đó là đau đớn.μμμN

Vì vậy, nó không phải là một trùng hợp ngẫu nhiên mà hầu hết các ngôn ngữ lập trình được bằng cách nào đó dựa trên các -calculus! Các λ -calculus có các đặc tính tốt: biểu cảm, compositionality và khả năng mở rộng, mà các hệ thống khác thiếu. Tuy nhiên, máy Turing là tốt để nghiên cứu tính toán phức tạp, và L chức năng -recursive là tốt cho nghiên cứu các khái niệm logic của computability. Cả hai đều có đặc tính nổi bật mà λ -calculus thiếu, nhưng trong lĩnh vực lập trình λ -calculus thắng rõ ràng.λλμλλ

Trên thực tế, có rất nhiều, rất nhiều hệ thống hoàn chỉnh Turing ngoài kia, nhưng chúng không có bất kỳ tài sản nổi bật nào. Trò chơi Cuộc sống của Conway, macro LaTeX và thậm chí (một số tuyên bố) DNA đều đã hoàn tất Turing, nhưng không có chương trình nào (tức là lập trình nghiêm túc) với Conway hoặc nghiên cứu độ phức tạp tính toán bằng cách sử dụng macro LaTeX. Họ chỉ đơn giản là thiếu tài sản tốt. Turing hoàn thành mỗi se gần như vô nghĩa khi nói đến lập trình.

Ngoài ra, nhiều hệ thống tính toán hoàn chỉnh không Turing rất hữu ích khi lập trình. Các biểu thức thông thường và yacc không hoàn thành Turing, nhưng chúng cực kỳ mạnh mẽ trong việc giải quyết một loại vấn đề nhất định. Coq cũng không hoàn thành Turing, nhưng nó cực kỳ mạnh mẽ (nó thực sự được coi là biểu cảm hơn nhiều so với người anh em hoàn chỉnh Turing của nó, OCaml). Khi nói đến lập trình, tính hoàn chỉnh của Turing không phải là chìa khóa, vì nhiều hệ thống vô dụng (gần với) hoàn toàn không thú vị Turing. Bạn sẽ không cho rằng Brainf ** k hoặc Whitespace là ngôn ngữ lập trình mạnh hơn Coq, phải không? Một biểu cảm nền tảng là chìa khóa để ngôn ngữ lập trình mạnh mẽ, và đó là lý do tại sao ngôn ngữ lập trình hiện đại được hầu như luôn luôn dựa trên λ-calculus.


7
"không có ai lập trình với Conway" ... một số người xây dựng một trò chơi Tetris hoạt động trong Trò chơi cuộc sống của Conway ... cũng thực sự nó thực tế như khoảng trắng :)
Alexei Levenkov

Một cách để thấy điều này là một chức năng -calculus mô phỏng máy Turing có lẽ sẽ ngắn hơn nhiều so với một máy Turing rằng mô phỏng λ -calculus (không phải là tôi đã nhìn thấy một trong hai). λλ
Chính tả không liên kết

@AlexeiLevenkov Điều đó hoàn toàn sai sự thật. Khoảng trắng về cơ bản là một ngôn ngữ bắt buộc (đơn giản), mặc dù có một cú pháp lạ. Nó có cơ sở vật chất cho số học, dòng chảy cơ bản kiểm soát, ngăn xếp và thao tác heap, và I / O . Mặt khác, dự án QFT yêu cầu thiết kế một trình biên dịch từ ngôn ngữ rất đơn giản cho đến tổ hợp RISC được tạo cho CPU được xây dựng trong một máy tự động di động giống như thế giới dây được mô phỏng bằng OTCA Metapixels .
Chính tả không liên kết

@AlexeiLevenkov Trình biên dịch Cogol → CGoL cuối cùng yêu cầu công việc của nhiều người trong bốn năm, trong khi đó tồn tại một dự án có tên HaPyLi , biên dịch một ngôn ngữ phức tạp hơn nhiều cho Whitespace, được viết bởi một người trong thời gian rảnh rỗi.
Chính tả không liên kết

4

Nhập µ-recursive function programming languagevào Google đã dẫn tôi đến repo GitHub này , vì vậy câu trả lời cho câu hỏi của bạn là:

Vâng, và nó được gọi là cận thị

Nhân tiện, nó được viết bằng Haskell.


μ

2
Tất nhiên. Tôi chỉ cho rằng OP muốn tìm một ngôn ngữ như vậy để nghiên cứu lý thuyết hoặc thứ gì đó, chứ không phải thực sự chinh phục thế giới với nó ;-)
Kapol
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.