2017-04-10 435 views

回答

2

非自反传递闭包操作者是^foo.^bar是关于bar非自反传递封闭foo。通过将.bar应用于foo一次或多次,这将返回您可以生成的所有东西的集合。例如,foo.^bar等于下列用语的工会:

foo.bar 
    foo.bar.bar 
    foo.bar.bar.bar 
    foo.bar.bar.bar.bar 
    ... 

这份名单是无限的。

反身传递封闭运营商是*foo.*bar自反传递封闭foo相对于bar。这将返回您可以生成的所有东西的集合,将.bar应用于foo零次或多次。例如,foo.*bar等于下列用语的工会:

foo 
    foo.bar 
    foo.bar.bar 
    foo.bar.bar.bar 
    ... 

这份名单也是无限的。这相当于foo + foo.^bar

0

两个transitive closure^)和reflexive transitive closure*)是一元运算符其可仅被应用到操作数是二元关系

一个二元关系 bar

传递闭包是被定义为一个二元关系bar

^bar = bar + bar.bar + bar.bar.bar + ... 

自反传递闭包一个二元关系被定义为

*bar = iden + ^bar 

一个二元关系,其中iden是单位二元关系。

两个传递闭包操作符的最常见的使用模式是它在前面是关系连接时,如@LEJ提供的示例中的那样:foo.^barfoo.*bar。值得注意的是,在.^.*中没有任何魔术:点运算符(.)是旧的关系连接,并且^*运算符是上面定义的闭包运算符。所以,如果你的工作方程式,你将在同一表达式为到达和foo.^barfoo.*bar已经@LEJ提供:

foo.^bar = foo.(^bar) = foo.(bar + bar.bar + ...) = foo.bar + foo.bar.bar + ... 
foo.*bar = foo.(*bar) = foo.(iden + bar + bar.bar + ...) = foo + foo.bar + foo.bar.bar + ...