Có thể tự động hóa phân tích thuật toán?


8

Có ai nghĩ về khả năng của một ngôn ngữ lập trình và một trình biên dịch, sao cho trình biên dịch có thể tự động thực hiện phân tích tiệm cận trong trường hợp xấu nhất? Trường hợp sử dụng mà tôi có trong đầu là một ngôn ngữ lập trình nơi tôi viết mã và biên dịch. Trình biên dịch cho tôi biết rằng mã của tôi chạy trong O (n ^ 2) (ví dụ). Nó thực hiện điều này bằng cách làm những gì mà những người thông minh làm phân tích thuật toán làm, có thể đếm các vòng lặp, v.v.

  • Do tạm dừng các vấn đề và vì người ta có thể có các chương trình hoạt động bằng cách khớp, ví dụ thuật toán Levin cho SAT chạy trong thời gian đa thức iff P = NP, tôi nghi ngờ rằng người ta có thể phải thiết kế ngôn ngữ lập trình đủ hạn chế để cho phép một cái gì đó như thế này Có kết quả tiêu cực, loại trừ một số loại ngôn ngữ lập trình khỏi việc có các trình biên dịch như vậy.

  • Tôi cũng sẽ quan tâm đến các hệ thống không phân tích chính xác tiệm cận, nhưng giới hạn trên "thú vị".

  • Tôi đặc biệt KHÔNG quan tâm đến hộp đen và các phương pháp thống kê lấy mẫu từ các đầu vào có độ dài cụ thể và tìm hiểu xem chương trình mất bao lâu. Những phương pháp này rất thú vị, nhưng chúng không phải là thứ tôi đang tìm kiếm. Tôi quan tâm đến các phương pháp chính xác có thể đưa ra giới hạn gần đúng .

Tôi sẽ rất biết ơn nếu ai đó có thể chỉ cho tôi một số tài liệu tham khảo về công việc theo hướng này.


5
Đây là một bản sao có thể có của câu hỏi sau: cstheory.stackexchange.com/questions/12585/
cody

các ngôn ngữ rõ ràng có thể được loại trừ là Turing hoàn chỉnh vì vấn đề tạm dừng không thể giải quyết được là ở bất kỳ ngôn ngữ nào như vậy. Sau đó, điều này dẫn đến câu hỏi, ngôn ngữ nào hạn chế hơn Turing hoàn chỉnh mà điều này là có thể? nhưng có thể nói, một ngôn ngữ không phải là "ngôn ngữ lập trình" trừ khi nó hoàn thành Turing. do đó, đại khái, một mục tiêu như vậy về cơ bản là không thể về mặt lý thuyết ... có thể có một số ý tưởng giảm thiểu cho các ngôn ngữ phức tạp hạn chế tuy nhiên ...
vzn

n2n3

3
@Kaveh Tôi không đồng ý rằng câu hỏi của tôi là một bản sao của "Giới hạn thời gian chạy trong P có thể quyết định được không?". Tôi đã biết làm thế nào để chứng minh điều đó là không thể. Tuy nhiên, cảm ơn bạn đã đưa chủ đề này cũng chú ý đến tôi! Tuy nhiên, có thể câu hỏi của tôi một câu hỏi trùng lặp, như được chỉ ra bởi cody.
manoj

2
Khi tôi còn trẻ và ngây thơ, tôi đã cố gắng viết máy phân tích độ phức tạp bằng cách sử dụng gcov . Nó cung cấp cho bạn số lần mỗi dòng được thực thi. :) Câu hỏi hay!
Pratik Deoghare

Câu trả lời:


8

Sự phức tạp tiềm ẩn đã dạy chúng ta rằng (một số) các lớp phức tạp có thể được phân loại theo các hệ thống loại, theo nghĩa là có các hệ thống loại chỉ chấp nhận các chương trình đa thức, ví dụ. Một nhánh nhỏ thực tế hơn của nghiên cứu này là RAML (Resource Aware ML), một ngôn ngữ lập trình chức năng với một hệ thống loại sẽ cung cấp cho bạn thông tin chính xác về thời gian chạy các chương trình của nó. Trên thực tế, chính xác hơn so với độ phức tạp O lớn, các yếu tố không đổi cũng được đưa vào, được tham số hóa bởi một mô hình chi phí cho các hoạt động cơ sở.

Bạn có thể nghĩ rằng điều này là gian lận: chắc chắn một số thuật toán có độ phức tạp rất khó tính toán chính xác, vậy làm thế nào ngôn ngữ này có thể dễ dàng xác định độ phức tạp của các chương trình của nó? Thủ thuật là có nhiều cách để diễn đạt một thuật toán nhất định, một số cách mà hệ thống loại sẽ từ chối (nó từ chối một số chương trình tốt), và một số, có thể, nó chấp nhận. Vì vậy, người dùng không nhận được thế giới miễn phí: họ không phải tính toán ước tính chi phí nữa mà cần phải tìm cách thể hiện mã theo cách được hệ thống chấp nhận.

(Luôn luôn là cùng một mẹo, như với các ngôn ngữ lập trình chỉ kết thúc tính toán hoặc thuộc tính bảo mật có thể chứng minh được, v.v.)


Cảm ơn, đây là một câu trả lời rất thú vị. Tôi sẽ xem xét kỹ hơn về RAML.
manoj

7

