Các giới hạn của tổng số lập trình chức năng là gì?


19

Những hạn chế của tổng thể lập trình chức năng là gì? Nó không hoàn thành Turing, nhưng vẫn hỗ trợ một tập hợp lớn các chương trình có thể. Có những cấu trúc quan trọng mà bạn có thể viết bằng ngôn ngữ Turing-Complete, nhưng không phải bằng ngôn ngữ chức năng tổng thể?

Và có đúng không khi nói rằng các chương trình được viết bằng tổng số ngôn ngữ chức năng có thể được phân tích hoàn toàn tĩnh, trong khi phân tích tĩnh trong các ngôn ngữ hoàn chỉnh Turing bị giới hạn bởi những thứ như vấn đề tạm dừng? Với điều đó tôi không có nghĩa là trong các ngôn ngữ chức năng tổng thể, mọi thứ đều có thể được xác định theo thống kê, bởi vì một số điều chỉ được biết trong thời gian chạy, nhưng ý tôi là về mặt lý thuyết, các chương trình được viết bằng một ngôn ngữ lập trình chức năng lý tưởng, có thể được phân tích để mọi thứ về lý thuyết có thể được xác định tĩnh có thể được xác định tĩnh. Hoặc vẫn còn những vấn đề không thể giải quyết được kế thừa trong tổng số ngôn ngữ chức năng làm cho phân tích tĩnh không đầy đủ? Một số vấn đề sẽ luôn luôn không thể giải quyết được, bất kể chúng được viết bằng ngôn ngữ nào, nhưng tôi quan tâm đến những vấn đề như vậy được kế thừa từ ngôn ngữ này,

Câu trả lời:


16

Nó phụ thuộc vào tổng số ngôn ngữ chức năng .

Câu trả lời này nghe có vẻ như là một cảnh sát, nhưng không có gì có thể nói cụ thể hơn. Sau tất cả, hãy xem xét bất kỳ chương trình có thể quyết định quan trọng nào mà bạn quan tâm. Viết chương trình bằng ngôn ngữ hoàn chỉnh Turing yêu thích của bạn để giải quyết nó. Vì vấn đề là có thể quyết định, chương trình của bạn sẽ dừng trên tất cả các đầu vào.

(Có thể cho rằng, một vấn đề không thể giải quyết có thể có các chương trình thú vị, nhưng không phải là vấn đề mà mọi người có thể sử dụng, bởi vì họ sẽ không bao giờ có thể chờ đợi đủ lâu để biết câu trả lời.)

Bây giờ, hãy xác định một ngôn ngữ mới sao cho nó chỉ có một chương trình nhập hợp lệ: chương trình mà bạn vừa viết, với cùng một ngữ nghĩa như trước đây. Đó chắc chắn là tổng số, vì tất cả các đầu vào cho tất cả các chương trình được viết trong đó (trong đó chỉ có một) luôn luôn chấm dứt.

Thủ thuật rẻ tiền này thực sự hữu ích: ví dụ, ngôn ngữ Coq là một ngôn ngữ chức năng tổng thể trong đó không có lỗi đánh máy chương trình trừ khi có bằng chứng cho thấy nó chấm dứt. (Nếu bạn đã từ bỏ yêu cầu đó, thì đó sẽ là Turing-Complete, vì vậy trở ngại duy nhất là tìm ra bằng chứng chấm dứt.)

Tôi không chắc ý của bạn là gì bởi "mọi thứ trong lý thuyết có thể được xác định tĩnh có thể được xác định tĩnh"; Nghe có vẻ đúng. Tuy nhiên, tổng số ngôn ngữ vốn không dễ phân tích; bạn biết rằng không có gì phân kỳ, đó là một thực tế hữu ích, nhưng mối quan hệ giữa đầu vào và đầu ra vẫn còn phức tạp. (Đặc biệt, vẫn còn vô số đầu vào có thể, vì vậy bạn không thể thử hết chúng, ngay cả trên lý thuyết.)


Cảm ơn câu trả lời của bạn. Vì vậy, tổng số giúp đỡ phần nào, nhưng nó vẫn là một vấn đề rất khó khăn. Điều tôi muốn nói với "mọi thứ trong lý thuyết có thể được xác định tĩnh có thể được xác định tĩnh" là điều có thể, cực kỳ khó hoặc không, để phân tích tất cả các mối quan hệ giữa đầu vào và đầu ra, nếu bạn có đủ tài nguyên để làm như vậy . Hoặc là những lý do cơ bản tại sao điều này là hạn chế? Giống như bằng chứng Theorm của Rice rằng đây là trường hợp cho các chức năng một phần. Hay tôi đang hiểu nhầm định lý của Rice?
Matthijs Steen

Tôi nghĩ rằng nó có thể phụ thuộc vào những gì bạn có nghĩa là "mối quan hệ". Cụ thể, nếu bạn chỉ có nghĩa là "đầu vào A đi đến đầu ra B", thì điều này có thể xác định một cách tầm thường trong một ngôn ngữ chức năng tổng thể; Chỉ cần chạy chương trình. Nhưng có lẽ bạn quan tâm đến các phân tích nói lên điều gì đó về một lớp đầu vào vô hạn.
Paul Stansifer

(ôi; vô tình nhấn enter) ... nhưng điều này mở ra một mánh khóe ngớ ngẩn khác, bởi vì tôi có thể hỏi những câu hỏi không thể giải quyết được về chức năng nhận dạng nếu tôi muốn: "Đối với một số người X, (identity X)máy Turing có bị dừng không?" Chắc chắn, điều đó dường như không phải là về identity , nhưng làm thế nào để bạn xác định "về"?
Paul Stansifer

