Teoria delle categorie, complessità computazionale e connessioni combinatorie?


17

Ho cercato di leggere “ Pearls of Functional Algorithm design ”, e successivamente “ The Algebra of Programming ”, e c'è un'ovvia corrispondenza tra tipi di dati definiti ricorsivamente (e polinomialmente) e oggetti combinatori, con la stessa definizione ricorsiva e successivamente leader alle stesse serie di potenze formali (o funzioni generatrici), come mostrato nelle introduzioni alle specie combinatorie (ho letto " Specie e fattori e tipi, oh mio! ").

Quindi, per la prima domanda, c'è un modo per recuperare l'equazione di generazione (ricorsiva) dalle serie di potenze? Questo è un ripensamento però.

Mi interessava di più l'idea di algebre iniziali e di algebre finali come tipo di "definizione delle procedure sulla struttura dei dati". Ci sono alcune regole pratiche nella programmazione funzionale, riguardanti la composizione, i prodotti di mappatura tra algebre e simili, descritte ad esempio in questo tutorial. Mi sembra che questo potrebbe essere un modo abbastanza potente per affrontare la complessità e, ad esempio, sembra abbastanza semplice recuperare il teorema del Maestro in tale contesto (voglio dire, devi fare lo stesso argomento, quindi non molto guadagno in questo caso), e il catamorfismo unico dell'algebra iniziale e il fatto (sbaglio?) che le algebre tra A e FA per il funzione polinomiale F sono isomorfi, mi fa pensare che tale approccio possa avere molti benefici nell'analizzare la complessità di operazioni su strutture dati.

Dal punto di vista pratico, sembra che le regole di fusione (fondamentalmente, i modi per comporre morfismi algebrici tra loro, morfismi coalgebra e morfismi generali) siano una tecnica di ottimizzazione molto potente per la trasformazione e il refactoring del programma. Ho ragione nel pensare che il pieno utilizzo di queste regole possa produrre un programma ottimale (nessuna struttura di dati intermedia non necessaria o altre operazioni extra).

Sono su qualcosa (e cosa) qui? È beneficiario (dal punto di vista dell'apprendimento) cercare di considerare la complessità computazionale in questo modo? Le strutture, per le quali possiamo avere algebre iniziali "carine", sono in qualche modo troppo limitate per alcuni problemi?

Sto principalmente cercando di trovare un modo di pensare alla complessità in termini di struttura dello spazio di ricerca e il modo in cui lo "spazio di ricerca" e l '"algoritmo di ricerca" interagiscono attraverso alcuni oggetti "belli" come l'algebra iniziale del funzione e per capire se è utile provare a vedere le cose in questo modo, quando si guardano strutture più complicate.


5
puoi riformattarlo per renderlo leggibile?
Lev Reyzin

11
Ci sono due potenziali problemi con le tue idee. Innanzitutto, non tutte le strutture dati possono essere rappresentate usando algebre iniziali. Qualsiasi grafico generale o struttura di puntatore complicata non sarà l'algebra iniziale di alcun funzione. In secondo luogo, le regole di fusione e così via generalmente miglioreranno solo l'efficienza del codice, piuttosto che cambiare O (-) - efficienza dell'algoritmo (sebbene io conosca le eccezioni).
Dave Clarke,

Grazie, Dave, sto cercando di leggere il libro della teoria del gioco algoritmico e gli algoritmi nei trattamenti tradizionali sono specificati principalmente dal punto di vista operativo, per così dire, e mi chiedevo se ci fosse un modo generale per avvicinarli, e le algebre iniziali ecc. Sembravano belle per questo , ma la mancanza di corrispondenza tra struttura generale dei dati e funzioni è un problema. @sclv: Grazie, lo guarderò!
Stefan Petrov,

Voglio sottolineare che ci sono altri modi per rappresentare i grafici oltre a strutture di puntatori complicate. In particolare, è possibile rappresentarli induttivamente, con una serie di modifiche o aggiunte @DaveClarke. Sono sicuro che lo stesso vale per altre strutture come questa, anche se non voglio dirlo categoricamente in quanto non sono un esperto di algebre iniziali e dei loro limiti.
Samuel Schlesinger,

Risposte:


7

Il commento di Dave Clarke è abbastanza importante. Generalmente la fusione non modifica l'efficienza O (-). Tuttavia, di particolare interesse è il lavoro di Liu, Cheng e Hudak sulle frecce commutative causali. I programmi scritti con essi sono necessariamente ottimizzabili, in parte tramite la fusione di flussi, su un singolo loop privo di allocazione dinamica della memoria e strutture intermedie: http://haskell.cs.yale.edu/?post_type=publication&p=72


6

Le specie combinatorie di Joyal, le "costruzioni ammissibili" di Sedgwick / Falojet delle combinazioni analitiche e le specie Haskell di Yorgey sono tutte buone.

Anche Power Series Power Serious di McIlroy di UNIX diff fame è un must, così come il capitolo sulla corecursion in The Haskell Road to Logic Maths and Programming.

Le opere storiche di Buchi a cura di Saunders MacLane e Chomsky / Schützenberger creano connessioni tra serie di potenze, algebre, alberi e automi a stati finiti. Il metodo Matrix di trasferimento descritto in Stanley mostra come calcolare le funzioni di generazione da automi ponderati.

Sto ancora cercando il modo migliore per tradurre in modo efficiente tra domini (GF, automi ponderati, algebra, albero, ricorsione). In questo momento sto sborsando SymPy poiché non esiste ancora un buon pacchetto simbolico Haskell.

Personalmente, ho preso il grafico dell'iterazione di un'endofuction, quindi ho calcolato un set minimo dominante per ottenere un limite esatto di ricerca in black box, http://oeis.org/A186202 Non sono sicuro di quali tipi di complessità si stia cercando, ma quella tecnica è molto potente nell'esaminare qualsiasi endofuction su un set finito.

- Risposta originale del 2 ottobre 14 alle 15:37

Dai un'occhiata alla tesi di Brent Yorgey che segue il suo documento che hai citato. http://www.cis.upenn.edu/%7Ebyorgey/hosted/thesis.pdf

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.