考虑一个简单的图形结构G
,它在一组r1
个节点上定义了几个关系(r2
和X
)。我想谈谈我的图表是否具有某个名为wf_G
的属性。此属性是通过从r3
和r1
派生进一步的关系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
,然后根据r3
和r1
的定义约束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
这不像我的原始代码那么吸引人,因为
它将原始关系r1
和r2
与派生关系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
被编码为这样的函数,是否可以在可视化器中显示它?这肯定会非常令人满意地解决我的问题。
答案 0 :(得分:0)
如果声明一个无参数的函数,它将被视为一个skolem常量,并且在可视化器中可用作在标准自定义下显示的关系。可能适合你吗?