Có, tôi muốn biết liệu nó có giữ cho tất cả các giá trị đầu vào có thể có của một số định nghĩa không, cho các đầu vào riêng lẻ. Vì vậy, nếu tôi hiểu bạn một cách chính xác, bạn có nghĩa là sẽ luôn có một số câu hỏi không thể giải được, bất kể loại ngôn ngữ lập trình được sử dụng là gì? Mặc dù một số câu hỏi không thể giải quyết được này có thể bị phá vỡ bằng cách ngăn chặn sự cố xảy ra ngay từ đầu, như tổng số ngôn ngữ chức năng cho Sự cố Dừng lại? Bởi vì câu hỏi của bạn về chức năng nhận dạng có thể được quyết định trong một ngôn ngữ chức năng tổng thể không?
Matthijs Steen

Vâng; một phiên bản sửa đổi của vấn đề, trong đó "Máy Turing" được thay thế bằng "Phá vỡ sau khi hết hạn bảo hành Máy Turing" có thể giải quyết được một cách tầm thường. Điều rắc rối cho những mục đích này là vấn đề tạm dừng là ví dụ điển hình của một vấn đề không thể giải quyết được khi kiểm tra các chương trình đầy ắp sự không thể giải quyết được.
Paul Stansifer

16

Những hạn chế của tổng thể lập trình chức năng là gì? Nó không hoàn thành Turing, nhưng vẫn hỗ trợ một tập hợp lớn các chương trình có thể. Có những cấu trúc quan trọng mà bạn có thể viết bằng ngôn ngữ Turing-Complete, nhưng không phải bằng ngôn ngữ chức năng tổng thể?

LLL

  1. LLLLlà phù hợp. Đây chỉ là những gì định lý của Goedel quy định, giả sử bạn có thể làm số học. Vì vậy, chúng tôi biết rằng chúng tôi không thể viết tự thông dịch bằng các ngôn ngữ chức năng tổng thể.

  2. Mặc dù, mặt trái của điều này là các giới hạn về sức mạnh biểu cảm của tổng số ngôn ngữ về cơ bản là các giới hạn đối với sức mạnh biểu cảm của chính toán học . Ví dụ, các chức năng có thể xác định trong Coq (một trợ lý chứng minh) là những chức năng có thể được chứng minh là có thể tính toán được bằng ZFC, với vô số các hồng y không thể truy cập được. Vì vậy, về cơ bản bất kỳ chức năng nào mà bạn có thể chứng minh tổng thể cho sự hài lòng của một nhà toán học đang làm việc là có thể xác định được trong Coq.

  3. Mặt trái của mặt trái là toán học thật khó! Vì vậy, không có ý nghĩa dễ dàng trong đó tổng số ngôn ngữ là "hoàn toàn có thể phân tích" - ngay cả khi bạn biết rằng một chức năng chấm dứt, bạn vẫn có thể phải thực hiện nhiều công việc sáng tạo để chứng minh rằng nó có một tài sản mà bạn muốn. Ví dụ, chỉ cần biết rằng một hàm từ danh sách đến danh sách là tổng số, sẽ không giúp bạn đi xa trong việc chứng minh rằng đó là một hàm sắp xếp ....


Cảm ơn câu trả lời của bạn. Tôi đã đọc bài viết về vấn đề này tại weblog Lambda the Ultimate , nhưng một số người trong các bình luận nói rằng mặc dù không thể có người đánh giá riêng như một thuật ngữ có thể xây dựng rõ ràng thông thường, có thể tự tạo ra một hoạt động đánh giá với một số thủ thuật. Vì vậy, tôi tự hỏi, có những vấn đề không thể được giải quyết (hoặc gần đúng) trong một ngôn ngữ chức năng tổng thể với một số thủ thuật đường vòng?
Matthijs Steen

Tôi muốn nói rằng tự đánh giá không được coi là một vấn đề, bởi vì nó thay đổi tùy thuộc vào ngôn ngữ. Vấn đề "đánh giá một chương trình trong ngôn ngữ X" là cùng một vấn đề, bất kể bạn cố gắng giải quyết nó bằng ngôn ngữ X hay Y. Đặc biệt, nếu ngôn ngữ X là ngôn ngữ chức năng tổng thể, thì vấn đề có thể giải quyết được trong một số ngôn ngữ chức năng tổng thể , sử dụng cùng một mẹo ngớ ngẩn tôi đã sử dụng trước đây.
Paul Stansifer

Neel, có vẻ như nó sẽ dễ dàng hơn đáng kể để chứng minh rằng một ngôn ngữ tổng thể không thể hỗ trợ trình thông dịch riêng của nó. Có phải tôi đang hiểu lầm bạn? Bằng cách chéo hóa đơn giản, bất kỳ ngôn ngữ nào có chức năng không có điểm cố định đều không thể hỗ trợ trình thông dịch riêng (có hỗ trợ số học hay không). Đối số được xây dựng bởi Conor McBride tại đây: mail.haskell.org/pipermail/haskell-cafe/2003-May/004343.html
Tom Ellis

@TomEllis: Đối số của tôi về cơ bản giống như của Conor. Trên thực tế, bài đăng của anh ấy đã thực hiện quan sát này (với sự dí dỏm đặc trưng của Conor) khi anh ấy gọi nó là "đối số Epampleides / Cantor / Russell / Quine / Godel / Turing."
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.