2013-04-10 2 views
13

Поддерживает ли boost или любую другую общую библиотеку C++ semiring или monoid абстракции (например, класс шаблона)?Есть ли стандартная абстракция для полукольцев или моноидов в C++?

У меня есть некоторые алгоритмы, которые я хотел бы выразить в терминах этих абстрактных структур, но до сих пор я ничего не встречал. Я могу написать свой собственный, но в идеале это будет в библиотеке, которую я уже использую, например, boost.

Спасибо!

+1

Ничего себе, я думал, что никогда не услышу, чтобы эти слова касались реальных проблем, предполагая, что они были защищены от пыток студентов в колледжах. +1 для этого :) – dasblinkenlight

+0

@dasblinkenlight Один из алгоритмов, которые я хочу реализовать, написан в книге алгоритмов Cormen et al в терминах полукольца и моноиды :) –

+0

А, эти ребята ... Их талант к преуменьшению можно увидеть, называя их книга «Введение в алгоритмы», а не «Все, что вам нужно знать о алгоритмах» :) :) :) – dasblinkenlight

ответ

9

SGI STL имеет MonoidOperation концепция. Например, функция power реализована для MonoidOperation.

Boost.Graph библиотека также определяет Monoid concept.

В дополнение к already suggestedElements of Programming вы можете посмотреть Notes on Programming Александра Степанова (один из авторов ПВЗ). Примечания являются свободно доступными и имеют некоторое перекрытие с EoP книга.

Есть разница в стиле между НКПОМ и Notes - НКП очень лаконичен, как по математике учебник, но Notes более «неформальная» - есть некоторые небольшие рассказы и т.д.

К Кстати, оба имеют некоторое обсуждение вышеупомянутых мощность функция осуществление.

P.S. Есть большие переговоры Александра Степанова:

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

7

Насколько я знаю, стандартная библиотека C++ не имеет абстракций вокруг этих структур. Однако Алекс Степанов, изобретатель STL, написал книгу под названием «Elements of Programming», в которой он пишет множество полезных функций, которые работают на моноидах, группах, бинарных операциях, унарных функциях и т. Д. Это не обязательно стандарт, но это может быть хорошей отправной точкой для дальнейших исследований.

Надеюсь, это поможет!

3

Boost.Operators обеспечивает удобный способ определения групп арифметических операторов для класса.

Предустановленные концепции (только для синтаксиса только для утки) включают кольцо, упорядоченное кольцо, евклидово кольцо, упорядоченное евклидово кольцо, поле и упорядоченное поле. Вы должны иметь возможность определять свои собственные классы для полукольца или моноида, исходя из соответствующих групп классов операторов.

+0

Это не понятия, а помощники для «групп арифметических операторов», как вы сказали. Концепция будет включать такие вещи, как Additive_Identity, Multiplicative_Identity, Additive_Inverse, Multiplicative_Inverse и т. Д. –

+0

@EvgenyPanasyuk tnx, действительно, похоже, что boost.operators не предоставляют идентификационные элементы. AFAICS, для них должно быть возможно использовать тот же «трюк» для «друга». Например. let 'template class MultId: field {};' и определить смешанные версии 'operator *', чтобы отразить коммутативность. – TemplateRex

+0

Концепции ориентированы на интерфейс, т. Е. Какой синтаксис является законным и какой он имеет семантику. Это позволяет выполнять алгоритмы (и другие вещи), абстрагированные от конкретных моделей. Но Boost.Operators - это просто помощники, которые помогают реализовать конкретные модели. –

Смежные вопросы