【发布时间】:2015-05-11 01:01:16
【问题描述】:
我有一个合金模型
sig BinaryTree{
root : Node,
nodes: set Node,
left, right : Node -> Node
}
现在,我在它上面定义了一个谓词,它是有效的语法
pred Connected[t: BinaryTree, l:Node -> Node, r: Node -> Node]
{
all n: t.nodes | n in t.root.*(l+r)
}
但是,我不明白为什么它是有效的,因为 * 的行为,自反传递闭包表示对于
foo.*bar
您可以通过反复将 bar 应用于 foo 来获得所有可能获得的集合。因此,foo、foo.bar、foo.bar.bar 等。
但是,您得到的始终是“bar”的结果,而不是不同的结果。应用闭包的结果,必须始终是“类型”栏。
在我上面给出的代码示例中,结果应该始终是 (l+r),这意味着一个集合包含类型 (node->node)。
但我应用于 n 的“in”关键字实际上应该应用于一组 (node),而不是 (node->node)。为什么这行得通?为什么它隐式地将 (node->node) 转换为一组 (nodes),使得 n: node 正在针对该集合进行评估以包含在其中?
【问题讨论】: