Я хотел бы знать, какая библиотека сопрограмм подходит для реализации следующего алгоритма, который представляет собой упрощенную модель проблемы коммутационная обработка из символические выражения (должно быть решено в C ++ с открытым исходным кодом система компьютерной алгебры). В целом, правильно ли предполагать, что требуются стеки сопрограммы? Есть ли альтернативы C ++ вне сопрограмм?
Даны два дерева (или DAG) произвольной длины, содержащие три типа узлов: черный / красный с произвольным числом дочерних элементов; чёрные узлы имеют своих детей в фиксированном порядке, в отличие от того, что чёрные узлы у красных узлов не имеют значения; и уходит. Алгоритм определения соответствия обоих деревьев сильно усложняется коммутативным характером красных узлов и тем, что нет канонического порядка, поэтому вы не можете просто отсортировать все дочерние узлы. Пример:
Source Pattern
red1--->leaf1, leaf2 Red1--->Leaf1, Leaf2
| |
red2--->leaf1, leaf2 Red2--->Leaf2, Leaf1
Стандартный (некоммутативный) случай легко реализуется с помощью иерархии классов и рекурсивного вызова виртуальной функции-члена match()
это соответствует самому узлу, а затем каждому из дочерних элементов. Вот, leaf1
а также Leaf2
найдены разные, рекурсивный вызов возвращает False
, Однако, если красные являются коммутативными, то на красном узле алгоритм 1. должен пройти через все перестановки своих узлов, и 2., если вызов красного match()
успешно завершает цикл перестановки, потому что может произойти сбой вызывающего абонента и требуется другое совпадение. Недостаточно хранить состояние в вызывающей стороне, потому что сам вызываемый объект мог бы сам вызвать match()
и это тоже нужно перезапустить, иначе возможное решение будет упущено.
На функциональном языке yield
в рекурсивном вызове сделает свое дело. Например, пакет matchpy имеет реализацию Python. Это похоже на задачу сопрограммы, но какую библиотеку вы бы использовали? Является boost::coroutine
только один подходит для этого? С ++ 20 принесет нам эту функциональность? Может ли Clang сделать это уже?
Задача ещё не решена.
Других решений пока нет …