3

假设我在合金 4.2 中有以下签名声明:

sig Target {}

abstract sig A {
    parent: lone A,
    r: some Target
}

sig B extends A {}
sig C extends A {}

运行时,生成的实例将具有从 everyB到 someTarget和 fromC到 some的箭头Target

我怎么能只隐藏箭头B
起初,我尝试了以下方法:

abstract sig A {
    parent: lone A
}

sig B extends A {
    r: some Target
}

sig C extends A {
    r: some Target
}

这将使我能够控制rin B,但是在编写属性时会引入很多歧义。我想让这些尽可能简单。例如:

all a: A | a.r = parent.a.r

上面说a'sTargetsa'children's的集合Targets
对于后面的声明,我将不得不将其重写为

all b: B | b.r = parent.b.((B <: r) + (C <: r))
all c: C | c.r = parent.c.((B <: r) + (C <: r))

这是不可取的。

是否有任何解决方法可以拥有一个通用字段,但仍然可以控制显示的箭头?

4

1 回答 1

5

您可以定义一个与 (C <: r) 完全对应的函数:

fun C_r : A -> Target {
    (C <: r)
}

在 Alloy 可视化器中,您将可以访问关系 $C_r。然后,您可以关闭关系 r 的“显示为弧”,但仍然可以看到 $C_r。这应该隐藏属于 (B <: r) 的边集。

于 2013-04-06T15:59:43.947 回答