Ngôn ngữ lập trình để tính toán hiệu quả


32

Không thể viết một ngôn ngữ lập trình cho phép tất cả các máy dừng trên tất cả các đầu vào và không có ngôn ngữ nào khác. Tuy nhiên, dường như rất dễ để định nghĩa một ngôn ngữ lập trình như vậy cho bất kỳ lớp phức tạp tiêu chuẩn nào. Cụ thể, chúng ta có thể định nghĩa một ngôn ngữ trong đó chúng ta có thể diễn đạt tất cả các tính toán hiệu quả và chỉ tính toán hiệu quả.

Chẳng hạn, đối với một cái gì đó như : lấy ngôn ngữ lập trình yêu thích của bạn và sau khi bạn viết chương trình của mình (tương ứng với Turing Machine ), hãy thêm ba giá trị vào tiêu đề: một số nguyên và số nguyên và đầu ra mặc định . Khi chương trình được biên dịch, hãy xuất một máy Turing có đầu vào có kích thước chạy trên cho các bước . Nếu không dừng lại trước khi các bước kết thúc, hãy xuất đầu ra mặc địnhM c k d M x n M x c n k M c n k d PPMckdMxnMxcnkMcnkd. Trừ khi tôi nhầm, ngôn ngữ lập trình này sẽ cho phép chúng tôi thể hiện tất cả các tính toán trong và không có gì nữa. Tuy nhiên, ngôn ngữ đề xuất này vốn không thú vị.P

Câu hỏi của tôi: có ngôn ngữ lập trình nào nắm bắt các tập hợp con của các hàm tính toán (như tất cả các hàm tính toán hiệu quả) theo cách không tầm thường không? Nếu không có, có lý do cho việc này?


7
Một số ví dụ đơn giản về ngôn ngữ lập trình nắm bắt các tập hợp con của các hàm tính toán: biểu thức chính quy và ngữ pháp không ngữ cảnh.
Jukka Suomela

2
Trên thực tế, các ngôn ngữ nắm bắt lớp phức tạp như (được định nghĩa theo cách tương tự như các hàm đệ quy nguyên thủy với đệ quy thay thế bằng đệ quy giới hạn) khá thú vị (ít nhất là theo quan điểm lý thuyết). :)P VPPV
Kaveh

Lập trình tuyến tính và số nguyên nắm bắt các tập hợp con thú vị của các hàm tính toán.
Diego de Estrada

Datalog chỉ có thể biểu thị các thuật toán thời gian đa thức, nhưng tôi không biết liệu nó có thể diễn tả tất cả các thuật toán thời gian đa thức hay không.
Jules

Bài báo nổi tiếng "Lập trình chức năng tổng thể" đưa ra lập luận rằng các ngôn ngữ lập trình không có vấn đề tạm dừng không thể giải quyết được thực sự thiết thực và hữu ích. jucs.org/jucs_10_7/total_feftal_programming
không có

Câu trả lời:


32

Một ngôn ngữ cố gắng chỉ diễn tả các phép tính thời gian đa thức là phép tính lambda mềm . Hệ thống kiểu của nó bắt nguồn từ logic tuyến tính. Một luận án gần đây đề cập đến phép tính thời gian đa thức, và cung cấp một bản tóm tắt tốt về những phát triển gần đây dựa trên phương pháp này. Martin Hofmann đã làm việc về chủ đề này khá lâu. Một danh sách cũ hơn của các giấy tờ có liên quan có thể được tìm thấy ở đây ; Nhiều bài báo của ông tiếp tục theo hướng này.

Các công việc khác sử dụng cách tiếp cận để xác minh rằng chương trình sử dụng một lượng tài nguyên nhất định, sử dụng Loại phụ thuộc hoặc Ngôn ngữ hội nhập .

Tuy nhiên, các cách tiếp cận khác dựa trên các phép tính chính thức giới hạn tài nguyên , chẳng hạn như các biến thể của phép tính môi trường xung quanh.

Các phương pháp này có đặc tính là các chương trình được gõ tốt đáp ứng một số giới hạn tài nguyên được chỉ định trước. Tài nguyên bị ràng buộc có thể là thời gian hoặc không gian và thường có thể phụ thuộc vào kích thước của đầu vào.

