Logic 自反和非自反传递闭包

Logic 自反和非自反传递闭包,logic,alloy,Logic,Alloy,Alloy中的自反的和非自反传递闭包是什么?它们在Alloy中有什么区别 谢谢,非自反传递闭包操作符是^foo。^bar是foo关于bar的非自反传递闭包。这将返回通过将.bar应用到foo一次或多次可以生成的所有内容集。例如,foo.^bar等于以下表达式的并集: foo.bar foo.bar.bar foo.bar.bar.bar foo.bar.bar.bar.bar ... foo foo.bar foo.bar.ba

Alloy中的自反的非自反传递闭包是什么?它们在Alloy中有什么区别


谢谢,

非自反传递闭包操作符是
^
foo。^bar
foo
关于
bar
非自反传递闭包。这将返回通过将
.bar
应用到
foo
一次或多次可以生成的所有内容集。例如,
foo.^bar
等于以下表达式的并集:

    foo.bar
    foo.bar.bar
    foo.bar.bar.bar
    foo.bar.bar.bar.bar 
    ...
    foo
    foo.bar
    foo.bar.bar
    foo.bar.bar.bar
    ...
这个列表是无限的

自反传递闭包运算符是
*
foo.*bar
foo
关于
bar
自反传递闭包。这将返回通过将
.bar
应用到
foo
零次或多次可以生成的所有内容集。例如,
foo.*bar
等于以下表达式的并集:

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

这个列表也是无限的。这相当于
foo+foo.^bar

传递闭包(
^
)和
自反传递闭包(
*
)都是一元运算符,只能应用于二元关系的操作数

二元关系的传递闭包
bar
是定义为

^bar = bar + bar.bar + bar.bar.bar + ...
*bar = iden + ^bar
二元关系的自反传递闭包
bar
是定义为

^bar = bar + bar.bar + bar.bar.bar + ...
*bar = iden + ^bar
其中,
iden
是标识二进制关系

这两个可传递闭包运算符最常见的使用模式是前面有关系联接时,如:
foo.^bar
foo.*bar
提供的示例中所示。值得注意的是,
^
*
中没有魔法:点运算符(
)是相同的旧关系联接,
^
*
运算符是上述定义的闭包运算符。因此,如果您计算出这些方程,您将得到与已提供的
foo.^bar
foo.*bar
相同的表达式:

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 + ...