Tổng ngôn ngữ lập trình chức năng mà không cần trình kiểm tra kiểu tĩnh


7

Tất cả các bài viết với chủ đề lập trình chức năng tổng thể sử dụng một số loại kiểm tra kiểu tĩnh để đảm bảo tính tổng. Điều này có ý nghĩa khi xem xét hoy một cách dễ dàng là tạo ra một ngôn ngữ Turing-Complete. Câu hỏi đặt ra là: Có bất kỳ hình thức chính thức nào được đánh máy / đánh máy động để đảm bảo tổng số chức năng không?

Biên tập

Nói cách khác, tồn tại bất kỳ chủ nghĩa hình thức nào chỉ cho phép xây dựng các hàm tổng, với việc không thể xây dựng các hàm một phần, do đó không cần giai đoạn lọc như trình kiểm tra loại hoặc phân tích kết thúc?


3
Không cần phải giữ dấu "Chỉnh sửa" trong lịch sử sửa đổi bài đăng, vì vậy chỉnh sửa phải liền mạch và hy vọng không làm mất hiệu lực các câu trả lời hiện có.
Ác

2
Khá nhiều ngôn ngữ được định nghĩa là một cú pháp trên chuỗi và đó là giai đoạn lọc.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


9

Câu hỏi là, làm thế nào để bạn loại bỏ các thuật ngữ chạy mãi mãi:

Đặc biệt, những thứ như (λx.x x)(λx.x x) và bộ kết hợp Y KHÔNG phải bằng ngôn ngữ của bạn, vì chúng có thể được sử dụng để xây dựng các tính toán không dừng lại.

Gõ tĩnh trong những thứ như Hệ thống F sẽ loại bỏ những điều này: chúng bắt đầu bằng một phép tính lambda đầy đủ, và sau đó lọc ra các thuật ngữ không được gõ.

Nhưng, hãy làm điều này trong một cài đặt chưa được chỉnh sửa, bạn cần loại bỏ các điều khoản này bằng cách xây dựng . Chúng không thể diễn tả bằng ngôn ngữ của bạn.

Tôi có thể nghĩ ra một số cách ngớ ngẩn để làm điều này, như ngôn ngữ của các chương trình bắt buộc không có chức năng hoặc chỉ có các vòng lặp trong danh sách. Nhưng nói chung, ngay khi bạn có các hàm bậc cao hơn, các cấu trúc có vấn đề này có thể xây dựng được. Vì vậy, trong khi tôi sẽ không nói rằng điều đó là không thể, có lẽ rất khó để thực hiện theo cách có ý nghĩa nhiều.

Bạn có thể lọc tĩnh những thứ này bằng một thứ không phải là hệ thống loại, với trình kiểm tra chấm dứt, nhưng chúng sẽ luôn đưa ra các kết quả dương tính giả và trong khi chúng không gõ tĩnh, chúng vẫn là một bộ lọc tĩnh chương trình của bạn.

Lưu ý rằng, tùy thuộc vào nội dung bạn xem là "gõ động", bạn có thể loại bỏ các chương trình như thế này bằng cách theo dõi các loại bằng cách sử dụng suy luận, nhưng chỉ ném lỗi khi chạy. Do đó, một cái gì đó như tổ hợp Y vẫn bị từ chối, chỉ sau đó. Điều này được gõ động, nhưng có lẽ không phải là những gì bạn đang tìm kiếm.


Đây là lý do tại sao tôi nói "xem xét hoy một cách dễ dàng là tạo ra một ngôn ngữ Turing-perfect" ... Mặc dù tiêu cực, đây là một câu trả lời rất hữu ích. Đặc biệt là thuật ngữ bộ lọc / xây dựng . Đây chính xác là lý do tại sao tôi đang tìm kiếm, một chủ nghĩa hình thức chỉ cho phép bạn xây dựng các hàm tổng mà không cần giai đoạn lọc.
dùng3368561

1
@ user3368561 Cũng có một số cách bạn có thể thực thi điều này bằng ngữ nghĩa, ví dụ: sửa một số nguyên kvà không bao giờ làm nhiều hơn kcác bước giảm. Nhưng sau đó, việc chấm dứt thực sự chỉ vì bạn đã thay đổi ngữ nghĩa chứ không phải là bạn đã ngăn chặn nó bằng ngôn ngữ.
jmite

5

Chắc chắn rồi! Thậm chí còn có một triển khai hiện có! Tôi đã viết loop.pychương trình này bằng python:

while True:
    print "Hello world!"
    print "20 GOTO 10"

Và chạy nó như thế này : timeout 10 python loop.py. Tadaa!

Hơn nữa, bạn nghĩ gì về "phân tích tĩnh"? Một ngôn ngữ lập trình chỉ chứa các vòng lặp for sẽ luôn chấm dứt. Là phân tích cú pháp "phân tích tĩnh"? Làm thế nào về một trình biên dịch biên dịch một chương trình C và chạy nó trong 10 giây và chỉ trả về mã được biên dịch nếu chương trình kết thúc?

Trong CS lý thuyết, chúng tôi luôn có tùy chọn chạy chương trình một vài bước tại "thời gian biên dịch" để xem điều gì sẽ xảy ra. Vào thời gian chạy, bạn luôn có tùy chọn thoát sớm khỏi chương trình nếu quá lâu. Thật vậy, đó là những gì đại đa số các chương trình làm, thay vì "kiểm tra chấm dứt". Thậm chí còn có một tính năng như vậy cho các tập lệnh javascript trong trình duyệt (hoặc thông báo "chương trình không phản hồi" khét tiếng).

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.