Công cụ COSTA được phát triển bởi nhóm nghiên cứu COSTA thực hiện chính xác những gì bạn muốn. Đưa ra một chương trình (theo định dạng mã byte Java), công cụ này tạo ra một phương trình chi phí dựa trên mô hình chi phí được cung cấp bởi người lập trình. Mô hình chi phí có thể liên quan đến các thực thể như thời gian chạy, sử dụng bộ nhớ hoặc các sự kiện có thể thanh toán (như gửi tin nhắn văn bản). Phương trình thời gian chạy sau đó được giải quyết bằng cách sử dụng một công cụ chuyên dụng để tạo ra một dạng đóng, trường hợp xấu nhất giới hạn trên của mô hình chi phí.

Đương nhiên, công cụ này không hoạt động trong mọi trường hợp, do không thể tạo ra một phương trình thời gian chạy hoặc do không tìm thấy một hình thức đóng. Điều này không đáng ngạc nhiên.


2

Tôi thực sự đã nghĩ về cùng một câu hỏi một thời gian trước đây. Đây là chuyến tàu tư tưởng mà tôi có:

Như bạn đã nói vấn đề tạm dừng là một vấn đề. Để tránh điều này, chúng tôi cần một ngôn ngữ chỉ cho phép các chương trình luôn dừng lại. Mặt khác, ngôn ngữ của chúng ta cần phải đủ biểu cảm để giải quyết hầu hết các vấn đề phổ biến (ví dụ: ít nhất nó phải nắm bắt được tất cả các lớp EXP phức tạp).

Vì vậy, hãy nhìn vào các chương trình LOOP. Một chương trình LOOP luôn tạm dừng và tính biểu cảm của nó vượt xa EXP - để hiểu rõ hơn: bạn có thể mô phỏng bất kỳ TM nào mà chức năng thời gian chạy có thể được biểu thị dưới dạng chương trình LOOP.

Bây giờ, chúng ta có thể xem xét độ sâu lồng và độ lớn của số lần lặp lại cho mỗi vòng lặp theo quan điểm cú pháp và chúng ta có một điểm bắt đầu (mặc dù không biết điều này sẽ đưa chúng ta đi bao xa). Tuy nhiên, hãy xem xét vấn đề sau:

f(n)

f(n)=yyny>n

p(n)nf(n)

y := n + 1
while not prime(y) 
    y++
return y

Bây giờ, làm thế nào chúng ta sẽ làm điều này chỉ với các vòng lặp giới hạn? Vấn đề bây giờ trở thành suy nghĩ về một giới hạn trên cho phạm vi số chúng ta phải tìm kiếm.

 prime pa prime p:p<pp!+1

Trực giác của tôi ở đây là thông tin duy nhất mà trình biên dịch có thể cung cấp cho bạn là từ việc phân tích cẩn thận cú pháp mà cuối cùng được cung cấp bởi lập trình viên. Vì vậy, cho phép trình biên dịch đưa ra bất kỳ tuyên bố có ý nghĩa nào về độ phức tạp thời gian của chương trình có nghĩa là buộc người lập trình kết hợp thông tin này vào chương trình.

Tuy nhiên, đoạn cuối là chủ quan và chắc chắn có thể có những cách tiếp cận khả thi khác mang lại kết quả thú vị. Tôi chỉ muốn đưa ra một ý tưởng về những gì không mong đợi khi đi trên con đường này.


2
Độ sâu lồng nhau của các vòng lặp là vấn đề chính ở đây và độ phức tạp nằm trên các hàm đệ quy nguyên thủy, xem Độ phức tạp của các chương trình vòng lặp , Meyer & Ritchie, Hội nghị ACM '67, dx.doi.org/10.1145/800196.806014 .
Sylvain

Cảm ơn. Tôi nghĩ rằng bạn làm cho một điểm tốt ở đây. Có một vấn đề nếu tôi sẽ chạy các vòng lặp trong khi (vị ngữ = true) làm điều gì đó bởi vì sau đó tôi phải tranh luận về lần đầu tiên vị ngữ trở thành sai. Để đặt lại câu hỏi của tôi trong bối cảnh bạn đã đặt, tôi tự hỏi liệu người ta có thể thiết kế một loạt các nguyên thủy, với thời gian chạy được xác định rõ, có thể được soạn theo những cách đơn giản để viết chương trình thú vị và đạt được giới hạn thời gian chạy cho chúng không . Có lẽ RAML đã thực hiện một số điều này, như được chỉ ra bởi câu trả lời đầu tiên.
manoj

1
Để đưa ra nhiều gợi ý hơn về loại này, Cobham's Khó khăn tính toán nội tại của các hàm thường được trích dẫn là một trong những công trình sớm nhất về độ phức tạp ngầm: nó đặc trưng cho FP bằng các phương án đệ quy. Bạn sẽ tìm thấy nhiều công việc gần đây dọc theo dòng này của Bellatoni & Cook trong Một đặc tính lý thuyết đệ quy mới của các hàm đa thời gian , Độ phức tạp tính toán 1992. Xem thêm một khảo sát của Hofmann trong SIGACT News 31 (1): 31--42, 2000: dx.doi.org/10.1145 4326048.346051 .
Sylvain

Cảm ơn Sylvain, tôi đang xem cuộc khảo sát! Tôi đã nhận thức được lĩnh vực này của lý thuyết phức tạp ngầm, nhưng chưa bao giờ thực sự bận tâm nghiên cứu nó, do thiếu đánh giá cao câu hỏi cơ bản mà họ đang cố gắng trả lời là gì. Bây giờ tôi có thêm động lực để hiểu những ý tưởng này!
manoj
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.