Какая библиотека сопрограмм для этого алгоритма сопоставления?

Я хотел бы знать, какая библиотека сопрограмм подходит для реализации следующего алгоритма, который представляет собой упрощенную модель проблемы коммутационная обработка из символические выражения (должно быть решено в 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 сделать это уже?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector