2013-04-10 12 views
13

Il boost o qualsiasi altra libreria C++ comune fornisce le astrazioni semiring o monoid (come una classe template)?Esiste un'astrazione standard per semiraggi o monoidi in C++?

Ho alcuni algoritmi che vorrei esprimere in termini di queste strutture astratte, ma finora non ho trovato nulla. Posso scrivere il mio, ma idealmente questi sarebbero in una libreria che sto già usando come boost.

Grazie!

+1

Wow, ho pensato che non avrei mai sentito queste parole applicate ai problemi della vita reale, supponendo che fossero riservati per torturare gli studenti nei college. +1 per quello :) – dasblinkenlight

+0

@dasblinkenlight Uno degli algoritmi che voglio implementare è scritto nel libro Algorithms di Cormen e Al in termini di semirings e monoids :) –

+0

Ah, questi ragazzi ... Il loro talento per understatement è visibile nel nominare i loro prenota "Introduzione agli algoritmi" piuttosto che "Tutti la maggior parte di voi avrebbe mai bisogno di sapere sugli algoritmi" :) :) :) – dasblinkenlight

risposta

9

SGI STL ha il concetto di MonoidOperation. Ad esempio, la funzione power è implementata per Monoidoperation.

Boost.Graph libreria definisce anche Monoid concept.

Oltre a already suggestedElements of Programming si può guardare a Notes on Programming da Alexander Stepanov (uno degli autori di EoP). Note sono liberamente disponibili e si sovrappongono con il libro EoP. ci alcune piccole storie, ecc

A -

Non ci sono differenze di stile tra EoP e Note - EoP è molto stringato come la matematica libro di testo, ma Note sono più "informale" modo, entrambi hanno qualche discussione di riferimento sopra potenza implementazione della funzione.

P.S. ci sono grandi interventi di Alexander Stepanov:

P.P.S. Collected Papers of Alexander A. Stepanov

7

Per quanto ne so, la libreria standard C++ non ha alcuna astrazione attorno a queste strutture. Tuttavia, Alex Stepanov, inventore della STL, ha scritto un libro dal titolo Elements of Programming in cui scrive una varietà di utili funzioni che operano su monoidi, gruppi, operatori binari, funzioni unarie, ecc. Non è necessariamente uno standard, ma potrebbe essere un buon punto di partenza per ulteriori esplorazioni.

Spero che questo aiuti!

3

Boost.Operators fornisce un modo conveniente per definire gruppi di operatori aritmetici per una classe.

I concetti predefiniti (solo sintassi di digitazione anatra) includono anello, anello ordinato, anello euclideo, anello euclideo ordinato, campo e campo ordinato. Dovresti essere in grado di definire le tue classi per semi-ring o monoid derivando dai gruppi appropriati di classi di operatori.

+0

Questi non sono concetti, ma piuttosto aiutanti per "gruppi di operatori aritmetici" come hai detto tu. Il concetto includerebbe cose come Additive_Identity, Multiplicative_Identity, Additive_Inverse, Multiplicative_Inverse, ecc. –

+0

@EvgenyPanasyuk tnx, sembra infatti che boost.operators non fornisca elementi di identità. AFAICS, dovrebbe essere possibile utilizzare lo stesso trucco di iniezione 'amico' per loro. Per esempio. let 'modello Classe MultId: campo {};' e definiamo le versioni miste di 'operator *' per riflettere la commutatività. – TemplateRex

+0

I concetti sono focalizzati sull'interfaccia, ovvero quale sintassi è legale e quale semantica ha. Ciò consente di eseguire l'implementazione di algoritmi (e altre cose) astratti da modelli concreti. Ma Boost.Operators sono solo aiutanti che aiutano l'implementazione di modelli concreti. –