显示派生关系

时间:2015-11-11 11:42:47

标签: alloy

考虑一个简单的图形结构G,它在一组r1个节点上定义了几个关系(r2X)。我想谈谈我的图表是否具有某个名为wf_G的属性。此属性是通过从r3r1派生进一步的关系r2,然后约束r3来定义的。

sig X {}

sig G { r1, r2 : X -> X }

pred wf_G [g : G] {
  let r3 = (g.r1 - iden) . (g.r2 - iden) . (g.r2 - iden) |
  one r3
}

run wf_G for 1 G, 2 X

(我应该说:这是一个很好的玩具示例。)

问题是,r3未在展示台中显示,因为它是let定义的关系。我希望它在Visualizer中显示,否则我将不得不在我的头脑中手动派生它。有没有办法(例如)注释let语句来指示Visualizer包含派生关系,例如喜欢以下几个?

let {show} r3 = (g.r1 - iden) . (g.r2 - iden) . (g.r2 - iden) |

我目前的解决方法是在r3的签名中加入G,然后根据r3r1的定义约束r2 。也就是说,我一直在写:

sig X {}

sig G { r1, r2, r3 : X -> X }

pred wf_G [g : G] {
  (g.r3) = (g.r1 - iden) . (g.r2 - iden) . (g.r2 - iden) 
  && 
  one (g.r3)
}

run wf_G for 1 G, 2 X

这不像我的原始代码那么吸引人,因为

  • 它将原始关系r1r2与派生关系r3

  • 混为一谈
  • 允许r3最初为任何关系,然后将其约束为特定关系(尽管我没有运行时序测试来检查是否是这种情况)感觉计算效率较低)。

编辑。 Daniel建议将r3编码为0-ary函数。我不知道如何做到这一点,但我可以看到1-ary函数如何工作:

sig X {}

sig G { r1, r2 : X -> X }

fun r3 [g : G] : X -> X {
  (g.r1 - iden) . (g.r2 - iden) . (g.r2 - iden)
}

pred wf_G [g : G] {
  one r3[g]
}

run wf_G for 1 G, 2 X

如果r3被编码为这样的函数,是否可以在可视化器中显示它?这肯定会非常令人满意地解决我的问题。

1 个答案:

答案 0 :(得分:0)

如果声明一个无参数的函数,它将被视为一个skolem常量,并且在可视化器中可用作在标准自定义下显示的关系。可能适合你吗?