Một số tác phẩm của Conor McBride, Diff , Dissect , liên quan đến đạo hàm của các loại dữ liệu với "loại bối cảnh một lỗ" của chúng. Đó là, nếu bạn lấy đạo hàm của loại bạn còn lại với kiểu dữ liệu cho bạn biết kiểu dữ liệu trông như thế nào từ bên trong tại bất kỳ điểm nào.
Vì vậy, ví dụ, nếu bạn có một danh sách (trong Haskell)
data List a = [] | a : List a
cái này tương ứng với
data List a = 1 + a * List a
và thông qua một phép thuật toán học nhỏ, đạo hàm là
data ListDeriv a = List a * List a
được hiểu là tại bất kỳ thời điểm nào trong danh sách sẽ có một danh sách ở bên trái và một danh sách ở bên phải. Chúng tôi có thể nén qua danh sách ban đầu bằng cách sử dụng cấu trúc dữ liệu phái sinh.
Bây giờ, tôi thích làm một cái gì đó tương tự với đồ thị. Một biểu diễn phổ biến của đồ thị là một tập hợp các đỉnh và cạnh, có thể được triển khai một cách ngây thơ với một kiểu dữ liệu, chẳng hạn như:
data Gr a b i = Gr [(i,a)] [(i,i,b)]
Nếu tôi hiểu chính xác, một dẫn xuất của kiểu dữ liệu này, liên quan đến chỉ số biểu đồ i
, sẽ là một cái gì đó như thế.
data GrDeriv a b i = d/di (Gr a b i)
= d\di ( [a*i] * [b*i^2] )
= (d\di [a*i]) * [b*i^2] ) + [a*i]*(d/di [b*i^2])
= (a* [a*i] * [a*i]) * [b*i^2] )
+ [a*i] * (2*b*i) *[b*i^2]*[b*i^2])
= InNodes { nodesLeft :: [(a,i)]
, nodeLbl :: a
, nodesRight :: [(a,i)]
, edges :: [(b,i,i)] }
| InEdges { nodes :: [(a,i)]
, adjNode :: Either (b,i) (b,i)
, edgesLeft :: [(b,i,i)]
, edgesRight :: [(b,i,i)] }
Tôi đã nhận được điều này thông qua việc sử dụng quy tắc sản phẩm và quy tắc chuỗi cho các công cụ phái sinh và mặc dù có thể có một số lỗi, nhưng nó dường như tuân theo sơ đồ chung. Trong cấu trúc này, bạn sẽ tập trung vào Nút (hàm tạo InNodes) hoặc Cạnh (Trong các cạnh) và được cung cấp vị trí bạn sẽ thấy dữ liệu có liên quan.
Nhưng đây không phải là điều tôi đã hy vọng. Tôi đã hy vọng về một cấu trúc có liên quan chặt chẽ hơn với giao diện của Thư viện đồ thị chức năng Martin Erwigs. Cụ thể, tôi muốn xem tại một nút một bối cảnh đại diện cho nhãn của nút và hai danh sách kề, một cho đi, một cho đến.
Node a b = ([(i,b)],a,[(i,b)])
Tuy nhiên, tôi thấy hy vọng, vì đại diện kề kề có một số thuật ngữ chung với đạo hàm, lable lable a
, tại mỗi vị trí lỗ, biểu diễn / phân tích kề của mỗi cạnh.
Vì một đạo hàm không giống như chức năng ban đầu, nhưng sự tích hợp của đạo hàm là (kindof), có một loại tương tự tích hợp nào sẽ phục vụ để chuyển đổi đạo hàm thành một tập hợp các bối cảnh nút không? Không phải là một sự tích hợp trực tiếp để khôi phục cấu trúc ban đầu, làm phiền bạn, nhưng một cấu trúc tương đương với bản gốc nhưng trong một biểu diễn thân thiện với thuật toán hơn.
Nếu có, tôi hy vọng rằng các cấu trúc kiểu mối quan hệ có thể được chỉ định bởi một số ngôn ngữ "tập hợp đỉnh và cạnh" dễ dàng và tôi có thể lấy được một thư viện hiệu quả để làm việc với cấu trúc đó. Việc cấy ghép như vậy có thể được sử dụng để nghiên cứu các cấu trúc "ngoài lý thuyết đồ thị": siêu đồ thị, phức tạp đơn giản ...
Vì thế. Liệu ý tưởng này có vẻ khả thi? Hữu ích? Đã có nghiên cứu nào về loại điều này mà tôi có thể đọc thêm về?
Phụ lục
Theo nhận xét của Curtis F , một tập hợp các nút và cạnh không chính xác là một biểu đồ. Tuy nhiên, tất cả các biểu đồ có thể được biểu diễn bằng như vậy, và tôi thấy nó đủ trình bày phổ biến. Tôi đã thấy (đặc điểm kỹ thuật rất thô) được sử dụng trong nghiên cứu áp dụng lý thuyết đồ thị để tối ưu hóa mạng không dây theo nhiều cách khác nhau. Đây là một ví dụ truy cập mở, DRAND *. Điều này đặt ra câu hỏi, liên kết giữa bài thuyết trình là gì và làm thế nào một số phần mềm có thể được thực hiện dựa trên nghiên cứu.
Điều đó nói rằng, tôi không hoàn toàn phản đối việc thay đổi thông số kỹ thuật đầu vào từ sang một thứ khác. Ví dụ, cung cấp một loại chỉ số I , nhãn nút, V , và nhãn cạnh, E . Sau đó, biểu đồ là (xấp xỉ) một chức năng từ các chỉ mục đến một danh sách nhãn và cạnh.
Điều này, tôi khá chắc chắn có thể được thể hiện (Lý thuyết loại?) Là
hoặc là
Tôi nghĩ rằng nó cho thấy một số lời hứa, nhưng tôi thiếu sự tinh tế để đi xa hơn. Tôi biết phải có một số công việc ngoài kia để khám phá kết nối hơn nữa.
* Trong trường hợp liên kết bị đứt, trích dẫn: Rhee, Injong, et al. "DRAND: Lập kế hoạch TDMA ngẫu nhiên phân tán cho các mạng ad hoc không dây." Giao dịch của IEEE trên máy tính di động 8.10 (2009): 1384-1394.