可以将有向图分解为列表吗?

Possible to decompose a directed-graph into a list?

这更像是一个理论问题,但是对于 DAG 是否可以将其压缩为一个操作列表?或者这是一个数据结构,不能按照类似这样的顺序分解成一个平面列表:

STEPS = [
    filter A to country = 'US',
    (join A to B on A.id=B.id) AS c,
    filter C to...
]

是否可以构建一个不丢失信息就无法分解的DAG?

是的,有向无环图 (DAG) 可以压缩成 有序 操作列表,if ,其实DAG代表的是数据流经操作。即赋值语句和函数调用的有序列表可以表示为DAG,反之亦然。

上述示例的 DAG 可能看起来像

+-----+     +-------------+
|     |  A  |   filter I1 | A'
|  A  |-----|1  to country|---+                    
|     |     |       ='US' |   |                                           
+-----+     +-------------+   |  +--------------+   +-----------+   +----------+
                              +--|1  join I1 to | C |   filter  | C'|   Result |
                                 |   I2 on I1.id|---|1  I1 to...|---|1    = I1 |
                              +--|2      = I2.id|   |           |   |          |
                  +-------+   |  +--------------+   +------- ---+   +----------+
                  |       | B |                                  
                  |   B   |---+
                  |       |
                  +-------+

或者,"list of operations" 可以被认为是嵌套函数调用,从嵌套最深到嵌套最不深进行评估。例如,

Result = Fn3( Fn2( Fn1(A), B ) ).

DAG是一样的,这里重画了,没有显示中间变量,简化了函数名。

+-----+     +-------------+
|     |     |             |
|  A  |-----|1    Fn1     |---+                    
|     |     |             |   |                                        
+-----+     +-------------+   |  +--------------+   +-----------+   +----------+
                              +--|1             |   |           |   |          |
                                 |      Fn2     |---|1   Fn3    |---|1  Result |
                              +--|2             |   |           |   |          |
                  +-------+   |  +--------------+   +------- ---+   +----------+
                  |       |   |                                  
                  |   B   |---+
                  |       |
                  +-------+

我不知道在从 DAG 分解到 "list of operations" 时信息会丢失的任何情况。两种形式是等价的


如何构造 DAG 来表示操作列表的实际示例可以在 IEC 61131-3:2013 中找到,其中 "specifies syntax and semantics of programming languages for programmable controllers..." 该标准将 DAG 称为网络,定义为 "a maximal set of interconnected graphic elements"(在部分有序集的上下文中)并提出评估规则,包括 "No element of a network shall be evaluated until the states of all of its inputs have been evaluated." 该规则为操作顺序提供基础。