Công việc ban đầu trong lĩnh vực này là về tính toán bình thường hóa mạnh mẽ, có nghĩa là tất cả các chương trình được đánh máy tốt đều dừng lại. Hệ thống F , hay còn gọi là phép tính lambda đa hình, đang chuẩn hóa mạnh mẽ. Nó không có toán tử điểm cố định, nhưng dù sao cũng khá biểu cảm, mặc dù tôi không nghĩ nó được biết lớp phức tạp tương ứng với nó. Theo định nghĩa, bất kỳ phép tính chuẩn hóa mạnh nào cũng biểu thị một số lớp tính toán kết thúc.

Ngôn ngữ lập trình Charity là một ngôn ngữ chức năng khá biểu cảm dừng lại trên tất cả các đầu vào. Tôi không biết lớp phức tạp nào nó có thể biểu hiện, nhưng hàm Ackermann có thể được viết bằng Charity.


Bạn có ý nghĩa gì bởi "ít nhất" ở đây?
nponeccop

"Ít nhất" ở đây có nghĩa là "một số". Tôi sẽ thay đổi câu trả lời của mình để làm cho nó chính xác hơn một chút.
Dave Clarke

Tôi khá chắc chắn rằng độ phức tạp của các hàm có thể xác định trong hệ thống F là lớp các hàm kết thúc theo thời gian "một số hàm có thể chứng minh được của số học bậc 2" của đầu vào. Không phải là một lớp phức tạp rất thông thường, nhưng vẫn ...
cody

cody: theo "Định lý miễn phí" của Wadler, Hệ thống F có thể biểu thị "mọi hàm đệ quy có thể được chứng minh bằng tổng số học Peano bậc hai" và "bao gồm [...] Hàm của Ackermann". Tôi không chắc đó có giống như bạn đang mô tả không. Tính năng chính của Charity là hỗ trợ cho codata, trong khi tôi nghĩ rằng việc kiểm tra chấm dứt của Agda cho phép biểu hiện nhiều hơn cả Coq và System F trong khi đảm bảo chấm dứt.
Blaisorblade


8

Tôi cũng muốn đề cập đến Lý thuyết phức tạp tiềm ẩn như một cách tiếp cận vấn đề này, vì tôi đã thấy nó xuất hiện trong một số câu hỏi hơi liên quan. Để trích dẫn câu trả lời này của Neel Krishnaswami :

Kỹ thuật cơ bản là liên kết các lớp phức tạp với các hệ thống con của logic tuyến tính (cái gọi là "logic tuyến tính nhẹ"), với ý tưởng rằng việc loại bỏ cắt cho hệ thống logic phải được hoàn thành cho lớp phức tạp nhất định (như LOGSPACE, PTIME, v.v.). Sau đó, thông qua Curry-Howard, bạn có được một ngôn ngữ lập trình trong đó chính xác các chương trình trong lớp đã cho là có thể biểu thị được.


5

Tôi ngạc nhiên không ai đề cập đến đệ quy nguyên thủy. Bằng cách giới hạn các vòng lặp giới hạn (nghĩa là số lần lặp cho mỗi vòng lặp phải được tính trước khi vòng lặp bắt đầu), chương trình kết quả là đệ quy nguyên thủy và do đó tổng cộng. Douglas Hofstadter đã đề xuất một ngôn ngữ lập trình, BLOOP, cho phép tất cả và chỉ các hàm đệ quy nguyên thủy.


1
Đây là một lớp con thích hợp của tất cả các hàm, nhưng gọi nó là một lớp các hàm "hiệu quả" có thể là một chút kéo dài.
Raphael

PP

Những người khác đề cập đến Hệ thống F và các ngôn ngữ bình thường hóa mạnh mẽ khác, theo nghĩa này chỉ hỗ trợ "đệ quy nguyên thủy". Tuy nhiên, vì chúng hỗ trợ các chức năng hạng nhất, chúng cho phép viết nhiều chương trình hơn (như chức năng Ackermann).
Blaisorblade

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.