Logic 自反和非自反传递闭包
Alloy中的自反的和非自反传递闭包是什么?它们在Alloy中有什么区别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
谢谢,非自反传递闭包操作符是
^
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 + ...