我想知道哪个协程库适合实现以下算法,这是符号表达式的交换模式加工问题的简化模型在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可以这样做吗?