Ngôn ngữ lập trình với các chức năng chính


29

Có bất kỳ ngôn ngữ lập trình (chức năng?) Trong đó tất cả các chức năng có dạng chính tắc không? Nghĩa là, bất kỳ hai hàm nào trả về cùng một giá trị cho tất cả các bộ đầu vào được biểu diễn theo cùng một cách, ví dụ: nếu f (x) trả về x + 1 và g (x) trả về x + 2, thì f (f (x (x) )) và g (x) sẽ tạo ra các tệp thực thi không thể phân biệt khi chương trình được biên dịch.

Có lẽ quan trọng hơn, ở đâu / làm thế nào tôi có thể tìm thấy nhiều thông tin hơn về biểu diễn chính tắc của các chương trình ("chương trình đại diện chính tắc" của Google đã ít hiệu quả hơn)? Có vẻ như là một câu hỏi tự nhiên để hỏi và tôi sợ rằng tôi chỉ không biết thuật ngữ thích hợp cho những gì tôi đang tìm kiếm. Tôi tò mò liệu một ngôn ngữ như vậy có thể hoàn thành Turing hay không, và nếu không, ngôn ngữ lập trình bạn có thể có như thế nào, trong khi vẫn giữ được một tài sản như vậy.

Nền tảng của tôi khá hạn chế, vì vậy tôi thích các nguồn có ít điều kiện tiên quyết hơn, nhưng tham chiếu đến các nguồn nâng cao hơn cũng có thể thú vị, vì theo cách đó tôi sẽ biết tôi muốn làm gì để hướng tới.

Câu trả lời:


38

Mức độ mà điều này có thể thực sự là một câu hỏi mở lớn trong lý thuyết của phép tính lambda. Dưới đây là tóm tắt nhanh về những gì đã biết:

  • Phép tính lambda được gõ đơn giản với đơn vị, sản phẩm và không gian hàm có thuộc tính biểu mẫu chính tắc đơn giản. Hai thuật ngữ bằng nhau khi và chỉ khi chúng có cùng dạng beta-bình thường, eta dài. Việc tính toán các hình thức bình thường này cũng khá đơn giản.

  • Việc bổ sung các loại tổng hợp rất phức tạp vấn đề. Vấn đề bình đẳng vẫn có thể quyết định (từ khóa để tìm kiếm là "đẳng thức sao chép"), nhưng các thuật toán đã biết hoạt động vì những lý do cực kỳ khó hiểu và theo hiểu biết của tôi thì không có định lý dạng hoàn toàn thỏa mãn. Dưới đây là bốn cách tiếp cận tôi biết:

  • Việc bổ sung các loại không giới hạn, chẳng hạn như số tự nhiên, làm cho vấn đề không thể giải quyết được. Về cơ bản, bây giờ bạn có thể mã hóa vấn đề thứ mười của Hilbert.

  • Việc bổ sung đệ quy làm cho vấn đề không thể giải quyết được, bởi vì có các hình thức bình thường làm cho sự bình đẳng có thể quyết định được, và điều đó sẽ cho phép bạn giải quyết vấn đề tạm dừng.


Bài viết này mở rộng tính tương đương với các bản sao tương đương với tổng nhưng không có cú pháp biểu mẫu chính tắc "đơn", bạn chọn một "hàm bão hòa" đủ thông minh để phát hiện khi hai thuật ngữ bạn so sánh có chứng minh con sai. Nó giống với Ahmed-Licata-Harper nhất là cả hai đều sử dụng lấy nét.
Tối đa mới

Chỉ với đơn vị, sản phẩm và chức năng, số lượng thẻ của bất kỳ thứ gì bạn có thể viết ra là 1, trong khi nếu bạn tính tổng, bạn đột nhiên nhận được nhiều thông số khác nhau (và có thể thực hiện "tính toán hữu ích"). Là những sự thật liên quan?
glaebhoerl

1
@glaebhoerl: Tôi luôn miễn cưỡng nói các sự kiện không liên quan, nhưng trong trường hợp này tôi không thấy một kết nối rõ ràng. Hầu hết các kết quả tôi đã đề cập tiếp tục giữ nếu bạn thêm loại cơ sở vào ngôn ngữ (không có bất kỳ hình thức giới thiệu hoặc loại bỏ nào), nhưng (a) sẽ phá vỡ sự thật về tim mạch mà bạn lưu ý, vì và là các dạng bình thường khác nhau, nhưng (b) không ảnh hưởng đến bất kỳ thuật toán nào tôi biết. bλx:b.λy:b.xλx:b.λy:b.y
Neel Krishnaswami
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.