Beberapa karya Conor McBride, Diff , Dissect , mengaitkan turunan tipe data dengan "tipe konteks satu lubang" mereka. Yaitu, jika Anda mengambil turunan dari tipe Anda dibiarkan dengan tipe data yang menunjukkan kepada Anda bagaimana tipe data terlihat dari dalam pada titik tertentu.
Jadi, misalnya, jika Anda memiliki daftar (di Haskell)
data List a = [] | a : List a
ini sesuai dengan
data List a = 1 + a * List a
dan melalui sedikit keajaiban matematika, turunannya adalah
data ListDeriv a = List a * List a
yang diartikan sebagai bahwa pada setiap titik dalam daftar akan ada daftar di sebelah kiri dan daftar di sebelah kanan. Kami dapat zip melalui daftar asli dengan menggunakan struktur data turunan.
Sekarang, saya tertarik melakukan sesuatu yang mirip dengan grafik. Representasi umum dari grafik adalah seperangkat simpul dan tepi, yang mungkin secara naif diimplementasikan dengan tipe data seperti:
data Gr a b i = Gr [(i,a)] [(i,i,b)]
Jika saya memahaminya dengan benar, turunan dari tipe data ini, sehubungan dengan indeks grafik i
,, harus berupa sesuatu.
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)] }
Saya mendapatkan ini melalui penggunaan aturan produk dan aturan rantai untuk turunan, dan meskipun mungkin ada beberapa kesalahan, tampaknya mengikuti skema umum. Dalam struktur ini Anda akan fokus pada Nodes (InNodes constructor) atau Edges (In edge) dan diberikan tempat Anda akan melihat data yang relevan.
Tapi ini bukan yang kuharapkan. Saya berharap untuk membangun lebih dekat terkait dengan antarmuka Perpustakaan Grafik Fungsional Martin Erwigs. Secara khusus, saya ingin melihat pada sebuah konteks konteks yang mewakili label node dan dua daftar adjacency, satu untuk keluar, satu untuk masuk.
Node a b = ([(i,b)],a,[(i,b)])
Saya memang melihat harapan, bagaimanapun, karena perwakilan adjacency memiliki beberapa istilah yang sama dengan turunan, label tunggal a
,, di setiap lokasi lubang, perwakilan adjacency / pembedahan setiap sisi.
Karena turunan bukan fungsi yang sama dengan aslinya, tetapi integrasi turunan adalah (kindof), apakah ada semacam analog integrasi yang akan berfungsi untuk mengubah turunan menjadi kumpulan konteks simpul? Bukan integrasi langsung untuk memulihkan struktur asli, ingatlah, tetapi struktur yang setara dengan yang asli tetapi dalam representasi yang lebih ramah algoritma.
Jika ada, saya berharap bahwa struktur tipe hubungan dapat ditentukan oleh beberapa bahasa "set simpul dan tepi" yang mudah dan saya dapat memperoleh perpustakaan yang efisien untuk bekerja dengan struktur itu. Penerapan seperti itu dapat digunakan untuk mempelajari struktur "di luar teori grafik": grafik hiper, kompleks sederhana ...
Begitu. Apakah ide ini tampak layak? Berguna? Apakah ada studi tentang hal semacam ini yang bisa saya baca lebih lanjut?
Tambahan
Seperti yang dikomentari oleh Curtis F , satu set node dan edge bukan grafik. Namun, semua grafik dapat direpresentasikan dengan demikian, dan menurut saya presentasi itu cukup umum. Saya telah melihat (spesifikasi sangat kasar) digunakan dalam penelitian yang menerapkan teori grafik untuk optimalisasi jaringan nirkabel dalam berbagai cara. Ini contoh akses terbuka, DRAND *. Hal ini menimbulkan pertanyaan, apa hubungan antara presentasi dan bagaimana beberapa perangkat lunak dapat diimplementasikan berdasarkan penelitian.
Yang mengatakan, saya tidak sepenuhnya menentang mengubah spec input dari ke sesuatu yang lain. Misalnya, diberi indeks tipe I , label simpul, V , dan label tepi, E . Kemudian grafiknya adalah (kurang-lebih) fungsi dari indeks ke label dan daftar tepi.
Ini, saya cukup yakin dapat dinyatakan (Kategori teori?) Sebagai
atau
Saya pikir itu menunjukkan beberapa janji, tetapi saya tidak memiliki kecanggihan untuk melangkah lebih jauh. Saya tahu pasti ada beberapa pekerjaan di luar sana yang mengeksplorasi koneksi lebih lanjut.
* Jika tautannya terputus, kutipan: Rhee, Injong, et al. "DRAND: Penjadwalan TDMA acak yang didistribusikan untuk jaringan ad hoc nirkabel." Transaksi IEEE pada Mobile Computing 8.10 (2009): 1384-1396.
sumber
Jawaban:
Tipe kamu
Gr
Anda tidak benar-benar sesuai dengan grafik, karena mencakup banyak contoh yang jelas bukan grafik, karena indeks tepi tidak perlu indeks titik sebenarnya.Sebagai contoh,
bukan grafik, tetapi diizinkan dalam tipe Anda sebagai
Sebaliknya, Anda
Gr
secara harfiah berkorespondensi dengan daftar indeks berlabel dan daftar pasangan indeks berlabel terpisah. Inilah sebabnya mengapa Anda mendapatkan turunan "harfiah" dariGr
yang tidak sesuai dengan "lubang" dalam grafik.Ada juga masalah yang disayangkan dalam memerhatikan urutan simpul / tepi (terlihat pada bagian
nodesLeft/Right
danedgesLeft/Right
perbedaannya) tetapi hal ini dapat diperbaiki dengan menggunakan daftarSet
alih - alih.Berikut adalah tipe yang diekspresikan dalam Haskell yang menurut saya lebih dekat dengan grafik (tidak kosong):
Untuk kesederhanaan, saya akan mempertimbangkan grafik yang lengkap, sederhana, tidak terarah:
(Untuk bersantai sepenuhnya, biarkan
e = Bool
tandai keberadaan tepi)Catatan yang
Graph
rekursif (dan faktanya, rekursif parametrik). Inilah yang memungkinkan kita untuk membatasi diri kita sendiri tipe hanya grafik dan bukan hanya daftar adjacency dikombinasikan dengan daftar vertex.Ditulis lebih aljabar,
Dengan berekspansi berulang kali, kami mendapatkan poin tetap
Ini masuk akal, karena grafik (lengkap) adalah baik
yang memiliki turunan
Memperbaiki Urutan dalam grafik ini
Versi struktur data Grafik ini pada dasarnya adalah linked-list, dan dengan demikian mengkodekan urutan simpul. Sementara itu bisa diperbaiki di versi daftar kedekatan Anda dengan menggunakan Set, itu tidak begitu langsung di sini.
Saya pikir Anda dapat memodifikasi struktur data pohon untuk melakukan jenis rekursi parametrik yang sama, dengan root memainkan peran seperti yang dilakukan "head"
SimpleGraph
. Dengan antarmuka set pohon yang dihasilkan, susunan / struktur dasar menjadi tidak terlihat (atau bahkan kanonik, jika Anda tidak tertarik dengan pembaruan cepat).Usulan Derivatif Anda
Anda mengusulkan jenis turunan; Saya akan mengubahnya untuk mengonfigurasi label dan indeks seperti yang saya lakukan:
([(v,e)], [(v,e)])
(v, [(v, e)])
. Ini tidak memiliki informasi yang cukup untuk merekonstruksi seluruh grafik , karena informasi "edge" hanya mengidentifikasi satu titik.sumber