0

我想知道哪个协程库适合实现以下算法,它是符号表达式的交换模式加工问题的简化模型(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只有一个适合这个吗?C++20 会给我们带来这个功能吗?clang 已经可以做到这一点了吗?

4

0 回答 0