Những thuật toán có thể được thể hiện bằng cách sử dụng một ngôn ngữ chức năng tổng thể với các toán tử song song dữ liệu?


11

Hãy tưởng tượng một ngôn ngữ lập trình chức năng chỉ có các kiểu dữ liệu là vô hướng số và các tổ hợp các mảng tùy ý. Ngôn ngữ thiếu bất kỳ phương tiện lặp lại không giới hạn, vì vậy những điều sau đây không được phép:

  • vòng lặp rõ ràng (không sử dụng nhiều mà không có tác dụng phụ nào)
  • đệ quy
  • các hàm hạng nhất tùy ý (không có tổ hợp y)

Ngôn ngữ, tuy nhiên, có:

  • chức năng cấp cao nhất
  • phạm vi từ vựng cho phép ràng buộc
  • dòng điều khiển phân nhánh
  • các hàm toán học và logic vô hướng phổ biến
  • một số hàm tạo mảng đơn giản như fill (n, x) tạo ra một mảng phần tử n với các giá trị x giống hệt nhau
  • quan trọng nhất: một tập hợp hạn chế các toán tử bậc cao thực hiện phép lặp có cấu trúc song song (như ánh xạ, thu nhỏ, quét, tất cả các cặp).

Để cụ thể hơn về các toán tử song song dữ liệu:

  • y = bản đồ (f, x) => y [i] = f [i]
  • y = giảm (f, a, x) => y = f (a, f (y [p [0]], f (y [p [1]], ...))) cho một số hoán vị p
  • y = quét (f, a, x) => y [i] = giảm (f, a, y [0 ... i-1])
  • y = allpairs (f, x, y) => y [i, j] = f (x [i], y [j])

Chúng ta cũng có thể có các toán tử khác, nhưng để đủ điều kiện họ nên có thời gian chạy đa thức, có thể thực hiện được theo một số mô hình tính toán song song dữ liệu hợp lý và sử dụng ở hầu hết không gian đa thức.

Rõ ràng có một số cấu trúc không thể diễn tả bằng ngôn ngữ này, chẳng hạn như:

while f(x) > tol:
    x <- update(x)   

Chúng ta có thể thể hiện điều gì trong hệ thống này? Có phải chúng ta chỉ giới hạn trong các vấn đề tìm kiếm trong FP? Chúng ta có thể nắm bắt tất cả các thuật toán thời gian đa thức? Ngoài ra, có một số toán tử tối thiểu cho lớp này không?

Câu trả lời:


7

Bạn có thể muốn xem xét ngôn ngữ lập trình cũ NESL đã coi trọng những ý tưởng này. Ngôn ngữ này dựa trên các hoạt động trên các bộ sưu tập, về cơ bản là danh sách và danh sách các danh sách, v.v., nhưng tôi nghĩ rằng cây và đồ thị cũng được xem xét, thông qua các bảng mã khó. Một số nghiên cứu được thực hiện trong dự án đó (vào giữa những năm 1990) có thể giúp trả lời câu hỏi của bạn. Luận án tiến sĩ (có sẵn như một cuốn sách) Guy E. Blelloch. Mô hình vectơ cho tính toán song song dữ liệu. MIT Press, 1990 có thể cung cấp một số câu trả lời. Đó là một thời gian trước khi tôi nhìn vào nó.

Công việc được thực hiện trên Chủ nghĩa hình thức Bird-Meertens (BMF) cũng thuộc loại này, cũng như từ thiện ngôn ngữ . Từ trang wikipedia từ thiện, nó nói rằng ngôn ngữ chưa hoàn chỉnh, nhưng có thể diễn tả chức năng của Ackermann, điều đó có nghĩa là nó còn hơn cả đệ quy nguyên thủy. Cả BMF và Charity đều liên quan đến các nhà khai thác như nếp gấp và quét (dị hình, dị hình, v.v.) và họ có nguồn gốc từ Lý thuyết Danh mục.

Tôi ngắn gọn, câu trả lời không chính xác là bạn có thể diễn đạt khá nhiều.


1
NESL không phải là một ngôn ngữ tổng thể.
Per Vognsen

Tôi đã nhận thức sâu sắc về NESL trong một thời gian nhưng lần đầu tiên chỉ đọc một trong những bài báo của Blelloch. Cảm ơn vì tiền hỗ trợ. NESL khá giống với ngôn ngữ mà tôi đã mô tả ở trên ngoại trừ điều đó, như Per Vognsen nhận thấy, nó cho phép đệ quy.
Alex Rubinsteyn

Tôi cũng quan tâm đến sự lựa chọn các toán tử nguyên thủy của Blelloch: map, dist (tôi tin giống như cái mà tôi gọi là 'fill'), độ dài, đọc mảng, ghi mảng, quét, phân vùng, làm phẳng. Các nguyên thủy của NESL có "hoàn chỉnh" không, hay có một số hoạt động khác với việc triển khai song song dữ liệu không thể được thể hiện một cách hiệu quả bằng cách sử dụng chúng?
Alex Rubinsteyn

2
Loại bỏ đệ quy, sau đó bạn có một ngôn ngữ khá biểu cảm, đặc biệt nếu bạn xem xét các nếp gấp và vv. Nhìn vào BMF và công việc tiếp theo nó có thể được nhiều người quan tâm hơn. Tôi xin lỗi, nhưng tôi không cập nhật trong lĩnh vực này.
Dave Clarke

7

Câu trả lời khác của tôi chỉ ra sai sót trong ngôn ngữ khi nó đứng. Trong câu trả lời này, tôi sẽ cung cấp thêm chi tiết về các vấn đề với sự cùng tồn tại của các nếp gấp và mở ra trong một ngôn ngữ tổng thể. Sau đó, tôi sẽ đề xuất một giải pháp và chỉ ra rằng tất cả các vấn đề trong P (và thực tế là nhiều vấn đề khác) có thể được giải quyết bằng ngôn ngữ mở rộng này.

Gấp trong tổng số ngôn ngữ tiêu thụ danh sách:

fold :: (a -> b -> b) -> b -> List a -> b

Mở ra trong một ngôn ngữ tổng thể tạo ra các luồng, có khả năng không bị ràng buộc:

unfold :: (b -> Maybe (a, b)) -> b -> Stream a

Thật không may, danh sách và luồng sống ở các thế giới khác nhau, vì vậy các toán tử này không thể được tạo. Chúng tôi cần một sự tương ứng một phần:

stream :: List a -> Stream a
list :: Int -> Stream a -> List a

Toán tử luồng nhúng một danh sách vào một luồng giới hạn. Hàm danh sách trích xuất n phần tử đầu tiên (hoặc ít hơn nếu luồng kết thúc sớm hơn) vào danh sách. Do đó, chúng ta có phương trình sau:

for all xs :: List a, xs == list (length xs) (stream xs)

Để tối ưu hóa hiệu quả, chúng tôi hoàn toàn có thể cắt các luồng dưới dạng cấu trúc dữ liệu trung gian:

unfoldList :: Int -> (b -> Maybe (a, b)) -> b -> List a

Bây giờ tôi sẽ phác thảo một bằng chứng rằng điều này (với các toán tử khác đã được ngụ ý trong câu hỏi ban đầu) cho phép chúng tôi mô phỏng bất kỳ thuật toán đa thức thời gian nào.

Theo định nghĩa, ngôn ngữ L nằm trong P khi có máy Turing M và đa thức p sao cho thành viên của x trong L có thể được quyết định bằng cách chạy M ở hầu hết các lần lặp p (n) trong đó n = | x |. Theo một đối số tiêu chuẩn, trạng thái của băng trong máy lặp k có thể được mã hóa với một danh sách độ dài tối đa là 2k + 1, mặc dù băng của máy là vô hạn.

Ý tưởng bây giờ là đại diện cho sự chuyển đổi của M như là một chức năng từ danh sách sang danh sách. Việc thực hiện của máy sẽ được thực hiện bằng cách mở ra trạng thái ban đầu với chức năng chuyển tiếp. Điều này tạo ra một luồng danh sách. Giả định rằng L nằm trong P có nghĩa là chúng ta không cần nhìn xa hơn các phần tử p (n) vào luồng. Vì vậy, chúng ta có thể soạn thảo việc mở ra list p(n)để có được một danh sách hữu hạn. Cuối cùng, chúng tôi gấp lại để kiểm tra xem câu trả lời cho vấn đề quyết định là có hay không.

Tổng quát hơn, điều này cho thấy rằng bất cứ khi nào chúng ta có một thuật toán có thời gian kết thúc có thể bị giới hạn bởi một hàm tính toán trong ngôn ngữ, chúng ta có thể mô phỏng nó. Điều này cũng cho thấy lý do tại sao một cái gì đó như chức năng của Ackermann không thể được mô phỏng: nó bị ràng buộc bởi chính nó, do đó có vấn đề về gà và trứng.


4

Đó là một ngôn ngữ rất gim. Hãy thử lập trình chức năng giai thừa:

fact 0 = 1
fact n = n * fact (n-1)

Vấn đề là ngôn ngữ của bạn chỉ có nếp gấp chứ không có mở ra. Cách tự nhiên để thể hiện giai thừa là kết hợp mở ra n vào danh sách [1, 2, ..., n] với cách gấp mà xé nó xuống trong khi nhân.

Bạn có thực sự quan tâm đến ngôn ngữ cụ thể này hoặc trong toàn bộ chương trình chức năng nói chung? Rõ ràng là ngôn ngữ của bạn có thể thể hiện tối đa các thuật toán đa thức thời gian. Hệ thống F (phép tính lambda đa hình) có thể dễ dàng thể hiện các quái vật như chức năng của Ackermann. Ngay cả khi bạn quan tâm đến các thuật toán đa thức thời gian, bạn vẫn thường xuyên cần phòng khuỷu tay siêu đa thức để thể hiện chúng một cách tự nhiên.

Chỉnh sửa: Như Dave chỉ ra, NESL là một trong những ngôn ngữ lập trình song song dữ liệu chức năng nhưng nó rất xa so với tổng số (thậm chí nó không thử). Gia đình APL có một quá trình tiến hóa song song và có một tập hợp con đại số (tránh các toán tử điểm cố định). Nếu trọng tâm của câu hỏi của bạn là toàn bộ, David Turner đã viết một số bài báo hay trong lĩnh vực này mặc dù không đặc biệt về lập trình song song dữ liệu.


Xin lỗi, việc thiếu các nhà khai thác mở ra là một sự giám sát về phía tôi ... Tôi có nghĩa là thêm một nhưng quên đặt nó trong bài viết. Tôi không quan tâm đến ngôn ngữ cụ thể này nhất thiết mà là tính biểu cảm và giới hạn của tính toán song song dữ liệu.
Alex Rubinsteyn

Mở ra là tự nhiên có giá trị luồng, không có giá trị mảng, đó là một vấn đề cơ bản với corecursion trong tổng số ngôn ngữ nghiêm ngặt.
Per Vognsen
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.